vTxn.front()->abort();\r
vTxn.clear();\r
pdb = NULL;\r
- dbenv.txn_checkpoint(0, 0, 0);\r
+\r
+ // Flush database activity from memory pool to disk log\r
+ unsigned int nMinutes = 0;\r
+ if (strFile == "addr.dat")\r
+ nMinutes = 2;\r
+ if (strFile == "blkindex.dat" && IsInitialBlockDownload() && nBestHeight % 500 != 0)\r
+ nMinutes = 1;\r
+ dbenv.txn_checkpoint(0, nMinutes, 0);\r
\r
CRITICAL_BLOCK(cs_db)\r
--mapFileUseCount[strFile];\r
\r
bool CTxDB::LoadBlockIndex()\r
{\r
- // Get cursor\r
+ // Get database cursor\r
Dbc* pcursor = GetCursor();\r
if (!pcursor)\r
return false;\r
\r
+ // Load mapBlockIndex\r
unsigned int fFlags = DB_SET_RANGE;\r
loop\r
{\r
pindexNew->nBits = diskindex.nBits;\r
pindexNew->nNonce = diskindex.nNonce;\r
\r
- // Watch for genesis block and best block\r
+ // Watch for genesis block\r
if (pindexGenesisBlock == NULL && diskindex.GetBlockHash() == hashGenesisBlock)\r
pindexGenesisBlock = pindexNew;\r
}\r
}\r
pcursor->close();\r
\r
+ // Calculate bnChainWork\r
+ vector<pair<int, CBlockIndex*> > vSortedByHeight;\r
+ vSortedByHeight.reserve(mapBlockIndex.size());\r
+ foreach(const PAIRTYPE(uint256, CBlockIndex*)& item, mapBlockIndex)\r
+ {\r
+ CBlockIndex* pindex = item.second;\r
+ vSortedByHeight.push_back(make_pair(pindex->nHeight, pindex));\r
+ }\r
+ sort(vSortedByHeight.begin(), vSortedByHeight.end());\r
+ foreach(const PAIRTYPE(int, CBlockIndex*)& item, vSortedByHeight)\r
+ {\r
+ CBlockIndex* pindex = item.second;\r
+ pindex->bnChainWork = (pindex->pprev ? pindex->pprev->bnChainWork : 0) + pindex->GetBlockWork();\r
+ }\r
+\r
+ // Load hashBestChain pointer to end of best chain\r
if (!ReadHashBestChain(hashBestChain))\r
{\r
if (pindexGenesisBlock == NULL)\r
return true;\r
- return error("CTxDB::LoadBlockIndex() : hashBestChain not found");\r
+ return error("CTxDB::LoadBlockIndex() : hashBestChain not loaded");\r
}\r
-\r
if (!mapBlockIndex.count(hashBestChain))\r
- return error("CTxDB::LoadBlockIndex() : blockindex for hashBestChain not found");\r
+ return error("CTxDB::LoadBlockIndex() : hashBestChain not found in the block index");\r
pindexBest = mapBlockIndex[hashBestChain];\r
nBestHeight = pindexBest->nHeight;\r
+ bnBestChainWork = pindexBest->bnChainWork;\r
printf("LoadBlockIndex(): hashBestChain=%s height=%d\n", hashBestChain.ToString().substr(0,16).c_str(), nBestHeight);\r
\r
return true;\r