wait for fail server port

This commit is contained in:
2026-04-18 12:10:01 +02:00
parent e7cfc59096
commit cf319c5a72

View File

@ -4,6 +4,8 @@ use strict;
use warnings; use warnings;
use diagnostics; use diagnostics;
use IO::Socket::INET;
use feature 'say'; use feature 'say';
my $remote_root = '/home/lab/smchurla/Documents/failnix'; my $remote_root = '/home/lab/smchurla/Documents/failnix';
@ -75,6 +77,29 @@ sub update_db_config {
say "Updated db.conf for database $db_prefix\_$experiment"; say "Updated db.conf for database $db_prefix\_$experiment";
} }
sub wait_for_port {
my ( $host, $port, $timeout ) = @_;
my $deadline = time + $timeout;
while ( time < $deadline ) {
my $sock = IO::Socket::INET->new(
PeerHost => $host,
PeerPort => $port,
Proto => 'tcp',
Timeout => 1,
);
if ($sock) {
close $sock;
return 1;
}
select undef, undef, undef, 0.1;
}
return 0;
}
sub cpu_count { sub cpu_count {
open( my $handle, "/proc/cpuinfo" ) or die "Can't open cpuinfo: $!\n"; open( my $handle, "/proc/cpuinfo" ) or die "Can't open cpuinfo: $!\n";
my $count = scalar( map /^processor/, <$handle> ); my $count = scalar( map /^processor/, <$handle> );
@ -96,7 +121,23 @@ sub trace {
notify("Tracing $experiment..."); notify("Tracing $experiment...");
system( system(
"$bochs_runner -V $fail_share/vgabios.bin -b $fail_share/BIOS-bochs-latest -1 -f $fail_trace -e $remote_builds_dir/$experiment/system.elf -i $remote_builds_dir/$experiment/system.iso -- -Wf,--start-symbol=fail_start_trace -Wf,--save-symbol=fail_start_trace -Wf,--end-symbol=fail_stop_trace -Wf,--state-file=$remote_builds_dir/$experiment/state -Wf,--trace-file=$remote_builds_dir/$experiment/trace.pb -Wf,--elf-file=$remote_builds_dir/$experiment/system.elf" join " ",
(
"$bochs_runner",
"-V $fail_share/vgabios.bin",
"-b $fail_share/BIOS-bochs-latest",
"-1",
"-f $fail_trace",
"-e $remote_builds_dir/$experiment/system.elf",
"-i $remote_builds_dir/$experiment/system.iso",
"--",
"-Wf,--start-symbol=fail_start_trace",
"-Wf,--save-symbol=fail_start_trace",
"-Wf,--end-symbol=fail_stop_trace",
"-Wf,--state-file=$remote_builds_dir/$experiment/state",
"-Wf,--trace-file=$remote_builds_dir/$experiment/trace.pb",
"-Wf,--elf-file=$remote_builds_dir/$experiment/system.elf"
)
); );
# notify("Tracing $experiment complete."); # notify("Tracing $experiment complete.");
@ -108,25 +149,93 @@ sub import_trace {
notify("Importing $experiment trace..."); notify("Importing $experiment trace...");
system( system(
"$fail_import --database-option-file $remote_db_conf -t $remote_builds_dir/$experiment/trace.pb -i MemoryImporter -e $remote_builds_dir/$experiment/system.elf -v $experiment -b mem" join " ",
(
"$fail_import",
"--database-option-file $remote_db_conf",
"-t $remote_builds_dir/$experiment/trace.pb",
"-i MemoryImporter",
"-e $remote_builds_dir/$experiment/system.elf",
"-v $experiment",
"-b mem"
)
); );
system( system(
"$fail_import --database-option-file $remote_db_conf -t $remote_builds_dir/$experiment/trace.pb -i RegisterImporter -e $remote_builds_dir/$experiment/system.elf -v $experiment -b regs --flags" join " ",
(
"$fail_import",
"--database-option-file $remote_db_conf",
"-t $remote_builds_dir/$experiment/trace.pb",
"-i RegisterImporter",
"-e $remote_builds_dir/$experiment/system.elf",
"-v $experiment",
"-b regs",
"--flags"
)
); );
system( system(
"$fail_import --database-option-file $remote_db_conf -t $remote_builds_dir/$experiment/trace.pb -i RegisterImporter -e $remote_builds_dir/$experiment/system.elf -v $experiment -b ip --no-gp --ip" join " ",
(
"$fail_import",
"--database-option-file $remote_db_conf",
"-t $remote_builds_dir/$experiment/trace.pb",
"-i RegisterImporter",
"-e $remote_builds_dir/$experiment/system.elf",
"-v $experiment",
"-b ip",
"--no-gp",
"--ip"
)
);
system(
join " ",
(
"$fail_import",
"--database-option-file $remote_db_conf",
"-t $remote_builds_dir/$experiment/trace.pb",
"-i ElfImporter",
"--objdump objdump",
"-e $remote_builds_dir/$experiment/system.elf",
"-v $experiment",
"-b ip"
)
); );
system( system(
"$fail_import --database-option-file $remote_db_conf -t $remote_builds_dir/$experiment/trace.pb -i ElfImporter --objdump objdump -e $remote_builds_dir/$experiment/system.elf -v $experiment -b ip" join " ",
(
"$fail_import",
"--database-option-file $remote_db_conf",
"-t $remote_builds_dir/$experiment/trace.pb",
"-i ElfImporter",
"--objdump objdump",
"-e $remote_builds_dir/$experiment/system.elf",
"-v $experiment",
"-b mem"
)
); );
system( system(
"$fail_import --database-option-file $remote_db_conf -t $remote_builds_dir/$experiment/trace.pb -i ElfImporter --objdump objdump -e $remote_builds_dir/$experiment/system.elf -v $experiment -b mem" join " ",
(
"$fail_import",
"--database-option-file $remote_db_conf",
"-t $remote_builds_dir/$experiment/trace.pb",
"-i ElfImporter",
"--objdump objdump",
"-e $remote_builds_dir/$experiment/system.elf",
"-v $experiment",
"-b regs"
)
); );
system( system(
"$fail_import --database-option-file $remote_db_conf -t $remote_builds_dir/$experiment/trace.pb -i ElfImporter --objdump objdump -e $remote_builds_dir/$experiment/system.elf -v $experiment -b regs" join " ",
); (
system( "$fail_prune",
"$fail_prune --database-option-file $remote_db_conf -v $experiment -b %% --overwrite" "--database-option-file $remote_db_conf",
"-v $experiment",
"-b %%", "--overwrite"
)
); );
# notify("Importing $experiment trace complete."); # notify("Importing $experiment trace complete.");
@ -147,17 +256,53 @@ sub inject {
if ( $pid == 0 ) { if ( $pid == 0 ) {
# child -> server # child -> server
say "Running server in child process..."; say "Running server in child process...";
exec( exec(
"$fail_server --port $fail_server_port --database-option-file $remote_db_conf -v $experiment -b % --inject-single-bit --inject-registers" join " ",
(
"$fail_server",
"--port $fail_server_port",
"--database-option-file $remote_db_conf",
"-v $experiment",
"-b %",
"--inject-single-bit",
"--inject-registers"
)
) or die "exec server failed: $!"; ) or die "exec server failed: $!";
} }
# parent -> client # parent -> client
# "-Wf,--catch-write-textsegment",
say "Waiting for server...";
die "Server did not become ready on port $fail_server_port\n"
unless wait_for_port( "127.0.0.1", $fail_server_port, 10 );
say "Running client with $count cores in parent process"; say "Running client with $count cores in parent process";
system( system(
"nice $bochs_runner -V $fail_share/vgabios.bin -b $fail_share/BIOS-bochs-latest -f $fail_inject -e $remote_builds_dir/$experiment/system.elf -i $remote_builds_dir/$experiment/system.iso -j $count -- -Wf,--server-port=$fail_server_port -Wf,--state-dir=$remote_builds_dir/$experiment/state -Wf,--trap -Wf,--catch-outerspace -Wf,--timeout=500000 -Wf,--ok-marker=fail_marker_positive -Wf,--fail-marker=fail_marker_negative -Wf,--detected-marker=fail_marker_detected > /dev/null" join " ",
(
"nice $bochs_runner",
"-V $fail_share/vgabios.bin",
"-b $fail_share/BIOS-bochs-latest",
"-f $fail_inject",
"-e $remote_builds_dir/$experiment/system.elf",
"-i $remote_builds_dir/$experiment/system.iso",
"-j $count",
"--",
"-Wf,--server-port=$fail_server_port",
"-Wf,--state-dir=$remote_builds_dir/$experiment/state",
"-Wf,--trap",
"-Wf,--catch-outerspace",
# "-Wf,--catch-write-textsegment",
"-Wf,--timeout=500000",
"-Wf,--ok-marker=fail_marker_positive",
"-Wf,--fail-marker=fail_marker_negative",
"-Wf,--detected-marker=fail_marker_detected",
">/dev/null"
)
) or die "client failed: $?"; ) or die "client failed: $?";
say "Killing server with pid $pid..."; say "Killing server with pid $pid...";
@ -187,7 +332,7 @@ sub results {
notify("Querying $experiment..."); notify("Querying $experiment...");
my $results_overview_query = "SELECT my $results_overview_query = "SELECT
variant, benchmark, resulttype, sum(t.time2 - t.time1 + 1) as faults variant, benchmark, resulttype, sum(t.time2 - t.time1 + 1) AS faults
FROM variant v FROM variant v
JOIN trace t ON v.id = t.variant_id JOIN trace t ON v.id = t.variant_id
JOIN fspgroup g ON g.variant_id = t.variant_id AND g.instr2 = t.instr2 AND g.data_address = t.data_address JOIN fspgroup g ON g.variant_id = t.variant_id AND g.instr2 = t.instr2 AND g.data_address = t.data_address