List:Commits« Previous MessageNext Message »
From:Jonas Oreland Date:November 18 2008 11:21am
Subject:bzr commit into mysql-5.1 branch (jonas:2750) Bug#40815
View as plain text  
#At file:///home/jonas/src/telco-6.3/

 2750 Jonas Oreland	2008-11-18
      ndb - bug#40815 - increase init-write-size to 512k
modified:
  storage/ndb/src/kernel/blocks/lgman.cpp
  storage/ndb/src/kernel/blocks/ndbfs/AsyncFile.hpp
  storage/ndb/src/kernel/blocks/ndbfs/Ndbfs.cpp
  storage/ndb/src/kernel/blocks/ndbfs/PosixAsyncFile.cpp
  storage/ndb/src/kernel/blocks/tsman.cpp

=== modified file 'storage/ndb/src/kernel/blocks/lgman.cpp'
--- a/storage/ndb/src/kernel/blocks/lgman.cpp	2008-04-22 20:09:38 +0000
+++ b/storage/ndb/src/kernel/blocks/lgman.cpp	2008-11-18 10:21:28 +0000
@@ -639,11 +639,10 @@ Lgman::execFSWRITEREQ(Signal* signal)
   FsReadWriteReq* req= (FsReadWriteReq*)signal->getDataPtr();
   
   m_file_pool.getPtr(ptr, req->userPointer);
-  m_global_page_pool.getPtr(page_ptr, req->data.pageData[0]);
+  m_shared_page_pool.getPtr(page_ptr, req->data.pageData[0]);
 
   if (req->varIndex == 0)
   {
-    jam();
     File_formats::Undofile::Zero_page* page = 
       (File_formats::Undofile::Zero_page*)page_ptr.p;
     page->m_page_header.init(File_formats::FT_Undofile, 
@@ -657,7 +656,6 @@ Lgman::execFSWRITEREQ(Signal* signal)
   }
   else
   {
-    jam();
     File_formats::Undofile::Undo_page* page = 
       (File_formats::Undofile::Undo_page*)page_ptr.p;
     page->m_page_header.m_page_lsn_hi = 0;

=== modified file 'storage/ndb/src/kernel/blocks/ndbfs/AsyncFile.hpp'
--- a/storage/ndb/src/kernel/blocks/ndbfs/AsyncFile.hpp	2008-08-28 08:11:47 +0000
+++ b/storage/ndb/src/kernel/blocks/ndbfs/AsyncFile.hpp	2008-11-18 10:21:28 +0000
@@ -258,6 +258,8 @@ protected:
 
 public:
   SimulatedBlock& m_fs;
+
+  Uint32 m_page_cnt;
   Ptr<GlobalPage> m_page_ptr;
 };
 

=== modified file 'storage/ndb/src/kernel/blocks/ndbfs/Ndbfs.cpp'
--- a/storage/ndb/src/kernel/blocks/ndbfs/Ndbfs.cpp	2008-11-06 16:46:27 +0000
+++ b/storage/ndb/src/kernel/blocks/ndbfs/Ndbfs.cpp	2008-11-18 10:21:28 +0000
@@ -190,8 +190,11 @@ Ndbfs::execFSOPENREQ(Signal* signal)
   
   if(fsOpenReq->fileFlags & FsOpenReq::OM_INIT)
   {
+    jam();
+    Uint32 cnt = 16; // 512k
     Ptr<GlobalPage> page_ptr;
-    if(m_global_page_pool.seize(page_ptr) == false)
+    m_ctx.m_mm.alloc_pages(RT_DBTUP_PAGE, &page_ptr.i, &cnt, 1);
+    if(cnt == 0)
     {
       FsRef * const fsRef = (FsRef *)&signal->theData[0];
       fsRef->userPointer  = userPointer; 
@@ -200,12 +203,15 @@ Ndbfs::execFSOPENREQ(Signal* signal)
       sendSignal(userRef, GSN_FSOPENREF, signal, 3, JBB);
       return;
     }
+    m_shared_page_pool.getPtr(page_ptr);
     file->m_page_ptr = page_ptr;
+    file->m_page_cnt = cnt;
   } 
   else
   {
     ndbassert(file->m_page_ptr.isNull());
     file->m_page_ptr.setNull();
+    file->m_page_cnt = 0;
   }
   
   if(signal->getNoOfSections() == 0){
@@ -700,8 +706,12 @@ Ndbfs::report(Request * request, Signal*
 
   if(!request->file->m_page_ptr.isNull())
   {
-    m_global_page_pool.release(request->file->m_page_ptr);
+    assert(request->file->m_page_cnt > 0);
+    m_ctx.m_mm.release_pages(RT_DBTUP_PAGE, 
+                             request->file->m_page_ptr.i,
+                             request->file->m_page_cnt);
     request->file->m_page_ptr.setNull();
+    request->file->m_page_cnt = 0;
   }
   
   if (request->error) {

=== modified file 'storage/ndb/src/kernel/blocks/ndbfs/PosixAsyncFile.cpp'
--- a/storage/ndb/src/kernel/blocks/ndbfs/PosixAsyncFile.cpp	2008-10-21 13:13:10 +0000
+++ b/storage/ndb/src/kernel/blocks/ndbfs/PosixAsyncFile.cpp	2008-11-18 10:21:28 +0000
@@ -32,6 +32,8 @@
 #include <signaldata/FsOpenReq.hpp>
 #include <signaldata/FsReadWriteReq.hpp>
 
+#include <NdbTick.h>
+
 // use this to test broken pread code
 //#define HAVE_BROKEN_PREAD
 
@@ -330,20 +332,39 @@ no_odirect:
     posix_fallocate(theFd, 0, sz);
 #endif
 
+#ifdef VM_TRACE
+#define TRACE_INIT
+#endif
+
+#ifdef TRACE_INIT
+    Uint32 write_cnt = 0;
+    Uint64 start = NdbTick_CurrentMillisecond();
+#endif
     while(off < sz)
     {
-      req->filePointer = 0;          // DATA 0
-      req->userPointer = request->theUserPointer;          // DATA 2
-      req->numberOfPages = 1;        // DATA 5
-      req->varIndex = index++;
-      req->data.pageData[0] = m_page_ptr.i;
-
-      m_fs.EXECUTE_DIRECT(block, GSN_FSWRITEREQ, signal,
-			  FsReadWriteReq::FixedLength + 1);
+      off_t size = 0;
+      Uint32 cnt = 0;
+      while (cnt < m_page_cnt && (off + size) < sz)
+      {
+        req->filePointer = 0;          // DATA 0
+        req->userPointer = request->theUserPointer;          // DATA 2
+        req->numberOfPages = 1;        // DATA 5
+        req->varIndex = index++;
+        req->data.pageData[0] = m_page_ptr.i + cnt;
+
+        m_fs.EXECUTE_DIRECT(block, GSN_FSWRITEREQ, signal,
+                            FsReadWriteReq::FixedLength + 1);
+        
+        cnt++;
+        size += request->par.open.page_size;
+      }
   retry:
-      Uint32 size = request->par.open.page_size;
+      off_t save_size = size;
       char* buf = (char*)m_page_ptr.p;
       while(size > 0){
+#ifdef TRACE_INIT
+        write_cnt++;
+#endif
         int n;
 	if(use_gz)
           n= azwrite(&azf,buf,size);
@@ -380,8 +401,22 @@ no_odirect:
 	request->error = err;
 	return;
       }
-      off += request->par.open.page_size;
+      off += save_size;
     }
+    ::fsync(theFd);
+#ifdef TRACE_INIT
+    Uint64 stop = NdbTick_CurrentMillisecond();
+    Uint64 diff = stop - start;
+    if (diff == 0)
+      diff = 1;
+    ndbout_c("wrote %umb in %u writes %us -> %ukb/write %umb/s",
+             Uint32(sz /1024/1024),
+             write_cnt,
+             Uint32(diff / 1000),
+             Uint32(sz / 1024 / write_cnt),
+             Uint32(sz / diff));
+#endif
+
     if(lseek(theFd, 0, SEEK_SET) != 0)
       request->error = errno;
   }
@@ -399,12 +434,6 @@ no_odirect:
 
     if (request->error)
       return;
-#elif defined HAVE_DIRECTIO && defined(DIRECTIO_ON)
-    if (directio(theFd, DIRECTIO_ON) == -1)
-    {
-      ndbout_c("%s Failed to set DIRECTIO_ON errno: %u",
-               theFileName.c_str(), errno);
-    }
 #endif
   }
 
@@ -421,6 +450,7 @@ no_odirect:
 #endif
   }
 #endif
+  
   if ((flags & FsOpenReq::OM_SYNC) && (flags & FsOpenReq::OM_INIT))
   {
 #ifdef O_SYNC
@@ -437,6 +467,24 @@ no_odirect:
     }
 #endif
   }
+
+#if ! defined(O_DIRECT) && defined HAVE_DIRECTIO && defined(DIRECTIO_ON)
+  if (flags & FsOpenReq::OM_DIRECT)
+  {
+    if (directio(theFd, DIRECTIO_ON) == -1)
+    {
+      ndbout_c("%s Failed to set DIRECTIO_ON errno: %u",
+               theFileName.c_str(), errno);
+    }
+#ifdef VM_TRACE
+    else
+    {
+      ndbout_c("%s DIRECTIO_ON", theFileName.c_str());
+    }
+#endif
+  }
+#endif
+  
   if(use_gz)
   {
     int err;

=== modified file 'storage/ndb/src/kernel/blocks/tsman.cpp'
--- a/storage/ndb/src/kernel/blocks/tsman.cpp	2008-08-08 12:36:04 +0000
+++ b/storage/ndb/src/kernel/blocks/tsman.cpp	2008-11-18 10:21:28 +0000
@@ -786,7 +786,7 @@ Tsman::execFSWRITEREQ(Signal* signal)
   FsReadWriteReq* req= (FsReadWriteReq*)signal->getDataPtr();
   
   m_file_pool.getPtr(ptr, req->userPointer);
-  m_global_page_pool.getPtr(page_ptr, req->data.pageData[0]);
+  m_shared_page_pool.getPtr(page_ptr, req->data.pageData[0]);
   memset(page_ptr.p, 0, File_formats::NDB_PAGE_SIZE);
   
   Uint32 page_no = req->varIndex;

Thread
bzr commit into mysql-5.1 branch (jonas:2750) Bug#40815Jonas Oreland18 Nov