1
# Copyright (C) 2008-2009 Sun Microsystems, Inc. All rights reserved.
2
# Use is subject to license terms.
4
# This program is free software; you can redistribute it and/or modify
5
# it under the terms of the GNU General Public License as published by
6
# the Free Software Foundation; version 2 of the License.
8
# This program is distributed in the hope that it will be useful, but
9
# WITHOUT ANY WARRANTY; without even the implied warranty of
10
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11
# General Public License for more details.
13
# You should have received a copy of the GNU General Public License
14
# along with this program; if not, write to the Free Software
15
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
18
package GenTest::Reporter::DrizzleSlavePlugin;
21
@ISA = qw(GenTest::Reporter);
26
use GenTest::Constants;
27
use GenTest::Reporter;
33
use constant SERVER1_FILE_NAME => 0;
34
use constant SERVER2_FILE_NAME => 1;
41
# do some setup and whatnot
46
if (exists $ENV{'MASTER_MYPORT'})
48
$main_port = $ENV{'MASTER_MYPORT'};
54
if (exists $ENV{'BOT0_S1'})
56
$validator_port = $ENV{'BOT0_S1'};
60
$validator_port = '9307';
62
if (exists $ENV{'DRIZZLE_BASEDIR'})
64
$basedir = $ENV{'DRIZZLE_BASEDIR'};
68
$basedir= $reporter->serverVariable('basedir');
70
my $drizzledump = $basedir.'/client/drizzledump' ;
71
my $drizzle_client = $basedir.'/client/drizzle' ;
72
my $transaction_reader;
73
if (exists $ENV{'DRIZZLE_TRX_READER'})
75
$transaction_reader = $ENV{'DRIZZLE_TRX_READER'}
77
elsif (-e $basedir.'/drizzled/message/transaction_reader')
79
$transaction_reader = $basedir.'/drizzled/message/transaction_reader';
83
$transaction_reader = $basedir.'/plugin/transaction_log/utilities/drizzletrx' ;
86
# transaction log location can vary depending on how we start the server
87
# we really only account for test-run and drizzle-automation starts
88
my $transaction_log = '';
89
if (-e $basedir.'/var/local/transaction.log')
91
$transaction_log = $basedir.'/var/local/transaction.log' ;
93
elsif (-e $basedir.'/tests/workdir/bot0/s0/var/master-data/local/transaction.log')
95
$transaction_log = $basedir.'/tests/workdir/bot0/s0/var/master-data/local/transaction.log' ;
99
$transaction_log = $basedir.'/tests/var/master-data/local/transaction.log' ;
101
my $transaction_log_copy = tmpdir()."/translog_".$$."_.log" ;
102
copy($transaction_log, $transaction_log_copy);
104
say("Waiting for slave to catch up...");
106
my $slave_dsn="dbi:drizzle:host=localhost:port=$validator_port:user=root:password='':database=sys_replication";
107
my $slave_dbh = DBI->connect($slave_dsn, undef, undef, {PrintError => 0});
108
my $master_dbh = DBI->connect($reporter->dsn(), undef, undef, {PrintError => 0});
112
my @max_slave_id_res = $slave_dbh->selectrow_array('SELECT last_applied_commit_id from applier_state');
113
my $max_slave_id = @max_slave_id_res->[0] ;
114
my @max_master_id_res = $master_dbh->selectrow_arrayref("SELECT MAX(commit_id) from DATA_DICTIONARY.SYS_REPLICATION_LOG");
115
my $max_master_id = @max_master_id_res->[0]->[0] ;
116
if ($max_slave_id == $max_master_id)
121
#say ("$max_slave_id");
122
#say ("$max_master_id");
125
say("Validating replication via dumpfile compare...");
127
my @ports = ($main_port, $validator_port);
129
foreach my $port_id (0..1)
131
$files[$port_id] = tmpdir()."/translog_rpl_dump_".$$."_".$ports[$port_id].".sql";
132
say("$files[$port_id]");
133
say("$drizzledump --compact --skip-extended-insert --host=127.0.0.1 --port=$ports[$port_id] --user=root test >$files[$port_id]");
134
my $drizzledump_result = system("$drizzledump --compact --skip-extended-insert --host=127.0.0.1 --port=$ports[$port_id] --user=root test >$files[$port_id]");
135
# disable pipe to 'sort' from drizzledump call above
136
#| sort > $files[$port_id]");
137
return STATUS_UNKNOWN_ERROR if $drizzledump_result > 0;
139
say ("Executing diff --unified $files[SERVER1_FILE_NAME] $files[SERVER2_FILE_NAME]");
140
my $diff_result = system("diff --unified $files[SERVER1_FILE_NAME] $files[SERVER2_FILE_NAME]");
141
$diff_result = $diff_result >> 8;
144
return STATUS_UNKNOWN_ERROR if $diff_result > 1;
146
if ($diff_result == 1)
148
say("Differences between the two servers were found after comparing dumpfiles");
149
say("diff command: diff --unified $files[SERVER1_FILE_NAME] $files[SERVER2_FILE_NAME]");
150
say("Master dumpfile: $files[SERVER1_FILE_NAME]");
151
say("Slave dumpfile: $files[SERVER2_FILE_NAME]");
152
#say ("$max_slave_id");
153
#say ("$max_master_id");
154
return STATUS_REPLICATION_FAILURE;
158
foreach my $file (@files)
170
return REPORTER_TYPE_ALWAYS;