Browse Source

Write fee estimate and peers files only when initialized

Fixes #4669.

Move the loading of addresses to StartNode() to make it more
self-contained.
0.10
Wladimir J. van der Laan 10 years ago
parent
commit
94064710b9
  1. 27
      src/init.cpp
  2. 18
      src/net.cpp

27
src/init.cpp

@ -47,6 +47,7 @@ using namespace std;
#ifdef ENABLE_WALLET #ifdef ENABLE_WALLET
CWallet* pwalletMain; CWallet* pwalletMain;
#endif #endif
bool fFeeEstimatesInitialized = false;
#ifdef WIN32 #ifdef WIN32
// Win32 LevelDB doesn't use filedescriptors, and the ones used for // Win32 LevelDB doesn't use filedescriptors, and the ones used for
@ -119,6 +120,10 @@ void Shutdown()
if (!lockShutdown) if (!lockShutdown)
return; 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"); RenameThread("bitcoin-shutoff");
mempool.AddTransactionsUpdated(1); mempool.AddTransactionsUpdated(1);
StopRPCThreads(); StopRPCThreads();
@ -130,6 +135,7 @@ void Shutdown()
StopNode(); StopNode();
UnregisterNodeSignals(GetNodeSignals()); UnregisterNodeSignals(GetNodeSignals());
if (fFeeEstimatesInitialized)
{ {
boost::filesystem::path est_path = GetDataDir() / FEE_ESTIMATES_FILENAME; boost::filesystem::path est_path = GetDataDir() / FEE_ESTIMATES_FILENAME;
CAutoFile est_fileout(fopen(est_path.string().c_str(), "wb"), SER_DISK, CLIENT_VERSION); CAutoFile est_fileout(fopen(est_path.string().c_str(), "wb"), SER_DISK, CLIENT_VERSION);
@ -137,6 +143,7 @@ void Shutdown()
mempool.WriteFeeEstimates(est_fileout); mempool.WriteFeeEstimates(est_fileout);
else else
LogPrintf("%s: Failed to write fee estimates to %s\n", __func__, est_path.string()); 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. // Allowed to fail as this file IS missing on first startup.
if (est_filein) if (est_filein)
mempool.ReadFeeEstimates(est_filein); mempool.ReadFeeEstimates(est_filein);
fFeeEstimatesInitialized = true;
// ********************************************************* Step 8: load wallet // ********************************************************* Step 8: load wallet
#ifdef ENABLE_WALLET #ifdef ENABLE_WALLET
@ -1212,22 +1220,7 @@ bool AppInit2(boost::thread_group& threadGroup)
} }
threadGroup.create_thread(boost::bind(&ThreadImport, vImportFiles)); threadGroup.create_thread(boost::bind(&ThreadImport, vImportFiles));
// ********************************************************* Step 10: load peers // ********************************************************* Step 10: start node
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
if (!CheckDiskSpace()) if (!CheckDiskSpace())
return false; return false;
@ -1256,7 +1249,7 @@ bool AppInit2(boost::thread_group& threadGroup)
GenerateBitcoins(GetBoolArg("-gen", false), pwalletMain, GetArg("-genproclimit", -1)); GenerateBitcoins(GetBoolArg("-gen", false), pwalletMain, GetArg("-genproclimit", -1));
#endif #endif
// ********************************************************* Step 12: finished // ********************************************************* Step 11: finished
uiInterface.InitMessage(_("Done loading")); uiInterface.InitMessage(_("Done loading"));

18
src/net.cpp

@ -78,6 +78,7 @@ uint64_t nLocalHostNonce = 0;
static std::vector<ListenSocket> vhListenSocket; static std::vector<ListenSocket> vhListenSocket;
CAddrMan addrman; CAddrMan addrman;
int nMaxConnections = 125; int nMaxConnections = 125;
bool fAddressesInitialized = false;
vector<CNode*> vNodes; vector<CNode*> vNodes;
CCriticalSection cs_vNodes; CCriticalSection cs_vNodes;
@ -1739,6 +1740,18 @@ void static Discover(boost::thread_group& threadGroup)
void StartNode(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) { if (semOutbound == NULL) {
// initialize semaphore // initialize semaphore
int nMaxOutbound = min(MAX_OUTBOUND_CONNECTIONS, nMaxConnections); int nMaxOutbound = min(MAX_OUTBOUND_CONNECTIONS, nMaxConnections);
@ -1785,7 +1798,12 @@ bool StopNode()
if (semOutbound) if (semOutbound)
for (int i=0; i<MAX_OUTBOUND_CONNECTIONS; i++) for (int i=0; i<MAX_OUTBOUND_CONNECTIONS; i++)
semOutbound->post(); semOutbound->post();
if (fAddressesInitialized)
{
DumpAddresses(); DumpAddresses();
fAddressesInitialized = false;
}
return true; return true;
} }

Loading…
Cancel
Save