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::DrizzleTransactionLog;
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;
43
# do some setup and whatnot
44
if (exists $ENV{'MASTER_MYPORT'})
46
$main_port = $ENV{'MASTER_MYPORT'};
52
if (exists $ENV{'BOT0_S1'})
54
$validator_port = $ENV{'BOT0_S1'};
58
$validator_port = '9307';
60
if (exists $ENV{'DRIZZLE_BASEDIR'})
62
$basedir = $ENV{'DRIZZLE_BASEDIR'};
66
$basedir= $reporter->serverVariable('basedir');
68
my $drizzledump = $basedir.'/client/drizzledump' ;
69
my $drizzle_client = $basedir.'/client/drizzle' ;
70
my $transaction_reader;
71
if (exists $ENV{'DRIZZLE_TRX_READER'})
73
$transaction_reader = $ENV{'DRIZZLE_TRX_READER'}
75
elsif (-e $basedir.'/drizzled/message/transaction_reader')
77
$transaction_reader = $basedir.'/drizzled/message/transaction_reader';
81
$transaction_reader = $basedir.'/plugin/transaction_log/utilities/drizzletrx' ;
84
# transaction log location can vary depending on how we start the server
85
# we really only account for test-run and drizzle-automation starts
86
my $transaction_log = '';
87
if (-e $basedir.'/var/local/transaction.log')
89
$transaction_log = $basedir.'/var/local/transaction.log' ;
91
elsif (-e $basedir.'/tests/workdir/bot0/s0/var/master-data/local/transaction.log')
93
$transaction_log = $basedir.'/tests/workdir/bot0/s0/var/master-data/local/transaction.log' ;
97
$transaction_log = $basedir.'/tests/var/master-data/local/transaction.log' ;
99
my $transaction_log_copy = tmpdir()."/translog_".$$."_.log" ;
100
copy($transaction_log, $transaction_log_copy);
103
# We now attempt to replicate from the transaction log
104
# We call transaction_reader and send the output
105
# via the drizzle client to the validation server (slave)
106
my $transaction_log_sql_file = tmpdir()."/translog_".$$."_.sql" ;
107
say("transaction_log output file: $transaction_log_sql_file");
108
say("$transaction_reader -uroot $transaction_log > $transaction_log_sql_file");
109
system("$transaction_reader -uroot $transaction_log > $transaction_log_sql_file") ;
110
say("Replicating from transaction_log output...");
111
my $rpl_command = "$drizzle_client --host=127.0.0.1 --port=$validator_port --user=root test < $transaction_log_sql_file";
112
say ("$rpl_command");
113
my $drizzle_rpl_result = system($rpl_command) ;
114
return STATUS_UNKNOWN_ERROR if $drizzle_rpl_result > 0 ;
117
say("Validating replication via dumpfile compare...");
119
my @ports = ($main_port, $validator_port);
121
foreach my $port_id (0..1)
123
$files[$port_id] = tmpdir()."/translog_rpl_dump_".$$."_".$ports[$port_id].".sql";
124
say("$files[$port_id]");
125
say("$drizzledump --compact --skip-extended-insert --host=127.0.0.1 --port=$ports[$port_id] --user=root test >$files[$port_id]");
126
my $drizzledump_result = system("$drizzledump --compact --skip-extended-insert --host=127.0.0.1 --port=$ports[$port_id] --user=root test >$files[$port_id]");
127
# disable pipe to 'sort' from drizzledump call above
128
#| sort > $files[$port_id]");
129
return STATUS_UNKNOWN_ERROR if $drizzledump_result > 0;
131
say ("Executing diff --unified $files[SERVER1_FILE_NAME] $files[SERVER2_FILE_NAME]");
132
my $diff_result = system("diff --unified $files[SERVER1_FILE_NAME] $files[SERVER2_FILE_NAME]");
133
$diff_result = $diff_result >> 8;
134
say ("Cleaning up validation server...");
135
system("$drizzle_client --host=127.0.0.1 --port=$validator_port --user=root -e 'DROP SCHEMA test'");
137
say ("Resetting validation server...");
138
my $create_schema_result = system("$drizzle_client --host=127.0.0.1 --port=$validator_port --user=root -e 'CREATE SCHEMA test'");
139
say("$create_schema_result");
141
return STATUS_UNKNOWN_ERROR if $diff_result > 1;
143
if ($diff_result == 1)
145
say("Differences between the two servers were found after comparing dumpfiles");
146
say("diff command: diff --unified $files[SERVER1_FILE_NAME] $files[SERVER2_FILE_NAME]");
147
say("Master dumpfile: $files[SERVER1_FILE_NAME]");
148
say("Slave dumpfile: $files[SERVER2_FILE_NAME]");
149
say("transaction_log output file: $transaction_log_sql_file");
150
say("Transaction log: $transaction_log_copy");
151
return STATUS_REPLICATION_FAILURE;
155
foreach my $file (@files)
159
unlink($transaction_log_sql_file);
160
unlink($transaction_log_copy);
169
return REPORTER_TYPE_ALWAYS;