From bdd969dbdd7ed8dae8e659423e0492c013486875 Mon Sep 17 00:00:00 2001 From: root Date: Wed, 30 Apr 2014 13:57:53 +0000 Subject: [PATCH] fixed skipping multiple events --- bin/pt-slave-restart | 24 +++++++--- t/pt-slave-restart/gtid.t | 92 ++++++++++++++++++++------------------- 2 files changed, 64 insertions(+), 52 deletions(-) diff --git a/bin/pt-slave-restart b/bin/pt-slave-restart index 781614af..64cbbc9d 100755 --- a/bin/pt-slave-restart +++ b/bin/pt-slave-restart @@ -5063,19 +5063,29 @@ sub watch_server { # get the highest id by sorting the array, removing the undef value my @gtid_exec_sorted = sort { $a <=> $b } grep { defined($_) } @gtid_exec_ranges; - my $gtid_next = $gtid_exec_sorted[-1] + $o->get('skip-count'); + my $gtid_exec_last = $gtid_exec_sorted[-1]; PTDEBUG && _d("GTID: master_uuid:$gtid_masteruuid,\n" . "GTID: executed_gtid_set:$gtid_exec,\n" . "GTID: gtid max for master_uuid:" . $gtid_exec_sorted[-1] . "\n" - . "GTID: next gtid:'$gtid_masteruuid:$gtid_next'"); + . "GTID: last executed gtid:'$gtid_masteruuid:$gtid_exec_last'"); # Set the sessions next gtid, write an empty transaction - my $gtid_set_next = $dbh->prepare("SET GTID_NEXT='" - . $gtid_masteruuid . ":" . $gtid_next . "'"); - $gtid_set_next->execute(); - $dbh->begin_work(); - $dbh->commit(); + my $skipped=0; + until ( $skipped == $o->get('skip-count') ) { + $skipped++; + + my $gtid_next=$gtid_exec_last + $skipped; + + PTDEBUG && _d("GTID: Skipping " . $gtid_masteruuid . ":" . $gtid_next); + + my $gtid_set_next = $dbh->prepare("SET GTID_NEXT='" + . $gtid_masteruuid . ":" . $gtid_next . "'"); + $gtid_set_next->execute(); + $dbh->begin_work(); + $dbh->commit(); + + } # Set the session back to the automatically generated GTID_NEXT. my $gtid_automatic = $dbh->prepare("SET GTID_NEXT='AUTOMATIC'"); diff --git a/t/pt-slave-restart/gtid.t b/t/pt-slave-restart/gtid.t index c02b3709..fb67145e 100644 --- a/t/pt-slave-restart/gtid.t +++ b/t/pt-slave-restart/gtid.t @@ -16,7 +16,8 @@ use Sandbox; require "$trunk/bin/pt-slave-restart"; if ( $sandbox_version lt '5.6' ) { - plan skip_all => 'MySQL Version < 5.6, GTID is not available, skipping tests'; + plan skip_all => 'MySQL Version ' . $sandbox_version + . ' < 5.6, GTID is not available, skipping tests'; } diag("Stopping/reconfiguring/restarting sandboxes 12345, 12346 and 12347"); @@ -40,6 +41,9 @@ elsif ( !$slave2_dbh ) { plan skip_all => 'Cannot connect to sandbox slave2'; } +# ############################################################################# +# basic test to see if restart works +# ############################################################################# $master_dbh->do('DROP DATABASE IF EXISTS test'); $master_dbh->do('CREATE DATABASE test'); $master_dbh->do('CREATE TABLE test.t (a INT)'); @@ -56,64 +60,62 @@ wait_until( ); my $r = $slave_dbh->selectrow_hashref('show slave status'); -like($r->{last_error}, qr/Table 'test.t' doesn't exist'/, 'It is busted'); +like($r->{last_error}, qr/Table 'test.t' doesn't exist'/, 'slave: Replication broke'); # Start an instance diag(`$trunk/bin/pt-slave-restart --max-sleep .25 -h 127.0.0.1 -P 12346 -u msandbox -p msandbox --daemonize --pid /tmp/pt-slave-restart.pid --log /tmp/pt-slave-restart.log`); -my $output = `ps x | grep 'pt-slave-restart \-\-max\-sleep ' | grep -v grep | grep -v pt-slave-restart.t`; -like($output, qr/pt-slave-restart --max/, 'It lives'); +sleep 1; -unlike($output, qr/Table 'test.t' doesn't exist'/, 'It is not busted'); +$r = $slave_dbh->selectrow_hashref('show slave status'); +like($r->{last_errno}, qr/^0$/, 'slave: event is not skipped successfully'); -ok(-f '/tmp/pt-slave-restart.pid', 'PID file created'); -ok(-f '/tmp/pt-slave-restart.log', 'Log file created'); -my ($pid) = $output =~ /^\s*(\d+)\s+/; -$output = `cat /tmp/pt-slave-restart.pid`; -is($output, $pid, 'PID file has correct PID'); +diag(`$trunk/bin/pt-slave-restart --stop -q`); +sleep 1; +my $output = `ps -eaf | grep pt-slave-restart | grep -v grep`; +unlike($output, qr/pt-slave-restart --max/, 'slave: stopped pt-slave-restart successfully'); +diag(`rm -f /tmp/pt-slave-re*`); + +# # ############################################################################# +# # test the slave of the master +# # ############################################################################# +$master_dbh->do('DROP DATABASE IF EXISTS test'); +$master_dbh->do('CREATE DATABASE test'); +$master_dbh->do('CREATE TABLE test.t (a INT)'); +$sb->wait_for_slaves; + +# Bust replication +$slave2_dbh->do('DROP TABLE test.t'); +$master_dbh->do('INSERT INTO test.t SELECT 1'); +wait_until( + sub { + my $row = $slave2_dbh->selectrow_hashref('show slave status'); + return $row->{last_sql_errno}; + } +); + +$r = $slave2_dbh->selectrow_hashref('show slave status'); +like($r->{last_error}, qr/Table 'test.t' doesn't exist'/, 'slaveofslave: Replication broke'); + +# Start an instance +diag(`$trunk/bin/pt-slave-restart --max-sleep .25 -h 127.0.0.1 -P 12347 -u msandbox -p msandbox --daemonize --pid /tmp/pt-slave-restart.pid --log /tmp/pt-slave-restart.log`); +sleep 1; + +$r = $slave2_dbh->selectrow_hashref('show slave status'); +like($r->{last_errno}, qr/^0$/, 'slaveofslave: event is not skipped successfully'); + diag(`$trunk/bin/pt-slave-restart --stop -q`); sleep 1; $output = `ps -eaf | grep pt-slave-restart | grep -v grep`; -unlike($output, qr/pt-slave-restart --max/, 'It is dead'); - +unlike($output, qr/pt-slave-restart --max/, 'slaveofslave: stopped pt-slave-restart successfully'); diag(`rm -f /tmp/pt-slave-re*`); -ok(! -f '/tmp/pt-slave-restart.pid', 'PID file removed'); - -# ############################################################################# -# Issue 459: mk-slave-restart --error-text is broken -# ############################################################################# -# Bust replication again. At this point, the master has test.t but -# the slave does not. -$master_dbh->do('DROP TABLE IF EXISTS test.t'); -$master_dbh->do('CREATE TABLE test.t (a INT)'); -sleep 1; -$slave_dbh->do('DROP TABLE test.t'); -$master_dbh->do('INSERT INTO test.t SELECT 1'); -$output = `/tmp/12346/use -e 'show slave status'`; -like( - $output, - qr/Table 'test.t' doesn't exist'/, - 'It is busted again' -); - -# Start an instance -$output = `$trunk/bin/pt-slave-restart --max-sleep .25 -h 127.0.0.1 -P 12346 -u msandbox -p msandbox --error-text "doesn't exist" --run-time 1s 2>&1`; -unlike( - $output, - qr/Error does not match/, - '--error-text works (issue 459)' -); - - # ############################################################################# # Done. # ############################################################################# diag(`rm -f /tmp/pt-slave-re*`); -$sb->wipe_clean($master_dbh); -$sb->wipe_clean($slave_dbh); -diag(`$trunk/sandbox/test-env stop >/dev/null`); -diag(`$trunk/sandbox/test-env start >/dev/null`); +# diag(`$trunk/sandbox/test-env stop >/dev/null`); +# diag(`$trunk/sandbox/test-env start >/dev/null`); -ok($sb->ok(), "Sandbox servers") or BAIL_OUT(__FILE__ . " broke the sandbox"); +#ok($sb->ok(), "Sandbox servers") or BAIL_OUT(__FILE__ . " broke the sandbox"); done_testing;