Update faults filtering to be selectable from menu
This commit is contained in:
71
scripts/Modules/Filters.pm
Normal file
71
scripts/Modules/Filters.pm
Normal file
@ -0,0 +1,71 @@
|
|||||||
|
package Modules::Filters;
|
||||||
|
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
use diagnostics;
|
||||||
|
|
||||||
|
use FindBin;
|
||||||
|
use lib $FindBin::Bin;
|
||||||
|
use Util;
|
||||||
|
|
||||||
|
my %CONFIGS = (
|
||||||
|
no_aot => {
|
||||||
|
label => "Exclude WAMR AOT array",
|
||||||
|
regions => [ [ '_wamr_aot_start', '_wamr_aot_end' ] ],
|
||||||
|
},
|
||||||
|
no_mmap => {
|
||||||
|
label => "Exclude WAMR mmap",
|
||||||
|
regions => [ [ '_wamr_mmap_start', '_wamr_mmap_end' ] ],
|
||||||
|
},
|
||||||
|
no_runtime_pool => {
|
||||||
|
label => "Exclude WAMR runtime pool",
|
||||||
|
regions => [ [ '_wamr_runtime_pool_start', '_wamr_runtime_pool_end' ] ],
|
||||||
|
},
|
||||||
|
no_linear_pool => {
|
||||||
|
label => "Exclude WAMR linear pool",
|
||||||
|
regions => [ [ '_wamr_linear_pool_start', '_wamr_linear_pool_end' ] ],
|
||||||
|
},
|
||||||
|
no_global_heap => {
|
||||||
|
label => "Exclude WAMR global heap",
|
||||||
|
regions => [ [ '_wamr_global_heap_start', '_wamr_global_heap_end' ] ],
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
# Those will be executed automatically by runner.pl (+ no filter at all)
|
||||||
|
my @DEFAULT_CONFIGS = ('no_aot');
|
||||||
|
|
||||||
|
sub get_configs {
|
||||||
|
return \%CONFIGS;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub get_default_configs {
|
||||||
|
return @DEFAULT_CONFIGS;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub build_filter_clause {
|
||||||
|
my ( $experiment_dir, $config_name ) = @_;
|
||||||
|
|
||||||
|
return "" unless defined $config_name && length($config_name) > 0;
|
||||||
|
|
||||||
|
my $regions = $CONFIGS{$config_name}{regions};
|
||||||
|
return "" unless defined $regions;
|
||||||
|
|
||||||
|
return ""
|
||||||
|
unless defined $experiment_dir && -f "$experiment_dir/system.elf";
|
||||||
|
|
||||||
|
my @filters;
|
||||||
|
for my $pair (@$regions) {
|
||||||
|
my ( $start_sym, $end_sym ) = @$pair;
|
||||||
|
my $start =
|
||||||
|
Util::elf_sym_addr( "$experiment_dir/system.elf", $start_sym );
|
||||||
|
my $end = Util::elf_sym_addr( "$experiment_dir/system.elf", $end_sym );
|
||||||
|
next unless defined $start && defined $end && $end > $start;
|
||||||
|
push @filters,
|
||||||
|
"p.injection_instr_absolute NOT BETWEEN $start AND @{[$end - 1]}";
|
||||||
|
}
|
||||||
|
|
||||||
|
return "" unless @filters;
|
||||||
|
return "\nAND " . join( "\nAND ", @filters );
|
||||||
|
}
|
||||||
|
|
||||||
|
1;
|
||||||
@ -126,7 +126,9 @@ sub find_subdirs {
|
|||||||
}
|
}
|
||||||
|
|
||||||
sub execute_query {
|
sub execute_query {
|
||||||
my ( $experiment, $queryname, $db_conf, $builds_dir, $do_notify_file ) = @_;
|
my ( $experiment, $queryname, $db_conf, $builds_dir, $do_notify_file,
|
||||||
|
$filter_config_name )
|
||||||
|
= @_;
|
||||||
|
|
||||||
my $module = "Queries::$queryname";
|
my $module = "Queries::$queryname";
|
||||||
my $file = "$module.pm";
|
my $file = "$module.pm";
|
||||||
@ -140,9 +142,10 @@ sub execute_query {
|
|||||||
my $postprocess = $module->can('postprocess')
|
my $postprocess = $module->can('postprocess')
|
||||||
or die "$module can't postprocess()";
|
or die "$module can't postprocess()";
|
||||||
|
|
||||||
my $querystring = $query->($experiment, "$builds_dir/$experiment");
|
my $querystring =
|
||||||
|
$query->( $experiment, "$builds_dir/$experiment", $filter_config_name );
|
||||||
my $argsstring = $args->();
|
my $argsstring = $args->();
|
||||||
my $filenamestring = $filename->();
|
my $filenamestring = $filename->($filter_config_name);
|
||||||
|
|
||||||
# TODO: Pass the values instead of rewriting db.conf.
|
# TODO: Pass the values instead of rewriting db.conf.
|
||||||
# Can also use DBI's database handle directly.
|
# Can also use DBI's database handle directly.
|
||||||
|
|||||||
@ -4,10 +4,19 @@ use strict;
|
|||||||
use warnings;
|
use warnings;
|
||||||
use diagnostics;
|
use diagnostics;
|
||||||
|
|
||||||
|
use FindBin;
|
||||||
|
use lib "$FindBin::Bin/..";
|
||||||
|
use lib "$FindBin::Bin/../Modules";
|
||||||
|
use Modules::Filters;
|
||||||
|
|
||||||
use feature 'say';
|
use feature 'say';
|
||||||
|
|
||||||
sub query {
|
sub query {
|
||||||
my ($experiment) = @_;
|
my ( $experiment, $experiment_dir, $filter_config_name ) = @_;
|
||||||
|
$filter_config_name //= '';
|
||||||
|
|
||||||
|
my $filters = Modules::Filters::build_filter_clause( $experiment_dir,
|
||||||
|
$filter_config_name );
|
||||||
|
|
||||||
my $querystring = "SELECT
|
my $querystring = "SELECT
|
||||||
benchmark, resulttype, SUM(t.time2 - t.time1 + 1) AS faults,
|
benchmark, resulttype, SUM(t.time2 - t.time1 + 1) AS faults,
|
||||||
@ -17,7 +26,7 @@ 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_physical_address = t.data_physical_address
|
JOIN fspgroup g ON g.variant_id = t.variant_id AND g.instr2 = t.instr2 AND g.data_physical_address = t.data_physical_address
|
||||||
JOIN result_GenericExperimentMessage r ON r.pilot_id = g.pilot_id
|
JOIN result_GenericExperimentMessage r ON r.pilot_id = g.pilot_id
|
||||||
JOIN fsppilot p ON r.pilot_id = p.id
|
JOIN fsppilot p ON r.pilot_id = p.id
|
||||||
WHERE v.variant = '$experiment'
|
WHERE v.variant = '$experiment'$filters
|
||||||
GROUP BY benchmark, resulttype, p.injection_instr_absolute
|
GROUP BY benchmark, resulttype, p.injection_instr_absolute
|
||||||
ORDER BY benchmark, resulttype, SUM(t.time2 - t.time1 + 1) DESC;";
|
ORDER BY benchmark, resulttype, SUM(t.time2 - t.time1 + 1) DESC;";
|
||||||
|
|
||||||
@ -28,7 +37,12 @@ ORDER BY benchmark, resulttype, SUM(t.time2 - t.time1 + 1) DESC;";
|
|||||||
|
|
||||||
sub args { return "--batch --raw"; }
|
sub args { return "--batch --raw"; }
|
||||||
|
|
||||||
sub filename { return "faults.csv"; }
|
sub filename {
|
||||||
|
my ($filter_config_name) = @_;
|
||||||
|
$filter_config_name //= '';
|
||||||
|
my $suffix = length($filter_config_name) ? "_$filter_config_name" : "";
|
||||||
|
return "faults${suffix}.csv";
|
||||||
|
}
|
||||||
|
|
||||||
sub postprocess { $_[0] =~ s/\t/,/g; }
|
sub postprocess { $_[0] =~ s/\t/,/g; }
|
||||||
|
|
||||||
|
|||||||
@ -1,64 +0,0 @@
|
|||||||
package Queries::FaultsFiltered;
|
|
||||||
|
|
||||||
use strict;
|
|
||||||
use warnings;
|
|
||||||
use diagnostics;
|
|
||||||
|
|
||||||
use FindBin;
|
|
||||||
use lib "$FindBin::Bin/../Modules";
|
|
||||||
use Util;
|
|
||||||
|
|
||||||
use feature 'say';
|
|
||||||
|
|
||||||
# Those regions from linker.ld will be excluded
|
|
||||||
my @EXCLUDE_REGIONS = (
|
|
||||||
[ '_wamr_aot_start', '_wamr_aot_end' ],
|
|
||||||
# [ '_wamr_mmap_start', '_wamr_mmap_end' ],
|
|
||||||
# [ '_wamr_global_heap_start', '_wamr_global_heap_end' ],
|
|
||||||
# [ '_wamr_runtime_pool_start', '_wamr_runtime_pool_end' ],
|
|
||||||
# [ '_wamr_linear_pool_start', '_wamr_linear_pool_end' ],
|
|
||||||
);
|
|
||||||
|
|
||||||
sub query {
|
|
||||||
my ( $experiment, $experiment_dir ) = @_;
|
|
||||||
|
|
||||||
my @filters;
|
|
||||||
if ( defined $experiment_dir && -f "$experiment_dir/system.elf" ) {
|
|
||||||
for my $pair (@EXCLUDE_REGIONS) {
|
|
||||||
my ( $start_sym, $end_sym ) = @$pair;
|
|
||||||
my $start =
|
|
||||||
Util::elf_sym_addr( "$experiment_dir/system.elf", $start_sym );
|
|
||||||
my $end =
|
|
||||||
Util::elf_sym_addr( "$experiment_dir/system.elf", $end_sym );
|
|
||||||
next unless defined $start && defined $end && $end > $start;
|
|
||||||
push @filters,
|
|
||||||
"p.injection_instr_absolute NOT BETWEEN $start AND @{[$end - 1]}";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
my $extra = @filters ? "\nAND " . join( "\nAND ", @filters ) : "";
|
|
||||||
|
|
||||||
my $querystring = "SELECT
|
|
||||||
benchmark, resulttype, SUM(t.time2 - t.time1 + 1) AS faults,
|
|
||||||
CONCAT('0x', HEX(p.injection_instr_absolute)) AS fault_address
|
|
||||||
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_physical_address = t.data_physical_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'$extra
|
|
||||||
GROUP BY benchmark, resulttype, p.injection_instr_absolute
|
|
||||||
ORDER BY benchmark, resulttype, SUM(t.time2 - t.time1 + 1) DESC;";
|
|
||||||
|
|
||||||
say $querystring;
|
|
||||||
|
|
||||||
return $querystring;
|
|
||||||
}
|
|
||||||
|
|
||||||
sub args { return "--batch --raw"; }
|
|
||||||
|
|
||||||
sub filename { return "faults_filtered.csv"; }
|
|
||||||
|
|
||||||
sub postprocess { $_[0] =~ s/\t/,/g; }
|
|
||||||
|
|
||||||
1;
|
|
||||||
@ -4,10 +4,19 @@ use strict;
|
|||||||
use warnings;
|
use warnings;
|
||||||
use diagnostics;
|
use diagnostics;
|
||||||
|
|
||||||
|
use FindBin;
|
||||||
|
use lib "$FindBin::Bin/..";
|
||||||
|
use lib "$FindBin::Bin/../Modules";
|
||||||
|
use Modules::Filters;
|
||||||
|
|
||||||
use feature 'say';
|
use feature 'say';
|
||||||
|
|
||||||
sub query {
|
sub query {
|
||||||
my ($experiment) = @_;
|
my ( $experiment, $experiment_dir, $filter_config_name ) = @_;
|
||||||
|
$filter_config_name //= '';
|
||||||
|
|
||||||
|
my $extra = Modules::Filters::build_filter_clause( $experiment_dir,
|
||||||
|
$filter_config_name );
|
||||||
|
|
||||||
my $querystring = "SELECT
|
my $querystring = "SELECT
|
||||||
benchmark, resulttype, sum(t.time2 - t.time1 + 1) AS faults
|
benchmark, resulttype, sum(t.time2 - t.time1 + 1) AS faults
|
||||||
@ -16,7 +25,7 @@ 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_physical_address = t.data_physical_address
|
JOIN fspgroup g ON g.variant_id = t.variant_id AND g.instr2 = t.instr2 AND g.data_physical_address = t.data_physical_address
|
||||||
JOIN result_GenericExperimentMessage r ON r.pilot_id = g.pilot_id
|
JOIN result_GenericExperimentMessage r ON r.pilot_id = g.pilot_id
|
||||||
JOIN fsppilot p ON r.pilot_id = p.id
|
JOIN fsppilot p ON r.pilot_id = p.id
|
||||||
WHERE v.variant = '$experiment'
|
WHERE v.variant = '$experiment'$extra
|
||||||
GROUP BY v.id, resulttype
|
GROUP BY v.id, resulttype
|
||||||
ORDER BY variant, benchmark, resulttype;";
|
ORDER BY variant, benchmark, resulttype;";
|
||||||
|
|
||||||
@ -27,7 +36,12 @@ ORDER BY variant, benchmark, resulttype;";
|
|||||||
|
|
||||||
sub args { return "-t"; }
|
sub args { return "-t"; }
|
||||||
|
|
||||||
sub filename { return "results.txt"; }
|
sub filename {
|
||||||
|
my ($filter_config_name) = @_;
|
||||||
|
$filter_config_name //= '';
|
||||||
|
my $suffix = length($filter_config_name) ? "_filtered_$filter_config_name" : "";
|
||||||
|
return "results${suffix}.txt";
|
||||||
|
}
|
||||||
|
|
||||||
sub postprocess { }
|
sub postprocess { }
|
||||||
|
|
||||||
|
|||||||
@ -4,10 +4,19 @@ use strict;
|
|||||||
use warnings;
|
use warnings;
|
||||||
use diagnostics;
|
use diagnostics;
|
||||||
|
|
||||||
|
use FindBin;
|
||||||
|
use lib "$FindBin::Bin/..";
|
||||||
|
use lib "$FindBin::Bin/../Modules";
|
||||||
|
use Modules::Filters;
|
||||||
|
|
||||||
use feature 'say';
|
use feature 'say';
|
||||||
|
|
||||||
sub query {
|
sub query {
|
||||||
my ($experiment) = @_;
|
my ( $experiment, $experiment_dir, $filter_config_name ) = @_;
|
||||||
|
$filter_config_name //= '';
|
||||||
|
|
||||||
|
my $extra = Modules::Filters::build_filter_clause( $experiment_dir,
|
||||||
|
$filter_config_name );
|
||||||
|
|
||||||
my $querystring = "SELECT
|
my $querystring = "SELECT
|
||||||
benchmark, resulttype, sum(t.time2 - t.time1 + 1) AS faults
|
benchmark, resulttype, sum(t.time2 - t.time1 + 1) AS faults
|
||||||
@ -16,7 +25,7 @@ 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_physical_address = t.data_physical_address
|
JOIN fspgroup g ON g.variant_id = t.variant_id AND g.instr2 = t.instr2 AND g.data_physical_address = t.data_physical_address
|
||||||
JOIN result_GenericExperimentMessage r ON r.pilot_id = g.pilot_id
|
JOIN result_GenericExperimentMessage r ON r.pilot_id = g.pilot_id
|
||||||
JOIN fsppilot p ON r.pilot_id = p.id
|
JOIN fsppilot p ON r.pilot_id = p.id
|
||||||
WHERE v.variant = '$experiment'
|
WHERE v.variant = '$experiment'$extra
|
||||||
GROUP BY v.id, resulttype
|
GROUP BY v.id, resulttype
|
||||||
ORDER BY variant, benchmark, resulttype;";
|
ORDER BY variant, benchmark, resulttype;";
|
||||||
|
|
||||||
@ -27,7 +36,12 @@ ORDER BY variant, benchmark, resulttype;";
|
|||||||
|
|
||||||
sub args { return "--batch --raw"; }
|
sub args { return "--batch --raw"; }
|
||||||
|
|
||||||
sub filename { return "resultsdata.csv"; }
|
sub filename {
|
||||||
|
my ($filter_config_name) = @_;
|
||||||
|
$filter_config_name //= '';
|
||||||
|
my $suffix = length($filter_config_name) ? "_filtered_$filter_config_name" : "";
|
||||||
|
return "resultsdata${suffix}.csv";
|
||||||
|
}
|
||||||
|
|
||||||
sub postprocess { $_[0] =~ s/\t/,/g; }
|
sub postprocess { $_[0] =~ s/\t/,/g; }
|
||||||
|
|
||||||
|
|||||||
@ -11,6 +11,7 @@ use lib "$FindBin::Bin/Modules";
|
|||||||
use Util;
|
use Util;
|
||||||
use Mars;
|
use Mars;
|
||||||
use TUI;
|
use TUI;
|
||||||
|
use Modules::Filters;
|
||||||
use Text::CSV_XS;
|
use Text::CSV_XS;
|
||||||
|
|
||||||
use feature 'say';
|
use feature 'say';
|
||||||
@ -85,15 +86,43 @@ my %handlers = (
|
|||||||
TUI::select_from_list( "Select Queries to Run", 1, @queries );
|
TUI::select_from_list( "Select Queries to Run", 1, @queries );
|
||||||
die "No query selected" unless @selected_queries;
|
die "No query selected" unless @selected_queries;
|
||||||
|
|
||||||
|
# Select filter configs
|
||||||
|
my @filter_choices = ("None");
|
||||||
|
my %filter_label_name;
|
||||||
|
my @filter_configs;
|
||||||
|
my $configs = Modules::Filters::get_configs();
|
||||||
|
foreach my $name ( sort keys %$configs ) {
|
||||||
|
my $label = $configs->{$name}{label};
|
||||||
|
push @filter_choices, $label;
|
||||||
|
$filter_label_name{$label} = $name;
|
||||||
|
}
|
||||||
|
my @selected_filter_labels =
|
||||||
|
TUI::select_from_list( "Select Filters to Apply", 1,
|
||||||
|
@filter_choices );
|
||||||
|
die "No filter selected" unless @selected_filter_labels;
|
||||||
|
@filter_configs = ();
|
||||||
|
foreach my $label (@selected_filter_labels) {
|
||||||
|
if ( $label eq "None" ) {
|
||||||
|
push @filter_configs, '';
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
push @filter_configs, $filter_label_name{$label};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
# Run queries on databases
|
# Run queries on databases
|
||||||
foreach my $db (@selected_dbs) {
|
foreach my $db (@selected_dbs) {
|
||||||
foreach my $query (@selected_queries) {
|
foreach my $query (@selected_queries) {
|
||||||
Util::rewrite_file( $local_db_conf, "database=",
|
foreach my $config (@filter_configs) {
|
||||||
"database=$db\n" );
|
Util::rewrite_file( $local_db_conf, "database=",
|
||||||
|
"database=$db\n" );
|
||||||
|
|
||||||
say "Running $query on $db...";
|
my $config_label = length($config) ? " ($config)" : "";
|
||||||
Util::execute_query( $db =~ s/smchurla_//r,
|
say "Running $query$config_label on $db...";
|
||||||
$query, $local_db_conf, $local_archive_dir, 0 );
|
Util::execute_query( $db =~ s/smchurla_//r,
|
||||||
|
$query, $local_db_conf, $local_archive_dir, 0,
|
||||||
|
$config );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|||||||
@ -6,10 +6,10 @@ use diagnostics;
|
|||||||
|
|
||||||
use FindBin;
|
use FindBin;
|
||||||
use lib $FindBin::Bin;
|
use lib $FindBin::Bin;
|
||||||
use lib "$FindBin::Bin/../../scripts";
|
use lib "$FindBin::Bin/Modules";
|
||||||
use lib "$FindBin::Bin/../../scripts/Modules";
|
|
||||||
|
|
||||||
use Util;
|
use Modules::Filters;
|
||||||
|
use Modules::Util;
|
||||||
|
|
||||||
use feature 'say';
|
use feature 'say';
|
||||||
|
|
||||||
@ -209,9 +209,10 @@ sub inject {
|
|||||||
|
|
||||||
# Read catch flags written by build.pl into the experiment directory
|
# Read catch flags written by build.pl into the experiment directory
|
||||||
my $runner_flags_file = "$remote_builds_dir/$experiment/runner_flags";
|
my $runner_flags_file = "$remote_builds_dir/$experiment/runner_flags";
|
||||||
my @catch_flags = ();
|
my @catch_flags = ();
|
||||||
if ( -e $runner_flags_file ) {
|
if ( -e $runner_flags_file ) {
|
||||||
open( my $rfh, '<', $runner_flags_file ) or die "Cannot open $runner_flags_file: $!";
|
open( my $rfh, '<', $runner_flags_file )
|
||||||
|
or die "Cannot open $runner_flags_file: $!";
|
||||||
@catch_flags = map { chomp; "-Wf,$_" } grep { /\S/ } <$rfh>;
|
@catch_flags = map { chomp; "-Wf,$_" } grep { /\S/ } <$rfh>;
|
||||||
close($rfh);
|
close($rfh);
|
||||||
}
|
}
|
||||||
@ -272,16 +273,15 @@ sub inject {
|
|||||||
sub results {
|
sub results {
|
||||||
my ($experiment) = @_;
|
my ($experiment) = @_;
|
||||||
|
|
||||||
my @queries = Util::find_files("$remote_root/scripts/Queries");
|
my @queries =
|
||||||
|
map { s/\.pm//gr } Util::find_files("$remote_root/scripts/Queries");
|
||||||
|
my @configs = ( '', Modules::Filters::get_default_configs() );
|
||||||
|
|
||||||
foreach (@queries) {
|
for my $query (@queries) {
|
||||||
my $query = $_;
|
for my $config (@configs) {
|
||||||
$query =~ s/\.pm//g;
|
Util::execute_query( $experiment, $query,
|
||||||
|
$remote_db_conf, $remote_builds_dir, 1, $config );
|
||||||
# Util::notify("Running query $query for $experiment...");
|
}
|
||||||
|
|
||||||
Util::execute_query( $experiment, $query,
|
|
||||||
$remote_db_conf, $remote_builds_dir, 1 );
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user