changeset 245:2bc847edc86b draft

erase the bad chain after disconnecting it
author Satoshi Nakamoto <satoshin@gmx.com>
date Mon, 16 Aug 2010 20:54:47 +0000
parents bf38622eb0b9
children 6feb0c81e60b
files db.cpp
diffstat 1 files changed, 12 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/db.cpp
+++ b/db.cpp
@@ -460,9 +460,12 @@
     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 @@
         {
             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 @@
             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;