Commit d7a1f97c authored by unknown's avatar unknown
Browse files

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:
  Warn about using deprecated function.
mysys/my_lwrite.c:
  Warn about using deprecated function.
mysys/my_pread.c:
  Handle interrupted read() or write() (EINTR) properly
mysys/my_quick.c:
  Warn about interrupted read() or write(), which is not
  handled by my_quick_read() or my_quick_write().
mysys/my_read.c:
  Handle interrupted read() (EINTR) properly
mysys/my_write.c:
  Handle interrupted write() (EINTR) properly
parent 89c7db0c
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -30,6 +30,8 @@ uint32 my_lread(int Filedes, byte *Buffer, uint32 Count, myf MyFlags)
  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)
  {
+2 −0
Original line number Diff line number Diff line
@@ -26,6 +26,8 @@ uint32 my_lwrite(int Filedes, const byte *Buffer, uint32 Count, myf MyFlags)
  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)
  {
+8 −4
Original line number Diff line number Diff line
@@ -52,8 +52,12 @@ uint my_pread(File Filedes, byte *Buffer, uint Count, my_off_t offset,
      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)
      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 *Buffer, uint Count, my_off_t offset,
      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))
+25 −1
Original line number Diff line number Diff line
@@ -26,6 +26,14 @@ uint my_quick_read(File Filedes,byte *Buffer,uint Count,myf MyFlags)

  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 *Buffer,uint Count,myf MyFlags)

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;
  }
+6 −2
Original line number Diff line number Diff line
@@ -51,8 +51,12 @@ uint my_read(File Filedes, byte *Buffer, uint Count, myf MyFlags)
      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)
      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))
      {
Loading