fix persisted unit failure identity
This commit is contained in:
@@ -398,7 +398,9 @@ header free-functions are `inline`. The wasm backend exposes only declarations
|
|||||||
and the resolved unit path; otherwise nested relative targets resolve from
|
and the resolved unit path; otherwise nested relative targets resolve from
|
||||||
the caller after a repeated parent invocation. Resolved component paths are
|
the caller after a repeated parent invocation. Resolved component paths are
|
||||||
canonical absolute paths: equivalent spellings containing `.` or `..` must
|
canonical absolute paths: equivalent spellings containing `.` or `..` must
|
||||||
share one source, compile, artifact, and module-cache identity.
|
share one source, compile, artifact, and module-cache identity. The compiler
|
||||||
|
independently enforces the same canonical identity, and persisted failures
|
||||||
|
are reused only when their recorded source path matches the current request.
|
||||||
|
|
||||||
- **WebSocket end-to-end**: a headless client performs a raw WS handshake to
|
- **WebSocket end-to-end**: a headless client performs a raw WS handshake to
|
||||||
`:HTTP_PORT` with path `/site/tests/websockets.ws.uce` (self-resolving
|
`:HTTP_PORT` with path `/site/tests/websockets.ws.uce` (self-resolving
|
||||||
|
|||||||
@@ -17,6 +17,7 @@ RENDER(Request& context)
|
|||||||
|
|
||||||
auto unit_paths = units_list();
|
auto unit_paths = units_list();
|
||||||
DValue info = unit_info("call_helpers.uce");
|
DValue info = unit_info("call_helpers.uce");
|
||||||
|
DValue relative_info = unit_info("components/../relative-child.uce");
|
||||||
|
|
||||||
ob_start();
|
ob_start();
|
||||||
unit_call("call_helpers.uce", "emit_marker");
|
unit_call("call_helpers.uce", "emit_marker");
|
||||||
@@ -30,10 +31,11 @@ RENDER(Request& context)
|
|||||||
|
|
||||||
check("units_list()", unit_paths.size() > 0, "count=" + std::to_string(unit_paths.size()));
|
check("units_list()", unit_paths.size() > 0, "count=" + std::to_string(unit_paths.size()));
|
||||||
check("unit_info()", info["path"].to_string() != "", json_encode(info));
|
check("unit_info()", info["path"].to_string() != "", json_encode(info));
|
||||||
|
check("compiler canonicalizes relative unit paths", relative_info["path"].to_string().find("/../") == String::npos && str_ends_with(relative_info["path"].to_string(), "/site/tests/relative-child.uce"), json_encode(relative_info));
|
||||||
check("unit_compile()", unit_compile("call_helpers.uce"), "call_helpers.uce");
|
check("unit_compile()", unit_compile("call_helpers.uce"), "call_helpers.uce");
|
||||||
check("unit_call()", call_output.find("UNIT_CALL_EXPORT_OK") != String::npos, call_output);
|
check("unit_call()", call_output.find("UNIT_CALL_EXPORT_OK") != String::npos, call_output);
|
||||||
check("unit_render()", render_output.find("data-unit-render=\"ok\"") != String::npos, render_output);
|
check("unit_render()", render_output.find("data-unit-render=\"ok\"") != String::npos, render_output);
|
||||||
|
|
||||||
site_tests_summary(passed, failed, skipped, "The local fixture call_helpers.uce keeps these checks deterministic and self-contained within site/tests.");
|
site_tests_summary(passed, failed, skipped, "The local fixture call_helpers.uce keeps these checks deterministic and self-contained within site/tests.");
|
||||||
site_tests_page_end();
|
site_tests_page_end();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -38,6 +38,7 @@ struct SharedUnitFilesystemState
|
|||||||
String compile_output_content;
|
String compile_output_content;
|
||||||
String metadata_build_token;
|
String metadata_build_token;
|
||||||
String metadata_input_signature;
|
String metadata_input_signature;
|
||||||
|
String metadata_source_path;
|
||||||
String current_input_signature;
|
String current_input_signature;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -222,6 +223,7 @@ String compiler_unit_metadata_text(Request* context, SharedUnit* su, String inpu
|
|||||||
return(
|
return(
|
||||||
"format=uce-unit-metadata-v1\n"
|
"format=uce-unit-metadata-v1\n"
|
||||||
"unit_abi_version=" + std::to_string(UCE_UNIT_ABI_VERSION) + "\n"
|
"unit_abi_version=" + std::to_string(UCE_UNIT_ABI_VERSION) + "\n"
|
||||||
|
"source_path=" + su->file_name + "\n"
|
||||||
"input_signature=" + input_signature + "\n"
|
"input_signature=" + input_signature + "\n"
|
||||||
"build_token=" + compiler_unit_build_token() + "\n"
|
"build_token=" + compiler_unit_build_token() + "\n"
|
||||||
);
|
);
|
||||||
@@ -275,6 +277,8 @@ bool compiler_failure_retry_deferred(Request* context, SharedUnit* su, const Sha
|
|||||||
return(false);
|
return(false);
|
||||||
if(!state.metadata_exists || !state.metadata_parsed || !state.abi_compatible || !state.input_signature_matches)
|
if(!state.metadata_exists || !state.metadata_parsed || !state.abi_compatible || !state.input_signature_matches)
|
||||||
return(false);
|
return(false);
|
||||||
|
if(state.metadata_source_path == "" || state.metadata_source_path != su->file_name)
|
||||||
|
return(false);
|
||||||
auto required_failure_inputs_time = std::max({
|
auto required_failure_inputs_time = std::max({
|
||||||
state.source_time,
|
state.source_time,
|
||||||
state.setup_template_time,
|
state.setup_template_time,
|
||||||
@@ -374,6 +378,9 @@ String compiler_normalize_unit_path(Request* context, String file_name)
|
|||||||
return("");
|
return("");
|
||||||
if(file_name[0] != '/')
|
if(file_name[0] != '/')
|
||||||
file_name = expand_path(file_name, context->server->config["COMPILER_SYS_PATH"]);
|
file_name = expand_path(file_name, context->server->config["COMPILER_SYS_PATH"]);
|
||||||
|
String canonical = path_real(file_name);
|
||||||
|
if(canonical != "")
|
||||||
|
return(canonical);
|
||||||
return(file_name);
|
return(file_name);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -474,6 +481,9 @@ SharedUnitFilesystemState inspect_shared_unit_filesystem(Request* context, Share
|
|||||||
auto input_it = metadata.find("input_signature");
|
auto input_it = metadata.find("input_signature");
|
||||||
if(input_it != metadata.end())
|
if(input_it != metadata.end())
|
||||||
state.metadata_input_signature = input_it->second;
|
state.metadata_input_signature = input_it->second;
|
||||||
|
auto source_it = metadata.find("source_path");
|
||||||
|
if(source_it != metadata.end())
|
||||||
|
state.metadata_source_path = source_it->second;
|
||||||
auto build_it = metadata.find("build_token");
|
auto build_it = metadata.find("build_token");
|
||||||
if(build_it != metadata.end())
|
if(build_it != metadata.end())
|
||||||
state.metadata_build_token = build_it->second;
|
state.metadata_build_token = build_it->second;
|
||||||
|
|||||||
Reference in New Issue
Block a user