From: Date: September 15 2006 7:19am Subject: bk commit into 4.0 tree (tsmith:1.2186) BUG#4053 List-Archive: http://lists.mysql.com/commits/11990 X-Bug: 4053 Message-Id: <20060915051927.0F24D5C58@siva.hindu.god> Below is the list of changes that have just been committed into a local 4.0 repository of tim. When tim 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, 2006-09-14 23:19:24-06:00, tsmith@stripped +6 -0 Bug #4053: too many of "error 1236: 'binlog truncated in the middle of event' from master" - Fix my_read/my_write to handle return values from read/write correctly - Add debugging 'deprecated function' warning to my_lread/my_lwrite - Add debugging 'error, read/write interrupt not handled' warning to my_quick_read/my_quick_write There is no test case associated with these changes. However, this is a conservative change, and no repeatable test case is available. mysys/my_lread.c@stripped, 2006-09-14 23:19:23-06:00, tsmith@stripped +2 -0 Warn about using deprecated function. mysys/my_lwrite.c@stripped, 2006-09-14 23:19:23-06:00, tsmith@stripped +2 -0 Warn about using deprecated function. mysys/my_pread.c@stripped, 2006-09-14 23:19:23-06:00, tsmith@stripped +8 -4 Handle interrupted read() or write() (EINTR) properly mysys/my_quick.c@stripped, 2006-09-14 23:19:23-06:00, tsmith@stripped +25 -1 Warn about interrupted read() or write(), which is not handled by my_quick_read() or my_quick_write(). mysys/my_read.c@stripped, 2006-09-14 23:19:24-06:00, tsmith@stripped +6 -2 Handle interrupted read() (EINTR) properly mysys/my_write.c@stripped, 2006-09-14 23:19:24-06:00, tsmith@stripped +13 -7 Handle interrupted write() (EINTR) properly # This is a BitKeeper patch. What follows are the unified diffs for the # set of deltas contained in the patch. The rest of the patch, the part # that BitKeeper cares about, is below these diffs. # User: tsmith # Host: siva.hindu.god # Root: /usr/home/tim/m/bk/tmp/40 --- 1.5/mysys/my_lread.c 2006-09-14 23:19:26 -06:00 +++ 1.6/mysys/my_lread.c 2006-09-14 23:19:26 -06:00 @@ -30,6 +30,8 @@ uint32 my_lread(int Filedes, byte *Buffe DBUG_PRINT("my",("Fd: %d Buffer: %ld Count: %ld MyFlags: %d", Filedes, Buffer, Count, MyFlags)); + DBUG_PRINT("error", ("Deprecated my_lread() function should not be used.")); + /* Temp hack to get count to int32 while read wants int */ if ((readbytes = (uint32) read(Filedes, Buffer, (uint) Count)) != Count) { --- 1.5/mysys/my_lwrite.c 2006-09-14 23:19:26 -06:00 +++ 1.6/mysys/my_lwrite.c 2006-09-14 23:19:26 -06:00 @@ -26,6 +26,8 @@ uint32 my_lwrite(int Filedes, const byte DBUG_PRINT("my",("Fd: %d Buffer: %lx Count: %ld MyFlags: %d", Filedes, Buffer, Count, MyFlags)); + DBUG_PRINT("error", ("Deprecated my_lwrite() function should not be used.")); + /* Temp hack to get count to int32 while write wants int */ if ((writenbytes = (uint32) write(Filedes, Buffer, (uint) Count)) != Count) { --- 1.9/mysys/my_pread.c 2006-09-14 23:19:27 -06:00 +++ 1.10/mysys/my_pread.c 2006-09-14 23:19:27 -06:00 @@ -52,8 +52,12 @@ uint my_pread(File Filedes, byte *Buffer DBUG_PRINT("warning",("Read only %ld bytes off %ld from %d, errno: %d", readbytes,Count,Filedes,my_errno)); #ifdef THREAD - if (readbytes == 0 && errno == EINTR) - continue; /* Interrupted */ + if ((readbytes == 0 || (int) readbytes == -1) && errno == EINTR) + { + DBUG_PRINT("debug", ("my_pread() was interrupted and returned %d", + (int) readbytes)); + continue; /* Interrupted */ + } #endif if (MyFlags & (MY_WME | MY_FAE | MY_FNABP)) { @@ -124,8 +128,8 @@ uint my_pwrite(int Filedes, const byte * VOID(sleep(MY_WAIT_FOR_USER_TO_FIX_PANIC)); continue; } - if ((writenbytes == 0 && my_errno == EINTR) || - (writenbytes > 0 && (uint) writenbytes != (uint) -1)) + if ((writenbytes > 0 && (uint) writenbytes != (uint) -1) || + my_errno == EINTR) continue; /* Retry */ #endif if (MyFlags & (MY_NABP | MY_FNABP)) --- 1.4/mysys/my_quick.c 2006-09-14 23:19:27 -06:00 +++ 1.5/mysys/my_quick.c 2006-09-14 23:19:27 -06:00 @@ -26,6 +26,14 @@ uint my_quick_read(File Filedes,byte *Bu if ((readbytes = (uint) read(Filedes, Buffer, Count)) != Count) { +#ifndef DBUG_OFF + if ((readbytes == 0 || (int) readbytes == -1) && errno == EINTR) + { + DBUG_PRINT("error", ("my_quick_read() was interrupted and returned %d" + ". This function does not retry the read!", + (int) readbytes)); + } +#endif my_errno=errno; return readbytes; } @@ -35,8 +43,24 @@ uint my_quick_read(File Filedes,byte *Bu uint my_quick_write(File Filedes,const byte *Buffer,uint Count) { - if ((uint) write(Filedes,Buffer,Count) != Count) +#ifndef DBUG_OFF + uint writtenbytes; +#endif + + if (( +#ifndef DBUG_OFF + writtenbytes = +#endif + (uint) write(Filedes,Buffer,Count)) != Count) { +#ifndef DBUG_OFF + if ((writtenbytes == 0 || (int) writtenbytes == -1) && errno == EINTR) + { + DBUG_PRINT("error", ("my_quick_write() was interrupted and returned %d" + ". This function does not retry the write!", + (int) writtenbytes)); + } +#endif my_errno=errno; return (uint) -1; } --- 1.6/mysys/my_read.c 2006-09-14 23:19:27 -06:00 +++ 1.7/mysys/my_read.c 2006-09-14 23:19:27 -06:00 @@ -51,8 +51,12 @@ uint my_read(File Filedes, byte *Buffer, DBUG_PRINT("warning",("Read only %ld bytes off %ld from %d, errno: %d", readbytes,Count,Filedes,my_errno)); #ifdef THREAD - if (readbytes == 0 && errno == EINTR) - continue; /* Interrupted */ + if ((readbytes == 0 || (int) readbytes == -1) && errno == EINTR) + { + DBUG_PRINT("debug", ("my_read() was interrupted and returned %d", + (int) readbytes)); + continue; /* Interrupted */ + } #endif if (MyFlags & (MY_WME | MY_FAE | MY_FNABP)) { --- 1.10/mysys/my_write.c 2006-09-14 23:19:27 -06:00 +++ 1.11/mysys/my_write.c 2006-09-14 23:19:27 -06:00 @@ -57,18 +57,24 @@ uint my_write(int Filedes, const byte *B VOID(sleep(MY_WAIT_FOR_USER_TO_FIX_PANIC)); continue; } - if (!writenbytes) + + if ((writenbytes == 0 || (int) writenbytes == -1)) { - /* We may come here on an interrupt or if the file quote is exeeded */ if (my_errno == EINTR) - continue; - if (!errors++) /* Retry once */ { - errno=EFBIG; /* Assume this is the error */ - continue; + DBUG_PRINT("debug", ("my_write() was interrupted and returned %d", + (int) writenbytes)); + continue; /* Interrupted */ + } + + if (!writenbytes && !errors++) /* Retry once */ + { + /* We may come here if the file quota is exeeded */ + errno=EFBIG; /* Assume this is the error */ + continue; } } - else if ((uint) writenbytes != (uint) -1) + else continue; /* Retry */ #endif if (MyFlags & (MY_NABP | MY_FNABP))