List:Commits« Previous MessageNext Message »
From:Satya B Date:July 17 2009 8:43am
Subject:bzr commit into mysql-5.0-bugteam branch (satya.bn:2787) Bug#18828
View as plain text  
#At file:///home/satya/WORK/18828/mysql-5.0-bugteam-18828/ based on revid:joro@stripped

 2787 Satya B	2009-07-17
      Fix for BUG#18828 - If InnoDB runs out of undo slots, 
                          it returns misleading 'table is full'
      
      Innodb returns a misleading error message "table is full" 
      when the number of active concurrent transactions is greater
      than 1024.
      
      Fixed by adding errorcode "ER_TOO_MANY_CONCURRENT_TRXS" to the
      error codes. Innodb should return HA_TOO_MANY_CONCURRENT_TRXS
      to mysql which is then mapped to ER_TOO_MANY_CONCURRENT_TRXS
      
      
      Note: testcase is not written as this was reproducible only by
            changing innodb code.
      modified:
        extra/perror.c
        include/my_base.h
        sql/ha_innodb.cc
        sql/handler.cc
        sql/share/errmsg.txt

per-file messages:
  extra/perror.c
    Add error number and message for HA_ERR_TOO_MANY_CONCURRENT_TRXS
  include/my_base.h
    Add error number and message for HA_ERR_TOO_MANY_CONCURRENT_TRXS
  sql/ha_innodb.cc
    Return HA_ERR_TOO_MANY_CONCURRENT_TRXS to mysql server
  sql/handler.cc
    Add error number and message for HA_ERR_TOO_MANY_CONCURRENT_TRXS
  sql/share/errmsg.txt
    Add error message for ER_TOO_MANY_CONCURRENT_TRXS
=== modified file 'extra/perror.c'
--- a/extra/perror.c	2009-02-24 10:05:37 +0000
+++ b/extra/perror.c	2009-07-17 08:43:53 +0000
@@ -108,6 +108,7 @@ static HA_ERRORS ha_errlist[]=
   { 161,"The table is not writable"},
   { 162,"Failed to get the next autoinc value"},
   { 163,"Failed to set the row autoinc value"},
+  { 164,"Too many active concurrent transactions"},
   { -30999, "DB_INCOMPLETE: Sync didn't finish"},
   { -30998, "DB_KEYEMPTY: Key/data deleted or never created"},
   { -30997, "DB_KEYEXIST: The key/data pair already exists"},

=== modified file 'include/my_base.h'
--- a/include/my_base.h	2009-02-24 10:05:37 +0000
+++ b/include/my_base.h	2009-07-17 08:43:53 +0000
@@ -377,9 +377,10 @@ enum ha_base_keytype {
 #define HA_ERR_TABLE_READONLY    161  /* The table is not writable */
 #define HA_ERR_AUTOINC_READ_FAILED 162/* Failed to get the next autoinc value */
 #define HA_ERR_AUTOINC_ERANGE    163  /* Failed to set the row autoinc value */
+#define HA_ERR_TOO_MANY_CONCURRENT_TRXS 164 /*Too many active concurrent transactions */
 /* You must also add numbers and description to extra/perror.c ! */
 
-#define HA_ERR_LAST              163  /*Copy last error nr.*/
+#define HA_ERR_LAST              164  /*Copy last error nr.*/
 /* Add error numbers before HA_ERR_LAST and change it accordingly. */
 #define HA_ERR_ERRORS            (HA_ERR_LAST - HA_ERR_FIRST + 1)
 

=== modified file 'sql/ha_innodb.cc'
--- a/sql/ha_innodb.cc	2009-06-25 09:50:26 +0000
+++ b/sql/ha_innodb.cc	2009-07-17 08:43:53 +0000
@@ -526,17 +526,7 @@ convert_error_code_to_mysql(
     		return(HA_ERR_LOCK_TABLE_FULL);
 	} else if (error == DB_TOO_MANY_CONCURRENT_TRXS) {
 
-		/* Once MySQL add the appropriate code to errmsg.txt then
-		we can get rid of this #ifdef. NOTE: The code checked by
-		the #ifdef is the suggested name for the error condition
-		and the actual error code name could very well be different.
-		This will require some monitoring, ie. the status
-		of this request on our part.*/
-#ifdef ER_TOO_MANY_CONCURRENT_TRXS
-		return(ER_TOO_MANY_CONCURRENT_TRXS);
-#else
-		return(HA_ERR_RECORD_FILE_FULL);
-#endif
+		return(HA_ERR_TOO_MANY_CONCURRENT_TRXS);
 
 	} else if (error == DB_UNSUPPORTED) {
 

=== modified file 'sql/handler.cc'
--- a/sql/handler.cc	2009-06-09 16:11:21 +0000
+++ b/sql/handler.cc	2009-07-17 08:43:53 +0000
@@ -426,6 +426,7 @@ static int ha_init_errors(void)
   SETMSG(HA_ERR_TABLE_READONLY,         ER(ER_OPEN_AS_READONLY));
   SETMSG(HA_ERR_AUTOINC_READ_FAILED,    ER(ER_AUTOINC_READ_FAILED));
   SETMSG(HA_ERR_AUTOINC_ERANGE,         ER(ER_WARN_DATA_OUT_OF_RANGE));
+  SETMSG(HA_ERR_TOO_MANY_CONCURRENT_TRXS, ER(ER_TOO_MANY_CONCURRENT_TRXS));
 
   /* Register the error messages for use with my_error(). */
   return my_error_register(errmsgs, HA_ERR_FIRST, HA_ERR_LAST);
@@ -1927,6 +1928,9 @@ void handler::print_error(int error, myf
   case HA_ERR_AUTOINC_ERANGE:
     textno= ER_WARN_DATA_OUT_OF_RANGE;
     break;
+  case HA_ERR_TOO_MANY_CONCURRENT_TRXS:
+    textno= ER_TOO_MANY_CONCURRENT_TRXS;
+    break;
   default:
     {
       /* The error was "unknown" to this function.

=== modified file 'sql/share/errmsg.txt'
--- a/sql/share/errmsg.txt	2008-10-23 20:56:03 +0000
+++ b/sql/share/errmsg.txt	2009-07-17 08:43:53 +0000
@@ -5649,3 +5649,5 @@ ER_XA_RBTIMEOUT XA106
 	eng "XA_RBTIMEOUT: Transaction branch was rolled back: took too long"
 ER_XA_RBDEADLOCK XA102
 	eng "XA_RBDEADLOCK: Transaction branch was rolled back: deadlock was detected"
+ER_TOO_MANY_CONCURRENT_TRXS
+        eng  "Too many active concurrent transactions"

Thread
bzr commit into mysql-5.0-bugteam branch (satya.bn:2787) Bug#18828Satya B17 Jul