Update faults filtering to be selectable from menu

This commit is contained in:
2026-06-13 21:22:56 +02:00
parent 797c9512b4
commit b344c55eee
8 changed files with 176 additions and 95 deletions

View 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;

View File

@ -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.

View File

@ -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; }

View File

@ -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;

View File

@ -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 { }

View File

@ -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; }

View File

@ -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 );
}
}
}
},

View File

@ -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 );
}
}
}