From 6293a9f87f8883fecb18042681407d1de6c20485 Mon Sep 17 00:00:00 2001 From: Gavin Andresen Date: Thu, 29 Mar 2012 13:34:07 -0400 Subject: [PATCH 1/2] Workaround hangs when upgrading old addr.dat files --- src/db.cpp | 33 +++++++++++---------------------- 1 file changed, 11 insertions(+), 22 deletions(-) diff --git a/src/db.cpp b/src/db.cpp index 2dc86e79f..79c4e4778 100644 --- a/src/db.cpp +++ b/src/db.cpp @@ -722,12 +722,13 @@ bool CAddrDB::WriteAddrman(const CAddrMan& addrman) bool CAddrDB::LoadAddresses() { - bool fAddrMan = false; if (Read(string("addrman"), addrman)) { printf("Loaded %i addresses\n", addrman.size()); - fAddrMan = true; + return true; } + + // Read pre-0.6 addr records vector vAddr; vector > vDelete; @@ -753,31 +754,19 @@ bool CAddrDB::LoadAddresses() ssKey >> strType; if (strType == "addr") { - if (fAddrMan) - { - vector vchKey; - ssKey >> vchKey; - vDelete.push_back(vchKey); - } - else - { - CAddress addr; - ssValue >> addr; - vAddr.push_back(addr); - } - + CAddress addr; + ssValue >> addr; + vAddr.push_back(addr); } } pcursor->close(); - BOOST_FOREACH(const vector &vchKey, vDelete) - Erase(make_pair(string("addr"), vchKey)); + addrman.Add(vAddr, CNetAddr("0.0.0.0")); + printf("Loaded %i addresses\n", addrman.size()); - if (!fAddrMan) - { - addrman.Add(vAddr, CNetAddr("0.0.0.0")); - printf("Loaded %i addresses\n", addrman.size()); - } + // Note: old records left; we ran into hangs-on-startup + // bugs for some users who (we think) were running after + // an unclean shutdown. return true; } From 25c5eca8939832e94556810ae30f1f7830e1c29c Mon Sep 17 00:00:00 2001 From: Pieter Wuille Date: Wed, 28 Mar 2012 22:09:18 +0200 Subject: [PATCH 2/2] Use transactions-updated as flush condition The normal checkpointing during the block chain download is reduced to every five minutes only, but forced every 200000 updated transactions. --- src/db.cpp | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/db.cpp b/src/db.cpp index 2dc86e79f..90353bafe 100644 --- a/src/db.cpp +++ b/src/db.cpp @@ -28,6 +28,7 @@ static bool fDbEnvInit = false; DbEnv dbenv(0); static map mapFileUseCount; static map mapDb; +static int64 nTxn = 0; static void EnvShutdown() { @@ -160,8 +161,15 @@ void CDB::Close() nMinutes = 1; if (strFile == "addr.dat") nMinutes = 2; - if (strFile == "blkindex.dat" && IsInitialBlockDownload() && nBestHeight % 5000 != 0) - nMinutes = 1; + if (strFile == "blkindex.dat" && IsInitialBlockDownload()) + nMinutes = 5; + + if (nMinutes == 0 || nTxn > 200000) + { + nTxn = 0; + nMinutes = 0; + } + dbenv.txn_checkpoint(0, nMinutes, 0); CRITICAL_BLOCK(cs_db) @@ -336,6 +344,7 @@ bool CTxDB::ReadTxIndex(uint256 hash, CTxIndex& txindex) bool CTxDB::UpdateTxIndex(uint256 hash, const CTxIndex& txindex) { assert(!fClient); + nTxn++; return Write(make_pair(string("tx"), hash), txindex); } @@ -346,6 +355,7 @@ bool CTxDB::AddTxIndex(const CTransaction& tx, const CDiskTxPos& pos, int nHeigh // Add to tx index uint256 hash = tx.GetHash(); CTxIndex txindex(pos, tx.vout.size()); + nTxn++; return Write(make_pair(string("tx"), hash), txindex); }