diff --git a/src/chain.h b/src/chain.h index 11c039773f1e8..b418f05894728 100644 --- a/src/chain.h +++ b/src/chain.h @@ -175,11 +175,11 @@ class CBlockIndex //! (memory only) Sequential id assigned to distinguish order in which blocks are received. uint32_t nSequenceId; - + //! zerocoin specific fields std::map mapZerocoinSupply; std::vector vMintDenominationsInBlock; - + void SetNull() { phashBlock = NULL; @@ -251,7 +251,7 @@ class CBlockIndex nStakeTime = 0; } } - + CDiskBlockPos GetBlockPos() const { @@ -393,7 +393,7 @@ class CBlockIndex /** * Returns true if there are nRequired or more blocks of minVersion or above - * in the last Params().ToCheckBlockUpgradeMajority() blocks, starting at pstart + * in the last Params().ToCheckBlockUpgradeMajority() blocks, starting at pstart * and going backwards. */ static bool IsSuperMajority(int minVersion, const CBlockIndex* pstart, unsigned int nRequired); @@ -450,9 +450,9 @@ class CDiskBlockIndex : public CBlockIndex hashNext = uint256(); } - explicit CDiskBlockIndex(CBlockIndex* pindex) : CBlockIndex(*pindex) + explicit CDiskBlockIndex(const CBlockIndex* pindex) : CBlockIndex(*pindex) { - hashPrev = (pprev ? pprev->GetBlockHash() : uint256()); + hashPrev = (pprev ? pprev->GetBlockHash() : uint256(0)); } ADD_SERIALIZE_METHODS; diff --git a/src/main.cpp b/src/main.cpp index f5610e8162bf1..2387835b29014 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -3538,25 +3538,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::iterator it = setDirtyFileInfo.begin(); it != setDirtyFileInfo.end();) { - if (!pblocktree->WriteBlockFileInfo(*it, vinfoBlockFile[*it])) { - return state.Abort("Failed to write to block index"); + { + std::vector > vFiles; + vFiles.reserve(setDirtyFileInfo.size()); + for (set::iterator it = setDirtyFileInfo.begin(); it != setDirtyFileInfo.end(); ) { + vFiles.push_back(make_pair(*it, &vinfoBlockFile[*it])); + setDirtyFileInfo.erase(it++); } - fileschanged = true; - setDirtyFileInfo.erase(it++); - } - if (fileschanged && !pblocktree->WriteLastBlockFile(nLastBlockFile)) { - return state.Abort("Failed to write to block index"); - } - for (set::iterator it = setDirtyBlockIndex.begin(); it != setDirtyBlockIndex.end();) { - if (!pblocktree->WriteBlockIndex(CDiskBlockIndex(*it))) { - return state.Abort("Failed to write to block index"); + std::vector vBlocks; + vBlocks.reserve(setDirtyBlockIndex.size()); + for (set::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"); } - 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"); diff --git a/src/txdb.cpp b/src/txdb.cpp index 6bc71b4097e9f..3ea4cc97340aa 100644 --- a/src/txdb.cpp +++ b/src/txdb.cpp @@ -83,21 +83,11 @@ 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) @@ -171,6 +161,18 @@ bool CCoinsViewDB::GetStats(CCoinsStats& stats) const return true; } +bool CBlockTreeDB::WriteBatchSync(const std::vector >& fileInfo, int nLastFile, const std::vector& blockinfo) { + CLevelDBBatch batch; + for (std::vector >::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_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); diff --git a/src/txdb.h b/src/txdb.h index 8675ead7466a1..2ca32db4acf91 100644 --- a/src/txdb.h +++ b/src/txdb.h @@ -54,10 +54,9 @@ class CBlockTreeDB : public CLevelDBWrapper public: bool WriteBlockIndex(const CDiskBlockIndex& blockindex); + bool WriteBatchSync(const std::vector >& fileInfo, int nLastFile, const std::vector& 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);