MySQL Lists are EOL. Please join:

List:Commits« Previous MessageNext Message »
From:Anurag Shekhar Date:August 24 2009 7:45am
Subject:bzr commit into mysql-5.0-bugteam branch (anurag.shekhar:2792)
Bug#44723
View as plain text  
#At file:///home/anurag/mysqlsrc/mysql-5.0-bugteam-44723/ based on revid:joro@stripped

 2792 Anurag Shekhar	2009-08-24
      Bug #44723 Larger read_buffer_size values can cause performance 
               decrease for INSERTs
      
      
      Bulk inserts (multiple row, CREATE ... SELECT, INSERT ... SELECT) into
      MyISAM tables were performed inefficiently. This was mainly affecting
      use cases where read_buffer_size was considerably large (>256K) and low
      number of rows was inserted (e.g. 30-100).
      
      The problem was that during I/O cache initialization (this happens
      before each bulk insert) allocated I/O buffer was unnecessarily
      initialized to '\0'.
      
      This was happening because of mess in flag values. MyISAM informs I/O
      cache to wait for free space (if out of disk space) by passing
      MY_WAIT_IF_FULL flag. Since MY_WAIT_IF_FULL and MY_ZEROFILL have the
      same values, memory allocator was initializing memory to '\0'.
      
      The performance gain provided with this patch may only be visible with
      non-debug binaries, since safemalloc always initializes allocated memory
      to 0xA5A5...
     @ mysys/mf_iocache.c
        Remove MY_WAIT_IF_FULL from myflags before calling my_malloc
        to prevent conflict with MY_ZEROFILL.

    modified:
      mysys/mf_iocache.c
=== modified file 'mysys/mf_iocache.c'
--- a/mysys/mf_iocache.c	2007-03-28 17:46:42 +0000
+++ b/mysys/mf_iocache.c	2009-08-24 07:45:51 +0000
@@ -233,10 +233,13 @@ int init_io_cache(IO_CACHE *info, File f
       buffer_block = cachesize;
       if (type == SEQ_READ_APPEND)
 	buffer_block *= 2;
-      if ((info->buffer=
-	   (byte*) my_malloc(buffer_block,
-			     MYF((cache_myflags & ~ MY_WME) |
-				 (cachesize == min_cache ? MY_WME : 0)))) != 0)
+      /*
+        Unset MY_WAIT_IF_FULL bit if it is set, to prevent conflict with
+        MY_ZEROFILL.
+      */
+      myf flag = MYF((cache_myflags & ~ (MY_WME | MY_WAIT_IF_FULL)) |
+                (cachesize == min_cache ? MY_WME : 0));
+      if ((info->buffer= (byte*) my_malloc(buffer_block, flag)) != 0)
       {
 	info->write_buffer=info->buffer;
 	if (type == SEQ_READ_APPEND)


Attachment: [text/bzr-bundle] bzr/anurag.shekhar@sun.com-20090824074551-f3utca9aj06xbb5w.bundle
Thread
bzr commit into mysql-5.0-bugteam branch (anurag.shekhar:2792)Bug#44723Anurag Shekhar24 Aug