move queries to modules

This commit is contained in:
2026-04-19 12:39:00 +02:00
parent 7efa945977
commit c092295520
3 changed files with 119 additions and 76 deletions

View File

@ -0,0 +1,28 @@
package Queries::FaultsFailed;
use strict;
use warnings;
use diagnostics;
sub query {
my ($experiment) = @_;
return
"SELECT CONCAT('0x', HEX(p.injection_instr_absolute)) AS fault_address, SUM(t.time2 - t.time1 + 1) AS total_fail_markers
FROM trace t
JOIN variant v 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 result_GenericExperimentMessage r ON r.pilot_id = g.pilot_id
JOIN fsppilot p ON p.id = r.pilot_id
WHERE v.variant = '$experiment' AND r.resulttype = 'FAIL_MARKER'
GROUP BY p.injection_instr_absolute
ORDER BY SUM(t.time2 - t.time1 + 1) DESC;"
}
sub args { return "--batch --raw"; }
sub filename { return "faults_failed.csv"; }
sub prostprocess { $_[0] =~ s/\t/,/g; }
1;

View File

@ -0,0 +1,28 @@
package Queries::Results;
use strict;
use warnings;
use diagnostics;
sub query {
my ($experiment) = @_;
return
"SELECT variant, benchmark, resulttype, sum(t.time2 - t.time1 + 1) AS faults
FROM variant v
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 result_GenericExperimentMessage r ON r.pilot_id = g.pilot_id
JOIN fsppilot p ON r.pilot_id = p.id
WHERE v.variant = '$experiment'
GROUP BY v.id, resulttype
ORDER BY variant, benchmark, resulttype;";
}
sub args { return "-t"; }
sub filename { return "results.txt"; }
sub prostprocess { }
1;

View File

@ -5,6 +5,7 @@ use warnings;
use diagnostics; use diagnostics;
use IO::Socket::INET; use IO::Socket::INET;
use Util qw(notify notify_file execute_query find_subdirs);
use feature 'say'; use feature 'say';
@ -29,27 +30,6 @@ my $fail_server = "$fail_bin/generic-experiment-server";
my $fail_inject = "$fail_bin/generic-experiment-client"; my $fail_inject = "$fail_bin/generic-experiment-client";
my $result_browser = "$fail_bin/resultbrowser.py"; my $result_browser = "$fail_bin/resultbrowser.py";
my $ntfy_url = "https://ntfy.vps.chriphost.de";
my $ntfy_token = "tk_rx8fd6hojuz4ekcb72j7juugkbmga"; # May be public
my $ntfy_topic = "fail-alerts";
sub notify {
my ($msg) = @_;
system( "curl", "-H", "Authorization: Bearer $ntfy_token",
"-d", $msg, "$ntfy_url/$ntfy_topic" );
}
sub notify_file {
my ($file) = @_;
system(
"curl", "-H", "Authorization: Bearer $ntfy_token",
"-T", $file, "-H", "Filename: $file",
"$ntfy_url/$ntfy_topic"
);
}
sub update_db_config { sub update_db_config {
my ($experiment) = @_; my ($experiment) = @_;
@ -58,7 +38,7 @@ sub update_db_config {
my @lines; my @lines;
my $found = 0; my $found = 0;
while ( my $line = <$readhandle> ) { while ( my $line = <$readhandle> ) {
if ( rindex( $line, "database=", 0 ) == 0 ) { if ( rindex( $line, 'database=', 0 ) == 0 ) {
$line = "database=${db_prefix}_$experiment\n"; $line = "database=${db_prefix}_$experiment\n";
$found = 1; $found = 1;
} }
@ -78,7 +58,7 @@ sub update_db_config {
} }
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> );
close $handle; close $handle;
@ -86,11 +66,13 @@ sub cpu_count {
} }
# Find new experiments # Find new experiments
opendir( my $dhandle, $remote_builds_dir ) # opendir( my $dhandle, $remote_builds_dir )
or die "opendir($remote_builds_dir): $!"; # or die "opendir($remote_builds_dir): $!";
my @experiments = grep { $_ ne '.' && $_ ne '..' && -d "$remote_builds_dir/$_" } # my @experiments = grep { $_ ne '.' && $_ ne '..' && -d "$remote_builds_dir/$_" }
readdir($dhandle); # readdir($dhandle);
closedir($dhandle); # closedir($dhandle);
my @experiments = find_subdirs($remote_builds_dir);
sub trace { sub trace {
my ($experiment) = @_; my ($experiment) = @_;
@ -288,66 +270,71 @@ sub inject {
# notify("Injecting $experiment complete."); # notify("Injecting $experiment complete.");
} }
sub query { # sub query {
my ( $experiment, $query, $args, $file, $postprocess ) = @_; # my ( $experiment, $query, $args, $file, $postprocess ) = @_;
#
say "Running query $query"; # say "Running query $query";
#
my $result = qx{mariadb --defaults-file=$remote_db_conf $args -e "$query"}; # my $result = qx{mariadb --defaults-file=$remote_db_conf $args -e "$query"};
die "Query failed: $?" if $? != 0; # die "Query failed: $?" if $? != 0;
#
if ( defined $postprocess ) { # if ( defined $postprocess ) {
$postprocess->($result); # $postprocess->($result);
} # }
#
open( my $results_handle, '>', "$remote_builds_dir/$experiment/$file" ) # open( my $results_handle, '>', "$remote_builds_dir/$experiment/$file" )
or die "failed to open file: $!"; # or die "failed to open file: $!";
print $results_handle $result; # print $results_handle $result;
close($results_handle) or die "failed to close file: $!"; # close($results_handle) or die "failed to close file: $!";
#
notify_file("$remote_builds_dir/$experiment/$file"); # notify_file("$remote_builds_dir/$experiment/$file");
} # }
sub results { sub results {
my ($experiment) = @_; my ($experiment) = @_;
notify("Querying $experiment..."); notify("Querying $experiment...");
my $results_overview_query = "SELECT execute_query( $experiment, "Results", $remote_db_conf,
variant, benchmark, resulttype, sum(t.time2 - t.time1 + 1) AS faults $remote_builds_dir );
FROM variant v execute_query( $experiment, "FaultsFailed", $remote_db_conf,
JOIN trace t ON v.id = t.variant_id $remote_builds_dir );
JOIN fspgroup g ON g.variant_id = t.variant_id AND g.instr2 = t.instr2 AND g.data_address = t.data_address
JOIN result_GenericExperimentMessage r ON r.pilot_id = g.pilot_id
JOIN fsppilot p ON r.pilot_id = p.id
WHERE v.variant = '$experiment'
GROUP BY v.id, resulttype
ORDER BY variant, benchmark, resulttype;";
query( $experiment, $results_overview_query, "-t", "results.txt" ); # my $results_overview_query = "SELECT
# variant, benchmark, resulttype, sum(t.time2 - t.time1 + 1) AS faults
my $fail_markers_query = "SELECT # FROM variant v
CONCAT('0x', HEX(p.injection_instr_absolute)) AS fault_address, # JOIN trace t ON v.id = t.variant_id
SUM(t.time2 - t.time1 + 1) AS total_fail_markers # JOIN fspgroup g ON g.variant_id = t.variant_id AND g.instr2 = t.instr2 AND g.data_address = t.data_address
FROM trace t # JOIN result_GenericExperimentMessage r ON r.pilot_id = g.pilot_id
JOIN variant v ON v.id = t.variant_id # JOIN fsppilot p ON r.pilot_id = p.id
JOIN fspgroup g ON g.variant_id = t.variant_id AND g.instr2 = t.instr2 AND g.data_address = t.data_address # WHERE v.variant = '$experiment'
JOIN result_GenericExperimentMessage r ON r.pilot_id = g.pilot_id # GROUP BY v.id, resulttype
JOIN fsppilot p ON p.id = r.pilot_id # ORDER BY variant, benchmark, resulttype;";
WHERE v.variant = '$experiment' AND r.resulttype = 'FAIL_MARKER' #
GROUP BY p.injection_instr_absolute # query( $experiment, $results_overview_query, "-t", "results.txt" );
ORDER BY SUM(t.time2 - t.time1 + 1) DESC;"; #
# my $fail_markers_query = "SELECT
query( $experiment, $fail_markers_query, "--batch --raw", # CONCAT('0x', HEX(p.injection_instr_absolute)) AS fault_address,
"markers.csv", sub { $_[0] =~ s/\t/,/g } ); # SUM(t.time2 - t.time1 + 1) AS total_fail_markers
# FROM trace t
# JOIN variant v 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 result_GenericExperimentMessage r ON r.pilot_id = g.pilot_id
# JOIN fsppilot p ON p.id = r.pilot_id
# WHERE v.variant = '$experiment' AND r.resulttype = 'FAIL_MARKER'
# GROUP BY p.injection_instr_absolute
# ORDER BY SUM(t.time2 - t.time1 + 1) DESC;";
#
# query( $experiment, $fail_markers_query, "--batch --raw",
# "markers.csv", sub { $_[0] =~ s/\t/,/g } );
} }
# Run experiments # Run experiments
for my $experiment (@experiments) { for my $experiment (@experiments) {
update_db_config($experiment); update_db_config($experiment);
trace($experiment); # trace($experiment);
import_trace($experiment); # import_trace($experiment);
inject($experiment); # inject($experiment);
results($experiment); results($experiment);
} }