diff options
author | unknown <tomas@poseidon.mysql.com> | 2007-06-05 17:29:50 +0200 |
---|---|---|
committer | unknown <tomas@poseidon.mysql.com> | 2007-06-05 17:29:50 +0200 |
commit | 35b2f212ba5f5cd98b9ee4bd8332012cf3bd3438 (patch) | |
tree | 4ea5a0b40aef51d97959bb781879666727c50af2 /storage/ndb/src/kernel/blocks/backup/Backup.cpp | |
parent | 1182b801d435d500c92ce4439b2531521ea6df33 (diff) | |
download | mariadb-git-35b2f212ba5f5cd98b9ee4bd8332012cf3bd3438.tar.gz |
Bug #28751 Lots of memory locked in memory causes high kswapd
- add odirect option for lcp+backup+redo log to lower CPU/kswapd usage
- writing odirect removes need for kernel write buffers avoiding kswapd to kick in
mysql-test/ndb/ndb_config_2_node.ini:
run mysql-test-run using ODirect
storage/ndb/include/mgmapi/mgmapi_config_parameters.h:
add new config parameter to choose ODirect
storage/ndb/include/ndb_global.h.in:
specify alignment needed for odirect
storage/ndb/src/kernel/blocks/backup/Backup.cpp:
read odirect config param
open LCP and Backup datafiles with odirect if specified
insert empty padding record if odirect is used
allocate buffers aligned to be able to use odirect
storage/ndb/src/kernel/blocks/backup/Backup.hpp:
odirect and padding options
storage/ndb/src/kernel/blocks/backup/BackupFormat.hpp:
add empty_record in file format
storage/ndb/src/kernel/blocks/backup/BackupInit.cpp:
read odirect config and allocate aligned
storage/ndb/src/kernel/blocks/backup/FsBuffer.hpp:
correct debug printouts
storage/ndb/src/kernel/blocks/dblqh/Dblqh.hpp:
read odirect config param and align buffers
storage/ndb/src/kernel/blocks/dblqh/DblqhInit.cpp:
read odirect config param and align buffers
storage/ndb/src/kernel/blocks/dblqh/DblqhMain.cpp:
read config params and open redo log files with odirect if set
storage/ndb/src/kernel/blocks/ndbfs/AsyncFile.cpp:
aligned writing for odirect
correct odirect open options with test+fallback if odirect fails
storage/ndb/src/kernel/blocks/ndbfs/AsyncFile.hpp:
align + odirect check
storage/ndb/src/kernel/blocks/restore.cpp:
restor block to ignore new lcp padding empty_record
storage/ndb/src/kernel/vm/SimulatedBlock.cpp:
alligend log buffer allocation for odirect
storage/ndb/src/kernel/vm/SimulatedBlock.hpp:
alligend log buffer allocation for odirect
storage/ndb/src/mgmsrv/ConfigInfo.cpp:
new config param for odirect, default false
storage/ndb/tools/restore/Restore.cpp:
ndb_restore to skip empty_record alignment padding in backup file
Diffstat (limited to 'storage/ndb/src/kernel/blocks/backup/Backup.cpp')
-rw-r--r-- | storage/ndb/src/kernel/blocks/backup/Backup.cpp | 49 |
1 files changed, 42 insertions, 7 deletions
diff --git a/storage/ndb/src/kernel/blocks/backup/Backup.cpp b/storage/ndb/src/kernel/blocks/backup/Backup.cpp index 57082eaccc8..645eb590ae3 100644 --- a/storage/ndb/src/kernel/blocks/backup/Backup.cpp +++ b/storage/ndb/src/kernel/blocks/backup/Backup.cpp @@ -2761,6 +2761,8 @@ Backup::openFiles(Signal* signal, BackupRecordPtr ptr) c_backupFilePool.getPtr(filePtr, ptr.p->dataFilePtr); filePtr.p->m_flags |= BackupFile::BF_OPENING; + if (c_defaults.m_o_direct) + req->fileFlags |= FsOpenReq::OM_DIRECT; req->userPointer = filePtr.i; FsOpenReq::setVersion(req->fileNumber, 2); FsOpenReq::setSuffix(req->fileNumber, FsOpenReq::S_DATA); @@ -3735,12 +3737,31 @@ Backup::OperationRecord::newFragment(Uint32 tableId, Uint32 fragNo) } bool -Backup::OperationRecord::fragComplete(Uint32 tableId, Uint32 fragNo) +Backup::OperationRecord::fragComplete(Uint32 tableId, Uint32 fragNo, bool fill_record) { Uint32 * tmp; const Uint32 footSz = sizeof(BackupFormat::DataFile::FragmentFooter) >> 2; + Uint32 sz = footSz + 1; - if(dataBuffer.getWritePtr(&tmp, footSz + 1)) { + if (fill_record) + { + Uint32 * new_tmp; + if (!dataBuffer.getWritePtr(&tmp, sz)) + return false; + new_tmp = tmp + sz; + + if ((UintPtr)new_tmp & (sizeof(Page32)-1)) + { + /* padding is needed to get full write */ + new_tmp += 2 /* to fit empty header minimum 2 words*/; + new_tmp = (Uint32 *)(((UintPtr)new_tmp + sizeof(Page32)-1) & + ~(UintPtr)(sizeof(Page32)-1)); + /* new write sz */ + sz = new_tmp - tmp; + } + } + + if(dataBuffer.getWritePtr(&tmp, sz)) { jam(); * tmp = 0; // Finish record stream tmp++; @@ -3752,7 +3773,17 @@ Backup::OperationRecord::fragComplete(Uint32 tableId, Uint32 fragNo) foot->FragmentNo = htonl(fragNo); foot->NoOfRecords = htonl(noOfRecords); foot->Checksum = htonl(0); - dataBuffer.updateWritePtr(footSz + 1); + + if (sz != footSz + 1) + { + tmp += footSz; + memset(tmp, 0, (sz - footSz - 1) * 4); + *tmp = htonl(BackupFormat::EMPTY_ENTRY); + tmp++; + *tmp = htonl(sz - footSz - 1); + } + + dataBuffer.updateWritePtr(sz); return true; }//if return false; @@ -3854,8 +3885,13 @@ Backup::fragmentCompleted(Signal* signal, BackupFilePtr filePtr) return; }//if + BackupRecordPtr ptr LINT_SET_PTR; + c_backupPool.getPtr(ptr, filePtr.p->backupPtr); + OperationRecord & op = filePtr.p->operation; - if(!op.fragComplete(filePtr.p->tableId, filePtr.p->fragmentNo)) { + if(!op.fragComplete(filePtr.p->tableId, filePtr.p->fragmentNo, + c_defaults.m_o_direct)) + { jam(); signal->theData[0] = BackupContinueB::BUFFER_FULL_FRAG_COMPLETE; signal->theData[1] = filePtr.i; @@ -3865,9 +3901,6 @@ Backup::fragmentCompleted(Signal* signal, BackupFilePtr filePtr) filePtr.p->m_flags &= ~(Uint32)BackupFile::BF_SCAN_THREAD; - BackupRecordPtr ptr LINT_SET_PTR; - c_backupPool.getPtr(ptr, filePtr.p->backupPtr); - if (ptr.p->is_lcp()) { ptr.p->slaveState.setState(STOPPING); @@ -4905,6 +4938,8 @@ Backup::lcp_open_file(Signal* signal, BackupRecordPtr ptr) FsOpenReq::OM_CREATE | FsOpenReq::OM_APPEND | FsOpenReq::OM_AUTOSYNC; + if (c_defaults.m_o_direct) + req->fileFlags |= FsOpenReq::OM_DIRECT; FsOpenReq::v2_setCount(req->fileNumber, 0xFFFFFFFF); req->auto_sync_size = c_defaults.m_disk_synch_size; |