Reorganize at startup to best known block
authoralex <alex@alex-VirtualBox.(none)>
Wed, 22 Jan 2014 16:29:20 +0000 (20:29 +0400)
committeralex <alex@alex-VirtualBox.(none)>
Wed, 22 Jan 2014 16:29:20 +0000 (20:29 +0400)
Trying to detect the presence of a better chain in chain.dat and then reorganize to this chain using existent blk files.

src/init.cpp

index ef0067f..565eec7 100644 (file)
@@ -846,6 +846,40 @@ bool AppInit2()
 
     // ********************************************************* Step 9: import blocks
 
+    // scan for better chains in the block chain database, that are not yet connected in the active best chain
+    CBlockIndex *pindexFoundBest = pindexBest;
+    for (std::map<uint256,CBlockIndex*>::iterator it = mapBlockIndex.begin(); it != mapBlockIndex.end(); it++) {
+        CBlockIndex *pindex = it->second;
+        if (pindexFoundBest==NULL || pindex->nChainTrust > pindexFoundBest->nChainTrust)
+            pindexFoundBest = pindex;
+    }
+    if (pindexFoundBest != pindexBest) {
+        uiInterface.InitMessage(_("Importing blocks from block database..."));
+        uint64 nTxs = 0;
+        uint64 nBlocks = 0;
+        std::vector<CBlockIndex*> vAttach;
+        vAttach.reserve(pindexFoundBest->nHeight - (pindexBest==NULL ? 0 : pindexBest->nHeight));
+        while (pindexFoundBest && pindexFoundBest->nChainTrust > (pindexBest==NULL ? 0 : pindexBest->nChainTrust)) {
+            vAttach.push_back(pindexFoundBest);
+            pindexFoundBest = pindexFoundBest->pprev;
+        }
+        for (std::vector<CBlockIndex*>::reverse_iterator it = vAttach.rbegin(); it != vAttach.rend(); it++) {
+            CBlockIndex *pindex = *it;
+            CBlock block;
+            if (!block.ReadFromDisk(pindex))
+                break;
+            nTxs += block.vtx.size();
+            nBlocks++;
+            if (pindex->nHeight == 0 || nTxs + nBlocks*3 > 500) {
+                nTxs=0;
+                nBlocks=0;
+                block.SetBestChain(pindex);
+            }
+            if (fRequestShutdown)
+                break;
+        }
+    }
+
     if (mapArgs.count("-loadblock"))
     {
         uiInterface.InitMessage(_("Importing blockchain data file."));