List:Commits« Previous MessageNext Message »
From:vasil.dimov Date:June 8 2012 2:00pm
Subject:bzr push into mysql-trunk branch (vasil.dimov:3976 to 3977) Bug#13966453
View as plain text  
 3977 Vasil Dimov	2012-06-08
      Fix Bug#13966453 CONCURRENT DML AND READS FROM I_S TABLES CRASH
      FETCH_DATA_INTO_CACHE_LOW
      
      Traversing the list trx_sys->mysql_trx_list should be done like:
      
        for (trx = UT_LIST_GET_FIRST(trx_sys->mysql_trx_list);
             trx != NULL;
             trx = UT_LIST_GET_NEXT(mysql_trx_list, trx)) {
      
      and not like:
      
        for (trx = UT_LIST_GET_FIRST(trx_sys->mysql_trx_list);
             trx != NULL;
             trx = UT_LIST_GET_NEXT(trx_list, trx)) {
      
      This bug was introduced in:
      
        * revision-id: sunny.bains@stripped
        * committer: Sunny Bains <Sunny.Bains@stripped>
        * branch nick: trunk
        * timestamp: Mon 2011-11-21 07:25:39 +1100
        * message:
        *   WL#6046 - Special handling of read-only transactions
        * ...
      
      Before that changeset the code only traversed trx_sys->trx_list like:
      
        for (trx = UT_LIST_GET_FIRST(trx_sys->trx_list);
             trx != NULL;
             trx = UT_LIST_GET_NEXT(trx_list, trx)) {
      
      and it did not fiddle with trx_sys->mysql_trx_list.
      
      In WL#6046 the code was changed so that trx_sys->trx_list in the
      initialization of the "for" loop became a parameter
      (trx_sys->mysql_trx_list is passed as that parameter), but the update
      statement of the "for" loop was not adjusted and was left like
      "trx = UT_LIST_GET_NEXT(trx_list, trx)".

    modified:
      storage/innobase/trx/trx0i_s.cc
 3976 Bjorn Munch	2012-06-08
      Fix RPM spec file so SuSE 11.1 is treated as 11

    modified:
      support-files/mysql.spec.sh
=== modified file 'storage/innobase/trx/trx0i_s.cc'
--- a/storage/innobase/trx/trx0i_s.cc	revid:bjorn.munch@stripped
+++ b/storage/innobase/trx/trx0i_s.cc	revid:vasil.dimov@stripped
@@ -1300,7 +1300,10 @@ fetch_data_into_cache_low(
 
 	for (trx = UT_LIST_GET_FIRST(*trx_list);
 	     trx != NULL;
-	     trx = UT_LIST_GET_NEXT(trx_list, trx)) {
+	     trx =
+	     (trx_list == &trx_sys->mysql_trx_list
+	      ? UT_LIST_GET_NEXT(mysql_trx_list, trx)
+	      : UT_LIST_GET_NEXT(trx_list, trx))) {
 
 		i_s_trx_row_t*		trx_row;
 		i_s_locks_row_t*	requested_lock_row;

No bundle (reason: useless for push emails).
Thread
bzr push into mysql-trunk branch (vasil.dimov:3976 to 3977) Bug#13966453vasil.dimov9 Jun