MySQL Lists are EOL. Please join:

List:Commits« Previous MessageNext Message »
From:Ingo Struewing Date:May 27 2008 7:49pm
Subject:bk commit into 6.0 tree (istruewing:1.2644) BUG#36979
View as plain text  
Below is the list of changes that have just been committed into a local
6.0 repository of istruewing.  When istruewing does a push these changes
will be propagated to the main repository and, within 24 hours after the
push, to the public repository.
For information on how to access the public repository
see http://dev.mysql.com/doc/mysql/en/installing-source-tree.html

ChangeSet@stripped, 2008-05-27 21:49:04+02:00, istruewing@stripped +4 -0
  Bug#36979 - merge-sync.test fails in pushbuild
  
  The test case failed randomly. When concurrent inserts are enabled,
  a SELECT in one connection does not always see rows inserted
  immediately before in another connection.
  See Bug#36618 - myisam insert not immediately visible to select
                  from another client.
  
  Fixed by disabling concurrent inserts for this test case.

  mysql-test/r/merge-sync.result@stripped, 2008-05-27 21:49:02+02:00, istruewing@stripped +3 -1
    Bug#36979 - merge-sync.test fails in pushbuild
    Fixed result.

  mysql-test/t/disabled.def@stripped, 2008-05-27 21:49:02+02:00, istruewing@stripped +0 -1
    Bug#36979 - merge-sync.test fails in pushbuild
    Re-enabled the test case.

  mysql-test/t/merge-sync.test@stripped, 2008-05-27 21:49:02+02:00, istruewing@stripped +30 -1
    Bug#36979 - merge-sync.test fails in pushbuild
    Fixed test case.

  sql/sql_parse.cc@stripped, 2008-05-27 21:49:02+02:00, istruewing@stripped +12 -0
    Bug#36979 - merge-sync.test fails in pushbuild
    Added debug synchronization points.

diff -Nrup a/mysql-test/r/merge-sync.result b/mysql-test/r/merge-sync.result
--- a/mysql-test/r/merge-sync.result	2008-04-29 11:22:02 +02:00
+++ b/mysql-test/r/merge-sync.result	2008-05-27 21:49:02 +02:00
@@ -1,6 +1,7 @@
 SET DEBUG_SYNC= 'RESET';
 drop table if exists t1,t2,t3,t4,t5,t6;
 drop database if exists mysqltest;
+SET GLOBAL concurrent_insert = 0;
 CREATE TABLE t1 (c1 INT) ENGINE= MyISAM;
 CREATE TABLE t2 (c1 INT) ENGINE= MRG_MYISAM UNION= (t1) INSERT_METHOD= LAST;
 connection con1
@@ -147,5 +148,6 @@ SET DEBUG_SYNC= 'now WAIT_FOR locked';
 UNLOCK TABLES;
 connection con1
 connection default;
-SET DEBUG_SYNC= 'RESET';
 DROP TABLE t1;
+SET DEBUG_SYNC= 'RESET';
+SET GLOBAL concurrent_insert = DEFAULT;
diff -Nrup a/mysql-test/t/disabled.def b/mysql-test/t/disabled.def
--- a/mysql-test/t/disabled.def	2008-05-26 17:29:07 +02:00
+++ b/mysql-test/t/disabled.def	2008-05-27 21:49:02 +02:00
@@ -54,6 +54,5 @@ character_set_database_func : Bug#36974 
 ddl_i18n_utf8               : Bug#36975 ddl_i18n_utf8.test fail in pushbuild
 delayed_queue_size_basic_64 : Bug#36976 delayed_queue_size_basic_64.test fails in pushbuild
 sql_low_priority_updates_func : Bug#36977 sql_low_priority_updates_func.test fails in pushbuild
-merge-sync                    : Bug#36979 merge-sync.test fails in pushbuild
 max_write_lock_count_basic_32 : Bug#36980 max_write_lock_count_basic_32.test fails in pushbuild
 
diff -Nrup a/mysql-test/t/merge-sync.test b/mysql-test/t/merge-sync.test
--- a/mysql-test/t/merge-sync.test	2008-04-29 11:22:02 +02:00
+++ b/mysql-test/t/merge-sync.test	2008-05-27 21:49:02 +02:00
@@ -12,6 +12,16 @@
 SET DEBUG_SYNC= 'RESET';
 drop table if exists t1,t2,t3,t4,t5,t6;
 drop database if exists mysqltest;
+#
+# Due to a performance gaining "misplacement" of sending ok to the
+# client, the server may not always see rows that have just been
+# inserted by another connection. Fixed by disabling concurrent inserts.
+# See Bug#36618 - myisam insert not immediately visible to select
+#                 from another client.
+# If you want to test it, remove the comment signs from the lines,
+# that do also mention Bug#36618, and the two other there mentioned lines.
+# Then change the set value in the next line.
+SET GLOBAL concurrent_insert = 0;
 --enable_warnings
 
 #
@@ -274,6 +284,16 @@ CREATE TABLE m1 (c1 INT) ENGINE=MRG_MYIS
                      SIGNAL attach WAIT_FOR store_lock1';
     SET DEBUG_SYNC= 'before_myisammrg_store_lock
                      SIGNAL store_lock2 WAIT_FOR flushed';
+    # Exploit Bug#36618	- myisam insert not immediately visible to select
+    #                     from another client
+    # Signal 'select_locking' to avoid waiting in the SET statement itself.
+    # Use EXECUTE 2 to survive execution in the SET statement itself.
+    # If you enable the 3 lines below, enable also the 2 lines, that
+    # SIGNAL select_locking, and don't run with an embedded server.
+    #SET DEBUG_SYNC= 'now SIGNAL select_locking';
+    #SET DEBUG_SYNC= 'after_dispatch_net_end_statement
+    #                 WAIT_FOR select_locking EXECUTE 2';
+    #
     send INSERT INTO m1 VALUES (2);
 --echo connection default;
 connection default;
@@ -295,7 +315,12 @@ FLUSH TABLE m1;
     disconnect con1;
 --echo connection default;
 connection default;
+# Let con1 finish the INSERT statement when SELECT is in wait_for_lock().
+#SET DEBUG_SYNC= 'wait_for_lock SIGNAL select_locking';
 SELECT * FROM m1;
+# When concurrent_insert is not disabled, SELECT does not need to wait
+# for lock. Kick INSERT out of its wait now.
+#SET DEBUG_SYNC= 'now SIGNAL select_locking';
 # Clear debug_sync signal.
 SET DEBUG_SYNC= 'RESET';
 DROP TABLE m1, t1;
@@ -378,7 +403,11 @@ UNLOCK TABLES;
 --echo connection default;
 connection default;
 #
+DROP TABLE t1;
+#
 # Clear debug_sync signal.
 SET DEBUG_SYNC= 'RESET';
-DROP TABLE t1;
+#
+# Reset concurrent inserts. It was changed at top of this file.
+SET GLOBAL concurrent_insert = DEFAULT;
 
diff -Nrup a/sql/sql_parse.cc b/sql/sql_parse.cc
--- a/sql/sql_parse.cc	2008-05-22 20:29:39 +02:00
+++ b/sql/sql_parse.cc	2008-05-27 21:49:02 +02:00
@@ -1063,6 +1063,12 @@ bool dispatch_command(enum enum_server_c
       char *beginning_of_next_stmt= (char*) end_of_stmt;
 
       net_end_statement(thd);
+      /*
+        Allow to exploit Bug#36618 - myisam insert not immediately
+                                     visible to select from another client.
+      */
+      DEBUG_SYNC(thd, "after_dispatch_net_end_statement");
+
       query_cache_end_of_result(thd);
       /*
         Multiple queries exits, execute them individually
@@ -1427,6 +1433,12 @@ bool dispatch_command(enum enum_server_c
   }
 
   net_end_statement(thd);
+  /*
+    Allow to exploit Bug#36618 - myisam insert not immediately
+    visible to select from another client.
+  */
+  DEBUG_SYNC(thd, "after_dispatch_net_end_statement");
+
   query_cache_end_of_result(thd);
 
   thd->proc_info= "closing tables";
Thread
bk commit into 6.0 tree (istruewing:1.2644) BUG#36979Ingo Struewing27 May
  • RE: bk commit into 6.0 tree (istruewing:1.2644) BUG#36979Chuck Bell9 Jun
    • Re: bk commit into 6.0 tree (istruewing:1.2644) BUG#36979Ingo Strüwing11 Jun