diff options
author | Satoshi Nakamoto <satoshin@gmx.com> | 2010-08-16 20:54:47 +0000 |
---|---|---|
committer | Gavin Andresen <gavinandresen@gmail.com> | 2010-08-16 20:54:47 +0000 |
commit | 21ca2d833b85673c482803b1c382bbe948b2c44a (patch) | |
tree | ac84b90ff3229cf78122eec29aadd118fbb9d7f4 /db.cpp | |
parent | bb3fd02930ba5cb8e8a3a92ede9612955edeee05 (diff) |
erase the bad chain after disconnecting it
Diffstat (limited to 'db.cpp')
-rw-r--r-- | db.cpp | 12 |
1 files changed, 12 insertions, 0 deletions
@@ -460,9 +460,12 @@ bool CTxDB::LoadBlockIndex() ReadBestInvalidWork(bnBestInvalidWork); // Verify blocks in the best chain + vector<CBlockIndex*> vChain; + vector<CBlockIndex*> vBad; CBlockIndex* pindexFork = NULL; for (CBlockIndex* pindex = pindexBest; pindex && pindex->pprev; pindex = pindex->pprev) { + vChain.push_back(pindex); CBlock block; if (!block.ReadFromDisk(pindex)) return error("LoadBlockIndex() : block.ReadFromDisk failed"); @@ -470,6 +473,7 @@ bool CTxDB::LoadBlockIndex() { printf("LoadBlockIndex() : *** found bad block at %d, hash=%s\n", pindex->nHeight, pindex->GetBlockHash().ToString().c_str()); pindexFork = pindex->pprev; + vBad = vChain; } } if (pindexFork) @@ -480,6 +484,14 @@ bool CTxDB::LoadBlockIndex() return error("LoadBlockIndex() : block.ReadFromDisk failed"); CTxDB txdb; block.SetBestChain(txdb, pindexFork); + + // Delete the bad chain + foreach(CBlockIndex* pindex, vBad) + { + txdb.EraseBlockIndex(pindex->GetBlockHash()); + mapBlockIndex.erase(pindex->GetBlockHash()); + delete pindex; + } } return true; |