List:Commits« Previous MessageNext Message »
From:Kristofer Pettersson Date:September 30 2009 12:50pm
Subject:bzr commit into mysql-5.0-bugteam branch (kristofer.pettersson:2812)
Bug#34895
View as plain text  
#At file:///Users/thek/Development/mysql-5.0-bugteam/ based on revid:dao-gang.qu@stripped

 2812 Kristofer Pettersson	2009-09-30
      Bug#34895 'show procedure status' or 'show function status' +
                'flush tables' crashes
      
      The server crashes when 'show procedure status' and 'flush tables' are
      run concurrently.
      
      This is caused by the way mysql.proc table is added twice to the list
      of table to lock although the requirements on the current locking API
      assumes differently.
      
      No test case is submitted because of the nature of the crash which is 
      currently difficult to reproduce in a deterministic way.
      
      This is a backport from 5.1
     @ myisam/mi_dbug.c
        * check_table_is_closed is only used in EXTRA_DEBUG mode but since it is
        iterating over myisam shared data it still needs to be protected by an
        appropriate mutex.
     @ sql/sql_yacc.yy
        * Since the I_S mechanism is already handling the open and close of 
        mysql.proc there is no need for the method sp_add_to_query_tables.

    modified:
      myisam/mi_dbug.c
      sql/sql_yacc.yy
=== modified file 'myisam/mi_dbug.c'
--- a/myisam/mi_dbug.c	2006-12-31 00:02:27 +0000
+++ b/myisam/mi_dbug.c	2009-09-30 12:50:25 +0000
@@ -171,7 +171,7 @@ my_bool check_table_is_closed(const char
   char filename[FN_REFLEN];
   LIST *pos;
   DBUG_ENTER("check_table_is_closed");
-
+  pthread_mutex_lock(&THR_LOCK_myisam);
   (void) fn_format(filename,name,"",MI_NAME_IEXT,4+16+32);
   for (pos=myisam_open_list ; pos ; pos=pos->next)
   {
@@ -181,12 +181,14 @@ my_bool check_table_is_closed(const char
     {
       if (share->last_version)
       {
-	fprintf(stderr,"Warning:  Table: %s is open on %s\n", name,where);
-	DBUG_PRINT("warning",("Table: %s is open on %s", name,where));
-	DBUG_RETURN(1);
+        fprintf(stderr,"Warning:  Table: %s is open on %s\n", name,where);
+        DBUG_PRINT("warning",("Table: %s is open on %s", name,where));
+        pthread_mutex_unlock(&THR_LOCK_myisam);
+        DBUG_RETURN(1);
       }
     }
   }
+  pthread_mutex_unlock(&THR_LOCK_myisam);
   DBUG_RETURN(0);
 }
 #endif /* EXTRA_DEBUG */

=== modified file 'sql/sql_yacc.yy'
--- a/sql/sql_yacc.yy	2009-09-29 15:06:51 +0000
+++ b/sql/sql_yacc.yy	2009-09-30 12:50:25 +0000
@@ -8276,8 +8276,6 @@ show_param:
             LEX *lex= Lex;
             lex->sql_command= SQLCOM_SELECT;
             lex->orig_sql_command= SQLCOM_SHOW_STATUS_PROC;
-	    if (!sp_add_to_query_tables(YYTHD, lex, "mysql", "proc", TL_READ))
-	      MYSQL_YYABORT;
             if (prepare_schema_table(YYTHD, lex, 0, SCH_PROCEDURES))
               MYSQL_YYABORT;
 	  }
@@ -8286,8 +8284,6 @@ show_param:
             LEX *lex= Lex;
             lex->sql_command= SQLCOM_SELECT;
             lex->orig_sql_command= SQLCOM_SHOW_STATUS_FUNC;
-	    if (!sp_add_to_query_tables(YYTHD, lex, "mysql", "proc", TL_READ))
-	      MYSQL_YYABORT;
             if (prepare_schema_table(YYTHD, lex, 0, SCH_PROCEDURES))
               MYSQL_YYABORT;
 	  }


Attachment: [text/bzr-bundle]
Thread
bzr commit into mysql-5.0-bugteam branch (kristofer.pettersson:2812)Bug#34895Kristofer Pettersson30 Sep
  • Re: bzr commit into mysql-5.0-bugteam branch(kristofer.pettersson:2812) Bug#34895Konstantin Osipov30 Sep