mirror of
https://github.com/bitcoin/bitcoin.git
synced 2026-01-18 22:35:39 +01:00
Merge pull request #5367
63d1ae5 Do all block index writes in a batch (Pieter Wuille)
This commit is contained in:
31
src/main.cpp
31
src/main.cpp
@@ -1792,24 +1792,23 @@ bool static FlushStateToDisk(CValidationState &state, FlushStateMode mode) {
|
||||
// First make sure all block and undo data is flushed to disk.
|
||||
FlushBlockFile();
|
||||
// Then update all block file information (which may refer to block and undo files).
|
||||
bool fileschanged = false;
|
||||
for (set<int>::iterator it = setDirtyFileInfo.begin(); it != setDirtyFileInfo.end(); ) {
|
||||
if (!pblocktree->WriteBlockFileInfo(*it, vinfoBlockFile[*it])) {
|
||||
return state.Abort("Failed to write to block index");
|
||||
{
|
||||
std::vector<std::pair<int, const CBlockFileInfo*> > vFiles;
|
||||
vFiles.reserve(setDirtyFileInfo.size());
|
||||
for (set<int>::iterator it = setDirtyFileInfo.begin(); it != setDirtyFileInfo.end(); ) {
|
||||
vFiles.push_back(make_pair(*it, &vinfoBlockFile[*it]));
|
||||
setDirtyFileInfo.erase(it++);
|
||||
}
|
||||
std::vector<const CBlockIndex*> vBlocks;
|
||||
vBlocks.reserve(setDirtyBlockIndex.size());
|
||||
for (set<CBlockIndex*>::iterator it = setDirtyBlockIndex.begin(); it != setDirtyBlockIndex.end(); ) {
|
||||
vBlocks.push_back(*it);
|
||||
setDirtyBlockIndex.erase(it++);
|
||||
}
|
||||
if (!pblocktree->WriteBatchSync(vFiles, nLastBlockFile, vBlocks)) {
|
||||
return state.Abort("Files to write to block index database");
|
||||
}
|
||||
fileschanged = true;
|
||||
setDirtyFileInfo.erase(it++);
|
||||
}
|
||||
if (fileschanged && !pblocktree->WriteLastBlockFile(nLastBlockFile)) {
|
||||
return state.Abort("Failed to write to block index");
|
||||
}
|
||||
for (set<CBlockIndex*>::iterator it = setDirtyBlockIndex.begin(); it != setDirtyBlockIndex.end(); ) {
|
||||
if (!pblocktree->WriteBlockIndex(CDiskBlockIndex(*it))) {
|
||||
return state.Abort("Failed to write to block index");
|
||||
}
|
||||
setDirtyBlockIndex.erase(it++);
|
||||
}
|
||||
pblocktree->Sync();
|
||||
// Finally flush the chainstate (which may refer to block index entries).
|
||||
if (!pcoinsTip->Flush())
|
||||
return state.Abort("Failed to write to coin database");
|
||||
|
||||
Reference in New Issue
Block a user