aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWladimir J. van der Laan <laanwj@gmail.com>2014-09-18 14:08:43 +0200
committerWladimir J. van der Laan <laanwj@gmail.com>2014-09-18 14:20:18 +0200
commit94064710b9123dfb3df8cfd6c32efae349aec281 (patch)
tree84b6105c502fe6edd6115bab292c29b2aaa70f62
parent7fd881367544fcc9e70130bf448a181794da26ab (diff)
Write fee estimate and peers files only when initialized
Fixes #4669. Move the loading of addresses to StartNode() to make it more self-contained.
-rw-r--r--src/init.cpp27
-rw-r--r--src/net.cpp20
2 files changed, 29 insertions, 18 deletions
diff --git a/src/init.cpp b/src/init.cpp
index 67f53e044c..0a6b5abac5 100644
--- a/src/init.cpp
+++ b/src/init.cpp
@@ -47,6 +47,7 @@ using namespace std;
#ifdef ENABLE_WALLET
CWallet* pwalletMain;
#endif
+bool fFeeEstimatesInitialized = false;
#ifdef WIN32
// Win32 LevelDB doesn't use filedescriptors, and the ones used for
@@ -119,6 +120,10 @@ void Shutdown()
if (!lockShutdown)
return;
+ /// Note: Shutdown() must be able to handle cases in which AppInit2() failed part of the way,
+ /// for example if the data directory was found to be locked.
+ /// Be sure that anything that writes files or flushes caches only does this if the respective
+ /// module was initialized.
RenameThread("bitcoin-shutoff");
mempool.AddTransactionsUpdated(1);
StopRPCThreads();
@@ -130,6 +135,7 @@ void Shutdown()
StopNode();
UnregisterNodeSignals(GetNodeSignals());
+ if (fFeeEstimatesInitialized)
{
boost::filesystem::path est_path = GetDataDir() / FEE_ESTIMATES_FILENAME;
CAutoFile est_fileout(fopen(est_path.string().c_str(), "wb"), SER_DISK, CLIENT_VERSION);
@@ -137,6 +143,7 @@ void Shutdown()
mempool.WriteFeeEstimates(est_fileout);
else
LogPrintf("%s: Failed to write fee estimates to %s\n", __func__, est_path.string());
+ fFeeEstimatesInitialized = false;
}
{
@@ -1056,6 +1063,7 @@ bool AppInit2(boost::thread_group& threadGroup)
// Allowed to fail as this file IS missing on first startup.
if (est_filein)
mempool.ReadFeeEstimates(est_filein);
+ fFeeEstimatesInitialized = true;
// ********************************************************* Step 8: load wallet
#ifdef ENABLE_WALLET
@@ -1212,22 +1220,7 @@ bool AppInit2(boost::thread_group& threadGroup)
}
threadGroup.create_thread(boost::bind(&ThreadImport, vImportFiles));
- // ********************************************************* Step 10: load peers
-
- uiInterface.InitMessage(_("Loading addresses..."));
-
- nStart = GetTimeMillis();
-
- {
- CAddrDB adb;
- if (!adb.Read(addrman))
- LogPrintf("Invalid or missing peers.dat; recreating\n");
- }
-
- LogPrintf("Loaded %i addresses from peers.dat %dms\n",
- addrman.size(), GetTimeMillis() - nStart);
-
- // ********************************************************* Step 11: start node
+ // ********************************************************* Step 10: start node
if (!CheckDiskSpace())
return false;
@@ -1256,7 +1249,7 @@ bool AppInit2(boost::thread_group& threadGroup)
GenerateBitcoins(GetBoolArg("-gen", false), pwalletMain, GetArg("-genproclimit", -1));
#endif
- // ********************************************************* Step 12: finished
+ // ********************************************************* Step 11: finished
uiInterface.InitMessage(_("Done loading"));
diff --git a/src/net.cpp b/src/net.cpp
index ab547e2fd7..ebb103b636 100644
--- a/src/net.cpp
+++ b/src/net.cpp
@@ -78,6 +78,7 @@ uint64_t nLocalHostNonce = 0;
static std::vector<ListenSocket> vhListenSocket;
CAddrMan addrman;
int nMaxConnections = 125;
+bool fAddressesInitialized = false;
vector<CNode*> vNodes;
CCriticalSection cs_vNodes;
@@ -1739,6 +1740,18 @@ void static Discover(boost::thread_group& threadGroup)
void StartNode(boost::thread_group& threadGroup)
{
+ uiInterface.InitMessage(_("Loading addresses..."));
+ // Load addresses for peers.dat
+ int64_t nStart = GetTimeMillis();
+ {
+ CAddrDB adb;
+ if (!adb.Read(addrman))
+ LogPrintf("Invalid or missing peers.dat; recreating\n");
+ }
+ LogPrintf("Loaded %i addresses from peers.dat %dms\n",
+ addrman.size(), GetTimeMillis() - nStart);
+ fAddressesInitialized = true;
+
if (semOutbound == NULL) {
// initialize semaphore
int nMaxOutbound = min(MAX_OUTBOUND_CONNECTIONS, nMaxConnections);
@@ -1785,7 +1798,12 @@ bool StopNode()
if (semOutbound)
for (int i=0; i<MAX_OUTBOUND_CONNECTIONS; i++)
semOutbound->post();
- DumpAddresses();
+
+ if (fAddressesInitialized)
+ {
+ DumpAddresses();
+ fAddressesInitialized = false;
+ }
return true;
}