List:Commits« Previous MessageNext Message »
From:tomas Date:June 14 2007 2:10pm
Subject:bk commit into 5.1 tree (tomas:1.2495) BUG#29099
View as plain text  
Below is the list of changes that have just been committed into a local
5.1 repository of tomas. When tomas 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, 2007-06-14 16:10:13+02:00, tomas@stripped +8 -0
  bug#29099 - slow backup for disk data
  - implement read ahead during disk data scan

  storage/ndb/src/kernel/blocks/dbtup/Dbtup.hpp@stripped, 2007-06-14 16:10:10+02:00, tomas@stripped +3 -0
    maximum read ahead

  storage/ndb/src/kernel/blocks/dbtup/DbtupGen.cpp@stripped, 2007-06-14 16:10:10+02:00, tomas@stripped +12 -0
    maximum read ahead should not be larger than page buffer size
    maximum aslo set to 32 pages

  storage/ndb/src/kernel/blocks/dbtup/DbtupScan.cpp@stripped, 2007-06-14 16:10:10+02:00, tomas@stripped +63 -1
    read ahead for disk data scan

  storage/ndb/src/kernel/blocks/pgman.cpp@stripped, 2007-06-14 16:10:10+02:00, tomas@stripped +2 -2
    set higher max_io_waits for read ahead
    round off upwards in page_buffer size

  storage/ndb/src/kernel/vm/SimulatedBlock.cpp@stripped, 2007-06-14 16:10:10+02:00, tomas@stripped +5 -0
    add null callback to be used for read ahead (no callback needed)

  storage/ndb/src/kernel/vm/SimulatedBlock.hpp@stripped, 2007-06-14 16:10:10+02:00, tomas@stripped +4 -0
    add null callback to be used for read ahead (no callback needed)

  storage/ndb/src/ndbapi/TransporterFacade.cpp@stripped, 2007-06-14 16:10:10+02:00, tomas@stripped +0 -3
    remove the debug trace, not needed any more

  storage/ndb/test/tools/hugoFill.cpp@stripped, 2007-06-14 16:10:11+02:00, tomas@stripped +3 -1
    allow setting database in hugoFill

# 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:	tomas
# Host:	whalegate.ndb.mysql.com
# Root:	/home/tomas/mysql-5.1-telco-gca

--- 1.24/storage/ndb/src/kernel/blocks/pgman.cpp	2007-06-03 19:30:35 +02:00
+++ 1.25/storage/ndb/src/kernel/blocks/pgman.cpp	2007-06-14 16:10:10 +02:00
@@ -122,7 +122,7 @@
   
   if (page_buffer > 0)
   {
-    page_buffer /= GLOBAL_PAGE_SIZE; // in pages
+    page_buffer = (page_buffer + GLOBAL_PAGE_SIZE - 1) / GLOBAL_PAGE_SIZE; // in pages
     m_param.m_max_pages = page_buffer;
     m_page_entry_pool.setSize(m_param.m_lirs_stack_mult * page_buffer);
     m_param.m_max_hot_pages = (page_buffer * 9) / 10;
@@ -144,7 +144,7 @@
   m_lirs_stack_mult(10),
   m_max_hot_pages(56),
   m_max_loop_count(256),
-  m_max_io_waits(64),
+  m_max_io_waits(256),
   m_stats_loop_delay(1000),
   m_cleanup_loop_delay(200),
   m_lcp_loop_delay(0)

--- 1.63/storage/ndb/src/kernel/blocks/dbtup/Dbtup.hpp	2007-06-12 10:35:19 +02:00
+++ 1.64/storage/ndb/src/kernel/blocks/dbtup/Dbtup.hpp	2007-06-14 16:10:10 +02:00
@@ -2619,6 +2619,9 @@
   ArrayPool<Page> c_page_pool;
   Uint32 cnoOfAllocatedPages;
   Uint32 m_max_allocate_pages;
+
+  /* read ahead in pages during disk order scan */
+  Uint32 m_max_page_read_ahead;
   
   Tablerec *tablerec;
   Uint32 cnoOfTablerec;

--- 1.39/storage/ndb/src/kernel/blocks/dbtup/DbtupGen.cpp	2007-06-12 10:35:19 +02:00
+++ 1.40/storage/ndb/src/kernel/blocks/dbtup/DbtupGen.cpp	2007-06-14 16:10:10 +02:00
@@ -347,6 +347,18 @@
   ndbrequire(!ndb_mgm_get_int_parameter(p, CFG_DB_BATCH_SIZE, &nScanBatch));
   c_scanLockPool.setSize(nScanOp * nScanBatch);
 
+
+  /* read ahead for disk scan can not be more that disk page buffer */
+  {
+    Uint64 tmp = 64*1024*1024;
+    ndb_mgm_get_int64_parameter(p, CFG_DB_DISK_PAGE_BUFFER_MEMORY, &tmp);
+    m_max_page_read_ahead = (tmp  + GLOBAL_PAGE_SIZE - 1) / GLOBAL_PAGE_SIZE; // in pages
+    // never read ahead more than 32 pages
+    if (m_max_page_read_ahead > 32)
+      m_max_page_read_ahead = 32;
+  }
+
+
   ScanOpPtr lcp;
   ndbrequire(c_scanOpPool.seize(lcp));
   new (lcp.p) ScanOp();

--- 1.41/storage/ndb/src/kernel/vm/SimulatedBlock.cpp	2007-06-05 17:29:35 +02:00
+++ 1.42/storage/ndb/src/kernel/vm/SimulatedBlock.cpp	2007-06-14 16:10:10 +02:00
@@ -1658,6 +1658,11 @@
 }
 
 SimulatedBlock::Callback SimulatedBlock::TheEmptyCallback = {0, 0};
+void
+SimulatedBlock::TheNULLCallbackFunction(class Signal*, Uint32, Uint32)
+{ abort(); /* should never be called */ }
+SimulatedBlock::Callback SimulatedBlock::TheNULLCallback =
+{ &SimulatedBlock::TheNULLCallbackFunction, 0 };
 
 void
 SimulatedBlock::sendFragmentedSignal(BlockReference ref, 

--- 1.31/storage/ndb/src/kernel/vm/SimulatedBlock.hpp	2007-06-05 17:29:35 +02:00
+++ 1.32/storage/ndb/src/kernel/vm/SimulatedBlock.hpp	2007-06-14 16:10:10 +02:00
@@ -131,6 +131,8 @@
   virtual const char* get_filename(Uint32 fd) const { return "";}
 protected:
   static Callback TheEmptyCallback;
+  void TheNULLCallbackFunction(class Signal*, Uint32, Uint32);
+  static Callback TheNULLCallback;
   void execute(Signal* signal, Callback & c, Uint32 returnCode);
   
   
@@ -599,6 +601,8 @@
 void
 SimulatedBlock::execute(Signal* signal, Callback & c, Uint32 returnCode){
   CallbackFunction fun = c.m_callbackFunction; 
+  if (fun == TheNULLCallback.m_callbackFunction)
+    return;
   ndbrequire(fun != 0);
   c.m_callbackFunction = NULL;
   (this->*fun)(signal, c.m_callbackData, returnCode);

--- 1.58/storage/ndb/src/ndbapi/TransporterFacade.cpp	2007-02-26 17:52:04 +01:00
+++ 1.59/storage/ndb/src/ndbapi/TransporterFacade.cpp	2007-06-14 16:10:10 +02:00
@@ -1403,9 +1403,6 @@
     }
     if (wait_time == -1)
     {
-#ifdef VM_TRACE
-      ndbout << "Waited WAITFOR_RESPONSE_TIMEOUT, continuing wait" << endl;
-#endif
       continue;
     }
     wait_time= max_time - NdbTick_CurrentMillisecond();

--- 1.8/storage/ndb/test/tools/hugoFill.cpp	2006-12-23 20:20:31 +01:00
+++ 1.9/storage/ndb/test/tools/hugoFill.cpp	2007-06-14 16:10:11 +02:00
@@ -30,9 +30,11 @@
   const char* _tabname = NULL;
   int _help = 0;
   int _batch = 512;
+  const char* db = "TEST_DB";
   
   struct getargs args[] = {
     { "batch", 'b', arg_integer, &_batch, "Number of operations in each transaction", "batch" },
+    { "database", 'd', arg_string, &db, "Database", "" },
     { "usage", '?', arg_flag, &_help, "Print help", "" }
   };
   int num_args = sizeof(args) / sizeof(args[0]);
@@ -55,7 +57,7 @@
   {
     return NDBT_ProgramExit(NDBT_FAILED);
   }
-  Ndb MyNdb(&con, "TEST_DB" );
+  Ndb MyNdb(&con, db);
 
   if(MyNdb.init() != 0){
     ERR(MyNdb.getNdbError());

--- 1.22/storage/ndb/src/kernel/blocks/dbtup/DbtupScan.cpp	2007-05-29 07:20:27 +02:00
+++ 1.23/storage/ndb/src/kernel/blocks/dbtup/DbtupScan.cpp	2007-06-14 16:10:10 +02:00
@@ -686,13 +686,74 @@
             // move to next extent
             jam();
             pos.m_extent_info_ptr_i = ext_ptr.i;
-            Extent_info* ext = c_extent_pool.getPtr(pos.m_extent_info_ptr_i);
+            ext = c_extent_pool.getPtr(pos.m_extent_info_ptr_i);
             key.m_file_no = ext->m_key.m_file_no;
             key.m_page_no = ext->m_first_page_no;
           }
         }
         key.m_page_idx = 0;
         pos.m_get = ScanPos::Get_page_dd;
+        /*
+          read ahead for scan in disk order
+          do read ahead every 8:th page
+        */
+        if ((bits & ScanOp::SCAN_DD) &&
+            (((key.m_page_no - ext->m_first_page_no) & 7) == 0))
+        {
+          jam();
+          // initialize PGMAN request
+          Page_cache_client::Request preq;
+          preq.m_page = pos.m_key;
+          preq.m_callback = TheNULLCallback;
+
+          // set maximum read ahead
+          Uint32 read_ahead = m_max_page_read_ahead;
+
+          while (true)
+          {
+            // prepare page read ahead in current extent
+            Uint32 page_no = preq.m_page.m_page_no;
+            Uint32 page_no_limit = page_no + read_ahead;
+            Uint32 limit = ext->m_first_page_no + alloc.m_extent_size;
+            if (page_no_limit > limit)
+            {
+              jam();
+              // read ahead crosses extent, set limit for this extent
+              read_ahead = page_no_limit - limit;
+              page_no_limit = limit;
+              // and make sure we only read one extra extent next time around
+              if (read_ahead > alloc.m_extent_size)
+                read_ahead = alloc.m_extent_size;
+            }
+            else
+            {
+              jam();
+              read_ahead = 0; // no more to read ahead after this
+            }
+            // do read ahead pages for this extent
+            while (page_no < page_no_limit)
+            {
+              // page request to PGMAN
+              jam();
+              preq.m_page.m_page_no = page_no;
+              int flags = 0;
+              // ignore result
+              m_pgman.get_page(signal, preq, flags);
+              jamEntry();
+              page_no++;
+            }
+            if (!read_ahead || !list.next(ext_ptr))
+            {
+              // no more extents after this or read ahead done
+              jam();
+              break;
+            }
+            // move to next extent and initialize PGMAN request accordingly
+            Extent_info* ext = c_extent_pool.getPtr(ext_ptr.i);
+            preq.m_page.m_file_no = ext->m_key.m_file_no;
+            preq.m_page.m_page_no = ext->m_first_page_no;
+          }
+        } // if ScanOp::SCAN_DD read ahead
       }
       /*FALLTHRU*/
     case ScanPos::Get_page_dd:
@@ -725,6 +786,7 @@
           safe_cast(&Dbtup::disk_page_tup_scan_callback);
         int flags = 0;
         int res = m_pgman.get_page(signal, preq, flags);
+        jamEntry();
         if (res == 0) {
           jam();
           // request queued
Thread
bk commit into 5.1 tree (tomas:1.2495) BUG#29099tomas14 Jun