Commit d8180d44 authored by unknown's avatar unknown
Browse files

Fix for BUG#20716: SHOW INSTANCES statement causes races in IM tests.

  
Fix for the bug in mysql-test-run.pl which prevents other tests succeed
after IM-test failure.
  
The idea of the fix of BUG#20716 is to:
  1. Check each SHOW INSTANCES statement, add necessary "sleep" instruction before;
  2. Move all environment checkings into the one file and include it everywhere.


mysql-test/mysql-test-run.pl:
  Fix bug in mysql-test-run.pl -- kill leftovers if some
  guarded mysqld-instance is still alive after IM shutdown.
mysql-test/r/im_daemon_life_cycle.result:
  Updated result file.
mysql-test/r/im_life_cycle.result:
  Updated result file.
mysql-test/r/im_options_set.result:
  Updated result file.
mysql-test/r/im_options_unset.result:
  Updated result file.
mysql-test/r/im_utils.result:
  Updated result file.
mysql-test/t/im_daemon_life_cycle.imtest:
  Include im_check_env.inc for the checking of environment.
mysql-test/t/im_life_cycle.imtest:
  Include im_check_env.inc for the checking of environment.
mysql-test/t/im_options_set.imtest:
  Include im_check_env.inc for the checking of environment.
mysql-test/t/im_options_unset.imtest:
  Include im_check_env.inc for the checking of environment.
mysql-test/t/im_utils.imtest:
  Include im_check_env.inc for the checking of environment.
mysql-test/include/im_check_env.inc:
  A new file to be included in each IM-test.
  The statements in the file ensure that starting
  conditions (environment) are as expected.
parent ec4a7522
Loading
Loading
Loading
Loading
+27 −0
Original line number Diff line number Diff line
# This file is intended to be used in each IM-test. It contains stamements,
# that ensure that starting conditions (environment) for the IM-test are as
# expected.

# Wait for mysqld1 (guarded instance) to start.

--exec $MYSQL_TEST_DIR/t/wait_for_process.sh $IM_MYSQLD1_PATH_PID 30 started

# Check the running instances.

--connect (mysql1_con,localhost,root,,mysql,$IM_MYSQLD1_PORT,$IM_MYSQLD1_SOCK)

--connection mysql1_con

SHOW VARIABLES LIKE 'server_id';

--connection default

# Let IM detect that mysqld1 is online. This delay should be longer than
# monitoring interval.

--sleep 2

# Check that IM understands that mysqld1 is online, while mysqld2 is
# offline.

SHOW INSTANCES;
+22 −0
Original line number Diff line number Diff line
@@ -2898,12 +2898,16 @@ sub im_stop($) {

  while (1)
  {
    # Check that IM-main died.

    if (kill (0, $instance_manager->{'pid'}))
    {
      mtr_debug("IM-main is still alive.");
      last;
    }

    # Check that IM-angel died.

    if (defined $instance_manager->{'angel_pid'} &&
        kill (0, $instance_manager->{'angel_pid'}))
    {
@@ -2911,21 +2915,39 @@ sub im_stop($) {
      last;
    }

    # Check that all guarded mysqld-instances died.

    my $guarded_mysqlds_dead= 1;

    foreach my $pid (@mysqld_pids)
    {
      if (kill (0, $pid))
      {
        mtr_debug("Guarded mysqld ($pid) is still alive.");
        $guarded_mysqlds_dead= 0;
        last;
      }
    }

    last unless $guarded_mysqlds_dead;

    # Ok, all necessary processes are dead.

    $clean_shutdown= 1;
    last;
  }

  # Kill leftovers (the order is important).

  if ($clean_shutdown)
  {
    mtr_debug("IM-shutdown was clean -- all processed died.");
  }
  else
  {
    mtr_debug("IM failed to shutdown gracefully. We have to clean the mess...");
  }

  unless ($clean_shutdown)
  {

+3 −0
Original line number Diff line number Diff line
Success: the process has been started.
SHOW VARIABLES LIKE 'server_id';
Variable_name	Value
server_id	1
SHOW INSTANCES;
instance_name	status
mysqld1	online
+3 −8
Original line number Diff line number Diff line

--------------------------------------------------------------------
-- 1.1.1.
--------------------------------------------------------------------
Success: the process has been started.
SHOW VARIABLES LIKE 'server_id';
Variable_name	Value
server_id	1
SHOW INSTANCES;
instance_name	status
mysqld1	online
@@ -40,10 +39,6 @@ ERROR HY000: Bad instance name. Check that the instance with such a name exists
--------------------------------------------------------------------
-- 1.1.6.
--------------------------------------------------------------------
SHOW INSTANCES;
instance_name	status
mysqld1	online
mysqld2	offline
Killing the process...
Sleeping...
Success: the process was restarted.
+5 −2
Original line number Diff line number Diff line
server_id           = 1
server_id           = 2
Success: the process has been started.
SHOW VARIABLES LIKE 'server_id';
Variable_name	Value
server_id	1
SHOW INSTANCES;
instance_name	status
mysqld1	online
mysqld2	offline
SET mysqld1.server_id = 11;
server_id =11
server_id           = 2
Loading