perf: 监督者将路径清单经临时文件传给子进程,免子进程重扫目录

This commit is contained in:
2026-10-11 12:22:03 +00:00
parent 393618f4fe
commit 5a7525ea88
4 changed files with 60 additions and 22 deletions
Generated
+19 -19
View File
@@ -1160,7 +1160,7 @@ dependencies = [
[[package]] [[package]]
name = "oxide_builtins" name = "oxide_builtins"
version = "0.15.2" version = "0.15.3"
dependencies = [ dependencies = [
"chrono", "chrono",
"fast-float", "fast-float",
@@ -1185,7 +1185,7 @@ dependencies = [
[[package]] [[package]]
name = "oxide_bytecode" name = "oxide_bytecode"
version = "0.15.2" version = "0.15.3"
dependencies = [ dependencies = [
"num-bigint", "num-bigint",
"oxide_log", "oxide_log",
@@ -1193,7 +1193,7 @@ dependencies = [
[[package]] [[package]]
name = "oxide_cfg" name = "oxide_cfg"
version = "0.15.2" version = "0.15.3"
dependencies = [ dependencies = [
"oxide_bytecode", "oxide_bytecode",
"oxide_emit", "oxide_emit",
@@ -1204,7 +1204,7 @@ dependencies = [
[[package]] [[package]]
name = "oxide_cli" name = "oxide_cli"
version = "0.15.2" version = "0.15.3"
dependencies = [ dependencies = [
"ansi_term", "ansi_term",
"bumpalo", "bumpalo",
@@ -1227,7 +1227,7 @@ dependencies = [
[[package]] [[package]]
name = "oxide_code_cache" name = "oxide_code_cache"
version = "0.15.2" version = "0.15.3"
dependencies = [ dependencies = [
"lru", "lru",
"oxide_bytecode", "oxide_bytecode",
@@ -1236,7 +1236,7 @@ dependencies = [
[[package]] [[package]]
name = "oxide_compiler" name = "oxide_compiler"
version = "0.15.2" version = "0.15.3"
dependencies = [ dependencies = [
"oxide_bytecode", "oxide_bytecode",
"oxide_cfg", "oxide_cfg",
@@ -1256,7 +1256,7 @@ dependencies = [
[[package]] [[package]]
name = "oxide_dce" name = "oxide_dce"
version = "0.15.2" version = "0.15.3"
dependencies = [ dependencies = [
"oxide_bytecode", "oxide_bytecode",
"oxide_cfg", "oxide_cfg",
@@ -1270,7 +1270,7 @@ dependencies = [
[[package]] [[package]]
name = "oxide_emit" name = "oxide_emit"
version = "0.15.2" version = "0.15.3"
dependencies = [ dependencies = [
"num-bigint", "num-bigint",
"oxc_allocator", "oxc_allocator",
@@ -1285,7 +1285,7 @@ dependencies = [
[[package]] [[package]]
name = "oxide_engine" name = "oxide_engine"
version = "0.15.2" version = "0.15.3"
dependencies = [ dependencies = [
"oxide_bytecode", "oxide_bytecode",
"oxide_compiler", "oxide_compiler",
@@ -1297,7 +1297,7 @@ dependencies = [
[[package]] [[package]]
name = "oxide_ir" name = "oxide_ir"
version = "0.15.2" version = "0.15.3"
dependencies = [ dependencies = [
"oxide_bytecode", "oxide_bytecode",
"oxide_log", "oxide_log",
@@ -1306,7 +1306,7 @@ dependencies = [
[[package]] [[package]]
name = "oxide_kernel" name = "oxide_kernel"
version = "0.15.2" version = "0.15.3"
dependencies = [ dependencies = [
"bumpalo", "bumpalo",
"dashmap", "dashmap",
@@ -1320,7 +1320,7 @@ dependencies = [
[[package]] [[package]]
name = "oxide_liveness" name = "oxide_liveness"
version = "0.15.2" version = "0.15.3"
dependencies = [ dependencies = [
"oxide_bytecode", "oxide_bytecode",
"oxide_cfg", "oxide_cfg",
@@ -1332,7 +1332,7 @@ dependencies = [
[[package]] [[package]]
name = "oxide_log" name = "oxide_log"
version = "0.15.2" version = "0.15.3"
dependencies = [ dependencies = [
"tracing", "tracing",
"tracing-appender", "tracing-appender",
@@ -1341,7 +1341,7 @@ dependencies = [
[[package]] [[package]]
name = "oxide_parser" name = "oxide_parser"
version = "0.15.2" version = "0.15.3"
dependencies = [ dependencies = [
"oxc_allocator", "oxc_allocator",
"oxc_ast", "oxc_ast",
@@ -1356,7 +1356,7 @@ dependencies = [
[[package]] [[package]]
name = "oxide_regalloc" name = "oxide_regalloc"
version = "0.15.2" version = "0.15.3"
dependencies = [ dependencies = [
"oxide_bytecode", "oxide_bytecode",
"oxide_cfg", "oxide_cfg",
@@ -1372,7 +1372,7 @@ dependencies = [
[[package]] [[package]]
name = "oxide_runtime_api" name = "oxide_runtime_api"
version = "0.15.2" version = "0.15.3"
dependencies = [ dependencies = [
"num-bigint", "num-bigint",
"num-traits", "num-traits",
@@ -1385,7 +1385,7 @@ dependencies = [
[[package]] [[package]]
name = "oxide_test262" name = "oxide_test262"
version = "0.15.2" version = "0.15.3"
dependencies = [ dependencies = [
"oxide_bytecode", "oxide_bytecode",
"oxide_compiler", "oxide_compiler",
@@ -1403,7 +1403,7 @@ dependencies = [
[[package]] [[package]]
name = "oxide_types" name = "oxide_types"
version = "0.15.2" version = "0.15.3"
dependencies = [ dependencies = [
"bumpalo", "bumpalo",
"dashmap", "dashmap",
@@ -1416,7 +1416,7 @@ dependencies = [
[[package]] [[package]]
name = "oxide_vm" name = "oxide_vm"
version = "0.15.2" version = "0.15.3"
dependencies = [ dependencies = [
"bumpalo", "bumpalo",
"chrono", "chrono",
+1 -1
View File
@@ -23,7 +23,7 @@ members = [
] ]
[workspace.package] [workspace.package]
version = "0.15.2" version = "0.15.3"
edition = "2021" edition = "2021"
license = "MIT" license = "MIT"
rust-version = "1.80" rust-version = "1.80"
+19 -1
View File
@@ -141,7 +141,25 @@ fn run_tests() -> bool {
test262_info!("no-skip mode enabled"); test262_info!("no-skip mode enabled");
eprintln!("no-skip mode: capability filters disabled; unsupported results count as failures"); eprintln!("no-skip mode: capability filters disabled; unsupported results count as failures");
} }
let paths = discover_tests(&test262_root); // 监督模式:监督者把全量路径清单(每行一路径,与父扫描同序)经
// OXIDE_TEST262_PATHS_FILE 传下来,子进程读文件代替全量重扫目录。
// 文件缺失或不可读时显式报错退出,不静默回退重扫——回退会让
// 父扫描与子重扫之间的树变化造成下标错位静默复活。
let paths = match std::env::var_os("OXIDE_TEST262_PATHS_FILE") {
Some(list_path) => {
let list_path = PathBuf::from(list_path);
let content = match std::fs::read_to_string(&list_path) {
Ok(content) => content,
Err(err) => {
test262_error!("paths file unreadable: {}: {err}", list_path.display());
eprintln!("paths file unreadable: {}: {err}", list_path.display());
std::process::exit(1);
}
};
content.lines().map(PathBuf::from).collect()
}
None => discover_tests(&test262_root),
};
test262_info!("found {} test files", paths.len()); test262_info!("found {} test files", paths.len());
eprintln!("found {} test files", paths.len()); eprintln!("found {} test files", paths.len());
+21 -1
View File
@@ -91,10 +91,15 @@ fn record_timeout_or_crash(stats: &mut RunStats, no_skip: bool, index: usize, el
/// 子进程被杀死、按路径报告肇事者,并由全新子进程从肇事者之后续跑;子进程 /// 子进程被杀死、按路径报告肇事者,并由全新子进程从肇事者之后续跑;子进程
/// 在测试中途崩溃也经同路径恢复,恢复基于最后完成下标,无漏项。子进程死亡后 /// 在测试中途崩溃也经同路径恢复,恢复基于最后完成下标,无漏项。子进程死亡后
/// 读取旁路失败行并入 fail_records。超时/崩溃默认计为 skip,`--no-skip` 下计为失败。 /// 读取旁路失败行并入 fail_records。超时/崩溃默认计为 skip,`--no-skip` 下计为失败。
///
/// # 注意事项
/// - `paths_file` 是父进程写出的全量路径清单文件(每行一路径,与父扫描同序),
/// 经 `OXIDE_TEST262_PATHS_FILE` 环境变量传给子进程,子进程读文件代替全量重扫
/// 目录;文件在窗口内子进程多次重启间只读共享,不得按 spawn 删除。
#[expect(clippy::too_many_arguments)] #[expect(clippy::too_many_arguments)]
fn supervise_window( fn supervise_window(
exe: &Path, args: &[String], no_skip: bool, wstart: usize, wend: usize, timeout: Duration, startup_grace: Duration, exe: &Path, args: &[String], no_skip: bool, wstart: usize, wend: usize, timeout: Duration, startup_grace: Duration,
paths: &[PathBuf], window_id: usize, paths: &[PathBuf], paths_file: &Path, window_id: usize,
) -> RunStats { ) -> RunStats {
let mut stats = RunStats::default(); let mut stats = RunStats::default();
let mut cur = wstart; let mut cur = wstart;
@@ -144,6 +149,7 @@ fn supervise_window(
.env("OXIDE_TEST262_WORKERS", "1") .env("OXIDE_TEST262_WORKERS", "1")
.env("OXIDE_TEST262_HEARTBEAT", &hb_path) .env("OXIDE_TEST262_HEARTBEAT", &hb_path)
.env("OXIDE_TEST262_PC_WATCH", &pc_path) .env("OXIDE_TEST262_PC_WATCH", &pc_path)
.env("OXIDE_TEST262_PATHS_FILE", paths_file)
.env("OXIDE_TEST262_CHILD_CHUNK", "1") .env("OXIDE_TEST262_CHILD_CHUNK", "1")
.env("OXIDE_TEST262_ALLOW_FAIL_EXIT", "1") .env("OXIDE_TEST262_ALLOW_FAIL_EXIT", "1")
.env_remove("OXIDE_TEST262_CHUNK_SIZE") .env_remove("OXIDE_TEST262_CHUNK_SIZE")
@@ -281,6 +287,15 @@ pub(crate) fn run_supervised(
} }
}; };
// 路径清单文件:派生窗口前写一次(每行一路径,与父扫描同序),跨窗口只读
// 共享;子进程读文件代替全量重扫目录。运行结束删除,防临时目录残留。
let paths_file = std::env::temp_dir().join(format!("oxide_t262_paths_{}.txt", std::process::id()));
let list = paths.iter().map(|p| p.to_string_lossy()).collect::<Vec<_>>().join("\n");
if let Err(err) = std::fs::write(&paths_file, list) {
eprintln!("failed to write paths file {}: {err}", paths_file.display());
return false;
}
let window = std::env::var("OXIDE_TEST262_WINDOW") let window = std::env::var("OXIDE_TEST262_WINDOW")
.ok() .ok()
.and_then(|s| s.parse::<usize>().ok()) .and_then(|s| s.parse::<usize>().ok())
@@ -329,6 +344,7 @@ pub(crate) fn run_supervised(
let next = &next; let next = &next;
let windows = &windows; let windows = &windows;
let exe = &exe; let exe = &exe;
let paths_file = &paths_file;
let partials: Vec<RunStats> = std::thread::scope(|scope| { let partials: Vec<RunStats> = std::thread::scope(|scope| {
let handles: Vec<_> = (0..supervisors) let handles: Vec<_> = (0..supervisors)
@@ -350,6 +366,7 @@ pub(crate) fn run_supervised(
timeout, timeout,
startup_grace, startup_grace,
paths, paths,
paths_file,
window_id, window_id,
); );
stats.merge(window_stats); stats.merge(window_stats);
@@ -369,6 +386,9 @@ pub(crate) fn run_supervised(
stats.merge(partial_stats); stats.merge(partial_stats);
} }
// 全部窗口结束、子进程已读完清单,删除路径清单文件防临时目录残留。
let _ = std::fs::remove_file(paths_file);
let total = stats.pass + stats.fail + stats.skip; let total = stats.pass + stats.fail + stats.skip;
println!(); println!();
println!("═══════════════════════════════════════"); println!("═══════════════════════════════════════");