aboutsummaryrefslogtreecommitdiff
path: root/src/main.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/main.cpp')
-rw-r--r--src/main.cpp31
1 files changed, 15 insertions, 16 deletions
diff --git a/src/main.cpp b/src/main.cpp
index 9e1c41ada7..50e63e93e4 100644
--- a/src/main.cpp
+++ b/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");