From: Date: November 18 2008 11:21am Subject: bzr commit into mysql-5.1 branch (jonas:2750) Bug#40815 List-Archive: http://lists.mysql.com/commits/59046 X-Bug: 40815 Message-Id: <20081118102137.A81A47C8A4@perch.localdomain> MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit #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 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 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 #include +#include + // 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;