aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormrbandrews <bandrewsny@gmail.com>2015-04-09 11:08:39 -0400
committerWladimir J. van der Laan <laanwj@gmail.com>2015-04-16 10:34:30 +0200
commit57d1f46952bb6ee5c7b1200f29e8854d3191923a (patch)
treeb56940d0a520b67b8aacadf2358ee03cfcdc53cb
parenteae305f4c4a42e82e932403b5b6544dd85880ec1 (diff)
downloadbitcoin-57d1f46952bb6ee5c7b1200f29e8854d3191923a.tar.xz
Fix CheckBlockIndex for reindex.
Some tests in CheckBlockIndex require chainActive.Tip(), but when reindexing, chainActive has not been set on the first call to CheckBlockIndex. reindex.py starts a node, mines 3 blocks, stops, and reindexes with CheckBlockIndex enabled. Rebased-From: 0421c18f3a261f04e83a03f59884e5798af74fd9 Github-Pull: #6012
-rwxr-xr-xqa/rpc-tests/reindex.py34
-rw-r--r--src/main.cpp8
2 files changed, 42 insertions, 0 deletions
diff --git a/qa/rpc-tests/reindex.py b/qa/rpc-tests/reindex.py
new file mode 100755
index 0000000000..fe767586bb
--- /dev/null
+++ b/qa/rpc-tests/reindex.py
@@ -0,0 +1,34 @@
+#!/usr/bin/env python2
+# Copyright (c) 2014 The Bitcoin Core developers
+# Distributed under the MIT software license, see the accompanying
+# file COPYING or http://www.opensource.org/licenses/mit-license.php.
+
+#
+# Test -reindex with CheckBlockIndex
+#
+from test_framework import BitcoinTestFramework
+from bitcoinrpc.authproxy import AuthServiceProxy, JSONRPCException
+from util import *
+import os.path
+
+class ReindexTest(BitcoinTestFramework):
+
+ def setup_chain(self):
+ print("Initializing test directory "+self.options.tmpdir)
+ initialize_chain_clean(self.options.tmpdir, 1)
+
+ def setup_network(self):
+ self.nodes = []
+ self.is_network_split = False
+ self.nodes.append(start_node(0, self.options.tmpdir))
+
+ def run_test(self):
+ self.nodes[0].generate(3)
+ stop_node(self.nodes[0], 0)
+ wait_bitcoinds()
+ self.nodes[0]=start_node(0, self.options.tmpdir, ["-debug", "-reindex", "-checkblockindex=1"])
+ assert_equal(self.nodes[0].getblockcount(), 3)
+ print "Success"
+
+if __name__ == '__main__':
+ ReindexTest().main()
diff --git a/src/main.cpp b/src/main.cpp
index dc6f37c220..4685c779a4 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -3227,6 +3227,14 @@ void static CheckBlockIndex()
LOCK(cs_main);
+ // During a reindex, we read the genesis block and call CheckBlockIndex before ActivateBestChain,
+ // so we have the genesis block in mapBlockIndex but no active chain. (A few of the tests when
+ // iterating the block tree require that chainActive has been initialized.)
+ if (chainActive.Height() < 0) {
+ assert(mapBlockIndex.size() <= 1);
+ return;
+ }
+
// Build forward-pointing map of the entire block tree.
std::multimap<CBlockIndex*,CBlockIndex*> forward;
for (BlockMap::iterator it = mapBlockIndex.begin(); it != mapBlockIndex.end(); it++) {