11
use GenTest::Generator::FromDirectory;
12
use GenTest::QueryPerformance;
13
use GenTest::QueryPerformanceDelta;
14
use GenTest::Executor;
15
use GenTest::Executor::MySQL;
16
use GenTest::Constants;
17
use GenTest::Comparator;
21
my (@dsns, $filter, $in_dir_name, $out_file_name);
23
say("Please see http://forge.mysql.com/wiki/Category:RandomQueryGenerator for more information on this test framework.");
24
say("Starting $0 ".join(" ", @ARGV));
26
my $opt_result = GetOptions(
27
'dsn1=s' => \$dsns[0],
28
'dsn2=s' => \$dsns[1],
29
'input-directory=s' => \$in_dir_name,
30
'output-file=s' => \$out_file_name,
31
'filter=s' => \$filter
34
if ($opt_result == 0) {
35
exit(STATUS_ENVIRONMENT_FAILURE);
36
} elsif (not (defined $dsns[0] && defined $dsns[1] && defined $in_dir_name)) {
37
say("The following options are required: --dsn1 , --dsn2 , --input-directory");
38
exit(STATUS_ENVIRONMENT_FAILURE);
41
if (defined $out_file_name) {
42
open (OUT_FILE, ">$out_file_name") or die "Unable to open output file $out_file_name: $!";
43
say("Dumping results to $out_file_name.");
44
select OUT_FILE; $| = 1; select STDOUT;
47
if (not defined $filter) {
48
say("No filter defined. All results will be dumped.");
50
say("Filter: $filter") if defined $filter;
55
foreach my $server_id (0..1) {
56
say("Connecting to server at DSN $dsns[$server_id] ...");
57
my $executor = GenTest::Executor->newFromDSN($dsns[$server_id]);
59
exit(STATUS_ENVIRONMENT_FAILURE) if $executor->init() != STATUS_OK;
61
# if (!$executor->read_only()) {
62
# say("Executor for dsn: ".$executor->dsn()." has been granted more than just SELECT privilege. Please restrict the user and try again");
63
# exit(STATUS_ENVIRONMENT_FAILURE);
65
$executor->setFlags($executor->flags() | EXECUTOR_FLAG_PERFORMANCE | EXECUTOR_FLAG_HASH_DATA );
68
# $executor->execute("SET GLOBAL innodb_stats_sample_pages = 128");
69
# $executor->execute("SHOW TABLE STATUS");
71
$executors[$server_id] = $executor;
75
my $generator = GenTest::Generator::FromDirectory->new( directory_name => $in_dir_name );
77
incoming_queries => 0,
78
executed_queries => 0,
79
reported_queries => 0,
81
diverging_queries => 0
84
query: while (my $query_ref = $generator->next(\@executors)) {
85
$counters{incoming_queries}++;
86
last if $query_ref == STATUS_EOF;
87
my $query = $query_ref->[0];
88
next if $query !~ m{\s*SELECT}sgio;
89
$counters{executed_queries}++;
91
foreach my $temperature ('cold','warm') {
93
foreach my $server_id (0..1) {
94
$results[$server_id] = $executors[$server_id]->execute($query);
97
if (($results[0]->status() != STATUS_OK) || ($results[1]->status() != STATUS_OK)) {
98
$counters{error_queries}++;
100
} elsif (GenTest::Comparator::compare($results[0], $results[1]) != STATUS_OK) {
101
say("The two servers returned different result sets for query: $query ;");
102
$counters{diverging_queries}++;
106
my $performance_delta = GenTest::QueryPerformanceDelta->new(
108
temperature => $temperature,
109
performances => [ $results[0]->performance() , $results[1]->performance() ]
112
if ($performance_delta->matchesFilter($filter) == STATUS_OK) {
113
$counters{reported_queries}++;
114
print $performance_delta->toString();
115
print OUT_FILE $performance_delta->serialize() if defined $out_file_name;
120
say("Run statistics:");
121
say("Incoming: $counters{incoming_queries} queries.");
122
say("Executed: $counters{executed_queries} queries.");
123
say("Reported: $counters{reported_queries} queries.");
125
say("Errors: $counters{error_queries} queries.");
126
say("Diverging results: $counters{diverging_queries} queries.");
128
close OUT_FILE if defined $out_file_name;