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 {
|
||||
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 $file = "$module.pm";
|
||||
@ -140,9 +142,10 @@ sub execute_query {
|
||||
my $postprocess = $module->can('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 $filenamestring = $filename->();
|
||||
my $filenamestring = $filename->($filter_config_name);
|
||||
|
||||
# TODO: Pass the values instead of rewriting db.conf.
|
||||
# Can also use DBI's database handle directly.
|
||||
|
||||
@ -4,10 +4,19 @@ use strict;
|
||||
use warnings;
|
||||
use diagnostics;
|
||||
|
||||
use FindBin;
|
||||
use lib "$FindBin::Bin/..";
|
||||
use lib "$FindBin::Bin/../Modules";
|
||||
use Modules::Filters;
|
||||
|
||||
use feature 'say';
|
||||
|
||||
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
|
||||
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 result_GenericExperimentMessage r ON r.pilot_id = g.pilot_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
|
||||
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 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; }
|
||||
|
||||
|
||||
@ -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 diagnostics;
|
||||
|
||||
use FindBin;
|
||||
use lib "$FindBin::Bin/..";
|
||||
use lib "$FindBin::Bin/../Modules";
|
||||
use Modules::Filters;
|
||||
|
||||
use feature 'say';
|
||||
|
||||
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
|
||||
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 result_GenericExperimentMessage r ON r.pilot_id = g.pilot_id
|
||||
JOIN fsppilot p ON r.pilot_id = p.id
|
||||
WHERE v.variant = '$experiment'
|
||||
WHERE v.variant = '$experiment'$extra
|
||||
GROUP BY v.id, resulttype
|
||||
ORDER BY variant, benchmark, resulttype;";
|
||||
|
||||
@ -27,7 +36,12 @@ ORDER BY variant, benchmark, resulttype;";
|
||||
|
||||
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 { }
|
||||
|
||||
|
||||
@ -4,10 +4,19 @@ use strict;
|
||||
use warnings;
|
||||
use diagnostics;
|
||||
|
||||
use FindBin;
|
||||
use lib "$FindBin::Bin/..";
|
||||
use lib "$FindBin::Bin/../Modules";
|
||||
use Modules::Filters;
|
||||
|
||||
use feature 'say';
|
||||
|
||||
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
|
||||
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 result_GenericExperimentMessage r ON r.pilot_id = g.pilot_id
|
||||
JOIN fsppilot p ON r.pilot_id = p.id
|
||||
WHERE v.variant = '$experiment'
|
||||
WHERE v.variant = '$experiment'$extra
|
||||
GROUP BY v.id, resulttype
|
||||
ORDER BY variant, benchmark, resulttype;";
|
||||
|
||||
@ -27,7 +36,12 @@ ORDER BY variant, benchmark, resulttype;";
|
||||
|
||||
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; }
|
||||
|
||||
|
||||
@ -11,6 +11,7 @@ use lib "$FindBin::Bin/Modules";
|
||||
use Util;
|
||||
use Mars;
|
||||
use TUI;
|
||||
use Modules::Filters;
|
||||
use Text::CSV_XS;
|
||||
|
||||
use feature 'say';
|
||||
@ -85,15 +86,43 @@ my %handlers = (
|
||||
TUI::select_from_list( "Select Queries to Run", 1, @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
|
||||
foreach my $db (@selected_dbs) {
|
||||
foreach my $query (@selected_queries) {
|
||||
Util::rewrite_file( $local_db_conf, "database=",
|
||||
"database=$db\n" );
|
||||
foreach my $config (@filter_configs) {
|
||||
Util::rewrite_file( $local_db_conf, "database=",
|
||||
"database=$db\n" );
|
||||
|
||||
say "Running $query on $db...";
|
||||
Util::execute_query( $db =~ s/smchurla_//r,
|
||||
$query, $local_db_conf, $local_archive_dir, 0 );
|
||||
my $config_label = length($config) ? " ($config)" : "";
|
||||
say "Running $query$config_label on $db...";
|
||||
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 lib $FindBin::Bin;
|
||||
use lib "$FindBin::Bin/../../scripts";
|
||||
use lib "$FindBin::Bin/../../scripts/Modules";
|
||||
use lib "$FindBin::Bin/Modules";
|
||||
|
||||
use Util;
|
||||
use Modules::Filters;
|
||||
use Modules::Util;
|
||||
|
||||
use feature 'say';
|
||||
|
||||
@ -209,9 +209,10 @@ sub inject {
|
||||
|
||||
# Read catch flags written by build.pl into the experiment directory
|
||||
my $runner_flags_file = "$remote_builds_dir/$experiment/runner_flags";
|
||||
my @catch_flags = ();
|
||||
my @catch_flags = ();
|
||||
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>;
|
||||
close($rfh);
|
||||
}
|
||||
@ -272,16 +273,15 @@ sub inject {
|
||||
sub results {
|
||||
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) {
|
||||
my $query = $_;
|
||||
$query =~ s/\.pm//g;
|
||||
|
||||
# Util::notify("Running query $query for $experiment...");
|
||||
|
||||
Util::execute_query( $experiment, $query,
|
||||
$remote_db_conf, $remote_builds_dir, 1 );
|
||||
for my $query (@queries) {
|
||||
for my $config (@configs) {
|
||||
Util::execute_query( $experiment, $query,
|
||||
$remote_db_conf, $remote_builds_dir, 1, $config );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user