#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#40815 | Jonas Oreland | 18 Nov |