@@ -293,7 +293,7 @@ public: | |||
hashPrev = 0; | |||
} | |||
explicit CDiskBlockIndex(CBlockIndex* pindex) : CBlockIndex(*pindex) { | |||
explicit CDiskBlockIndex(const CBlockIndex* pindex) : CBlockIndex(*pindex) { | |||
hashPrev = (pprev ? pprev->GetBlockHash() : 0); | |||
} | |||
@@ -1784,24 +1784,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"); |
@@ -66,23 +66,10 @@ bool CCoinsViewDB::BatchWrite(CCoinsMap &mapCoins, const uint256 &hashBlock) { | |||
CBlockTreeDB::CBlockTreeDB(size_t nCacheSize, bool fMemory, bool fWipe) : CLevelDBWrapper(GetDataDir() / "blocks" / "index", nCacheSize, fMemory, fWipe) { | |||
} | |||
bool CBlockTreeDB::WriteBlockIndex(const CDiskBlockIndex& blockindex) | |||
{ | |||
return Write(make_pair('b', blockindex.GetBlockHash()), blockindex); | |||
} | |||
bool CBlockTreeDB::WriteBlockFileInfo(int nFile, const CBlockFileInfo &info) { | |||
return Write(make_pair('f', nFile), info); | |||
} | |||
bool CBlockTreeDB::ReadBlockFileInfo(int nFile, CBlockFileInfo &info) { | |||
return Read(make_pair('f', nFile), info); | |||
} | |||
bool CBlockTreeDB::WriteLastBlockFile(int nFile) { | |||
return Write('l', nFile); | |||
} | |||
bool CBlockTreeDB::WriteReindexing(bool fReindexing) { | |||
if (fReindexing) | |||
return Write('R', '1'); | |||
@@ -152,6 +139,18 @@ bool CCoinsViewDB::GetStats(CCoinsStats &stats) const { | |||
return true; | |||
} | |||
bool CBlockTreeDB::WriteBatchSync(const std::vector<std::pair<int, const CBlockFileInfo*> >& fileInfo, int nLastFile, const std::vector<const CBlockIndex*>& blockinfo) { | |||
CLevelDBBatch batch; | |||
for (std::vector<std::pair<int, const CBlockFileInfo*> >::const_iterator it=fileInfo.begin(); it != fileInfo.end(); it++) { | |||
batch.Write(make_pair('f', it->first), *it->second); | |||
} | |||
batch.Write('l', nLastFile); | |||
for (std::vector<const CBlockIndex*>::const_iterator it=blockinfo.begin(); it != blockinfo.end(); it++) { | |||
batch.Write(make_pair('b', (*it)->GetBlockHash()), CDiskBlockIndex(*it)); | |||
} | |||
return WriteBatch(batch, true); | |||
} | |||
bool CBlockTreeDB::ReadTxIndex(const uint256 &txid, CDiskTxPos &pos) { | |||
return Read(make_pair('t', txid), pos); | |||
} |
@@ -48,11 +48,9 @@ private: | |||
CBlockTreeDB(const CBlockTreeDB&); | |||
void operator=(const CBlockTreeDB&); | |||
public: | |||
bool WriteBlockIndex(const CDiskBlockIndex& blockindex); | |||
bool WriteBatchSync(const std::vector<std::pair<int, const CBlockFileInfo*> >& fileInfo, int nLastFile, const std::vector<const CBlockIndex*>& blockinfo); | |||
bool ReadBlockFileInfo(int nFile, CBlockFileInfo &fileinfo); | |||
bool WriteBlockFileInfo(int nFile, const CBlockFileInfo &fileinfo); | |||
bool ReadLastBlockFile(int &nFile); | |||
bool WriteLastBlockFile(int nFile); | |||
bool WriteReindexing(bool fReindex); | |||
bool ReadReindexing(bool &fReindex); | |||
bool ReadTxIndex(const uint256 &txid, CDiskTxPos &pos); |