Compare commits
2 Commits
40d40bc57b
...
c092295520
| Author | SHA1 | Date | |
|---|---|---|---|
|
c092295520
|
|||
|
7efa945977
|
28
scripts/Queries/FaultsFailed.pm
Normal file
28
scripts/Queries/FaultsFailed.pm
Normal 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;
|
||||
28
scripts/Queries/Results.pm
Normal file
28
scripts/Queries/Results.pm
Normal 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;
|
||||
88
scripts/Util.pm
Normal file
88
scripts/Util.pm
Normal file
@ -0,0 +1,88 @@
|
||||
package Util;
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
use diagnostics;
|
||||
|
||||
use feature 'say';
|
||||
|
||||
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 find_files {
|
||||
my ($dir) = @_;
|
||||
|
||||
opendir( my $dhandle, $dir ) or die "opendir($dir): $!";
|
||||
my @files = grep { -f "$dir/$_" } readdir($dhandle);
|
||||
closedir($dhandle);
|
||||
|
||||
return @files;
|
||||
}
|
||||
|
||||
sub find_subdirs {
|
||||
my ($dir) = @_;
|
||||
|
||||
opendir( my $dhandle, $dir ) or die "opendir($dir): $!";
|
||||
my @subdirs =
|
||||
grep { $_ ne '.' && $_ ne '..' && -d "$dir/$_" } readdir($dhandle);
|
||||
closedir($dhandle);
|
||||
|
||||
return @subdirs;
|
||||
}
|
||||
|
||||
sub execute_query {
|
||||
my ( $experiment, $queryname, $db_conf, $builds_dir ) = @_;
|
||||
|
||||
say "Running query $queryname";
|
||||
|
||||
my $module = "Queries::$queryname";
|
||||
my $file = "$module.pm";
|
||||
$file =~ s/::/\//g;
|
||||
|
||||
require $file;
|
||||
|
||||
my $query = $module->can('query') or die "$module can't query()";
|
||||
my $args = $module->can('args') or die "$module can't args()";
|
||||
my $filename = $module->can('filename') or die "$module can't filanem()";
|
||||
my $postprocess = $module->can('postprocess')
|
||||
or die "$module can't postprocess()";
|
||||
|
||||
my $querystring = $query->($experiment);
|
||||
my $argsstring = $args->();
|
||||
my $filenamestring = $filename->();
|
||||
|
||||
my $result =
|
||||
qx{mariadb --defaults-file=$db_conf $argsstring -e "$querystring"};
|
||||
die "Query failed: $?" if $? != 0;
|
||||
|
||||
$postprocess->($result);
|
||||
|
||||
open( my $results_handle, '>', "$builds_dir/$experiment/$filenamestring" )
|
||||
or die "failed to open file: $!";
|
||||
print $results_handle $result;
|
||||
close($results_handle) or die "failed to close file: $!";
|
||||
|
||||
notify_file("$builds_dir/$experiment/$filenamestring");
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
1;
|
||||
@ -5,6 +5,7 @@ use warnings;
|
||||
use diagnostics;
|
||||
|
||||
use IO::Socket::INET;
|
||||
use Util qw(notify notify_file execute_query find_subdirs);
|
||||
|
||||
use feature 'say';
|
||||
|
||||
@ -29,27 +30,6 @@ my $fail_server = "$fail_bin/generic-experiment-server";
|
||||
my $fail_inject = "$fail_bin/generic-experiment-client";
|
||||
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 {
|
||||
my ($experiment) = @_;
|
||||
|
||||
@ -58,7 +38,7 @@ sub update_db_config {
|
||||
my @lines;
|
||||
my $found = 0;
|
||||
while ( my $line = <$readhandle> ) {
|
||||
if ( rindex( $line, "database=", 0 ) == 0 ) {
|
||||
if ( rindex( $line, 'database=', 0 ) == 0 ) {
|
||||
$line = "database=${db_prefix}_$experiment\n";
|
||||
$found = 1;
|
||||
}
|
||||
@ -78,7 +58,7 @@ sub update_db_config {
|
||||
}
|
||||
|
||||
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> );
|
||||
close $handle;
|
||||
|
||||
@ -86,11 +66,13 @@ sub cpu_count {
|
||||
}
|
||||
|
||||
# Find new experiments
|
||||
opendir( my $dhandle, $remote_builds_dir )
|
||||
or die "opendir($remote_builds_dir): $!";
|
||||
my @experiments = grep { $_ ne '.' && $_ ne '..' && -d "$remote_builds_dir/$_" }
|
||||
readdir($dhandle);
|
||||
closedir($dhandle);
|
||||
# opendir( my $dhandle, $remote_builds_dir )
|
||||
# or die "opendir($remote_builds_dir): $!";
|
||||
# my @experiments = grep { $_ ne '.' && $_ ne '..' && -d "$remote_builds_dir/$_" }
|
||||
# readdir($dhandle);
|
||||
# closedir($dhandle);
|
||||
|
||||
my @experiments = find_subdirs($remote_builds_dir);
|
||||
|
||||
sub trace {
|
||||
my ($experiment) = @_;
|
||||
@ -288,66 +270,71 @@ sub inject {
|
||||
# notify("Injecting $experiment complete.");
|
||||
}
|
||||
|
||||
sub query {
|
||||
my ( $experiment, $query, $args, $file, $postprocess ) = @_;
|
||||
|
||||
say "Running query $query";
|
||||
|
||||
my $result = qx{mariadb --defaults-file=$remote_db_conf $args -e "$query"};
|
||||
die "Query failed: $?" if $? != 0;
|
||||
|
||||
if ( defined $postprocess ) {
|
||||
$postprocess->($result);
|
||||
}
|
||||
|
||||
open( my $results_handle, '>', "$remote_builds_dir/$experiment/$file" )
|
||||
or die "failed to open file: $!";
|
||||
print $results_handle $result;
|
||||
close($results_handle) or die "failed to close file: $!";
|
||||
|
||||
notify_file("$remote_builds_dir/$experiment/$file");
|
||||
}
|
||||
# sub query {
|
||||
# my ( $experiment, $query, $args, $file, $postprocess ) = @_;
|
||||
#
|
||||
# say "Running query $query";
|
||||
#
|
||||
# my $result = qx{mariadb --defaults-file=$remote_db_conf $args -e "$query"};
|
||||
# die "Query failed: $?" if $? != 0;
|
||||
#
|
||||
# if ( defined $postprocess ) {
|
||||
# $postprocess->($result);
|
||||
# }
|
||||
#
|
||||
# open( my $results_handle, '>', "$remote_builds_dir/$experiment/$file" )
|
||||
# or die "failed to open file: $!";
|
||||
# print $results_handle $result;
|
||||
# close($results_handle) or die "failed to close file: $!";
|
||||
#
|
||||
# notify_file("$remote_builds_dir/$experiment/$file");
|
||||
# }
|
||||
|
||||
sub results {
|
||||
my ($experiment) = @_;
|
||||
|
||||
notify("Querying $experiment...");
|
||||
|
||||
my $results_overview_query = "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;";
|
||||
execute_query( $experiment, "Results", $remote_db_conf,
|
||||
$remote_builds_dir );
|
||||
execute_query( $experiment, "FaultsFailed", $remote_db_conf,
|
||||
$remote_builds_dir );
|
||||
|
||||
query( $experiment, $results_overview_query, "-t", "results.txt" );
|
||||
|
||||
my $fail_markers_query = "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;";
|
||||
|
||||
query( $experiment, $fail_markers_query, "--batch --raw",
|
||||
"markers.csv", sub { $_[0] =~ s/\t/,/g } );
|
||||
# my $results_overview_query = "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;";
|
||||
#
|
||||
# query( $experiment, $results_overview_query, "-t", "results.txt" );
|
||||
#
|
||||
# my $fail_markers_query = "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;";
|
||||
#
|
||||
# query( $experiment, $fail_markers_query, "--batch --raw",
|
||||
# "markers.csv", sub { $_[0] =~ s/\t/,/g } );
|
||||
}
|
||||
|
||||
# Run experiments
|
||||
for my $experiment (@experiments) {
|
||||
update_db_config($experiment);
|
||||
|
||||
trace($experiment);
|
||||
import_trace($experiment);
|
||||
inject($experiment);
|
||||
# trace($experiment);
|
||||
# import_trace($experiment);
|
||||
# inject($experiment);
|
||||
results($experiment);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user