1
# This program is free software; you can redistribute it and/or modify
2
# it under the terms of the GNU General Public License as published by
3
# the Free Software Foundation; version 2 of the License.
5
# This program is distributed in the hope that it will be useful, but
6
# WITHOUT ANY WARRANTY; without even the implied warranty of
7
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
8
# General Public License for more details.
10
# You should have received a copy of the GNU General Public License
11
# along with this program; if not, write to the Free Software
12
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
17
package GenTest::Validator::Performance;
19
@ISA = qw(GenTest GenTest::Validator);
24
use GenTest::Constants;
25
use GenTest::Executor;
27
use GenTest::Validator;
28
use GenTest::Comparator;
34
my ($comparator, $executors) = @_;
36
foreach my $executor (@$executors) {
37
if (!$executor->read_only()) {
38
say("Executor for dsn: ".$executor->dsn()." has been granted more than just SELECT privilege. Please restrict the user and try again");
39
return STATUS_ENVIRONMENT_FAILURE;
41
$executor->setFlags($executor->flags() | EXECUTOR_FLAG_PERFORMANCE | EXECUTOR_FLAG_HASH_DATA );
49
my ($comparator, $executors, $results) = @_;
51
die "Performance validator only works with two servers" if $#$results != 1;
53
if ($results->[0]->query() !~ m{^\s*SELECT}sio) {
54
$counters{'non-SELECT queries'}++;
55
return STATUS_WONT_HANDLE;
56
} elsif ($results->[0]->status() != $results->[1]->status()) {
57
say("The two servers returned different status codes for query: ".$results->[0]->query());
58
say("Server 1: status: ".$results->[0]->status()."; errstr: ".$results->[0]->errstr());
59
say("Server 2: status: ".$results->[1]->status()."; errstr: ".$results->[1]->errstr());
60
return STATUS_ERROR_MISMATCH;
61
} elsif (GenTest::Comparator::compare($results->[0], $results->[1]) != STATUS_OK) {
62
say("The two servers returned different result sets for query: ".$results->[0]->query());
63
return STATUS_CONTENT_MISMATCH;
67
my @performances = ($results->[0]->performance(), $results->[1]->performance() );
68
my @status_variables = ($performances[0]->sessionStatusVariables(), $performances[1]->sessionStatusVariables());
70
my @variable_names = keys %{$status_variables[0]};
76
foreach my $variable_name (@variable_names) {
77
my @values = ($status_variables[0]->{$variable_name} , $status_variables[1]->{$variable_name});
78
next if not defined $values[0] || not defined $values[1];
79
next if $values[0] eq '' || $values[1] eq '';
80
next if $values[0] eq $values[1];
82
my $diff = abs($values[0] - $values[1]);
85
my ($bigger_server, $smaller_server);
86
if ($values[0] > $values[1]) {
95
# if ($values[$smaller_server] eq '0') {
97
# say ("Variable $variable_name is non-zero on $bigger_server: $values[$bigger_server]");
99
my $increase = $values[$smaller_server] == 0 ? $values[$bigger_server] : ($values[$bigger_server] / $values[$smaller_server]);
100
if ($increase > 10) {
102
# = $notable + ( $bigger_server == 0 ? 1 : -1 );
103
say ("Variable $variable_name is bigger on $bigger_server: $values[$bigger_server] vs. $values[$smaller_server]");
109
say("^^^ ($notable) query was: ".$results->[0]->query());