Move g_is_mempool_loaded into CTxMemPool::m_is_loaded

So the loaded state is explicitly mempool-specific.
This commit is contained in:
Ben Woosley 2019-03-07 09:54:44 -05:00
parent bb8ae2c419
commit effe81f750
No known key found for this signature in database
GPG key ID: 4D8CA4BA18040906
6 changed files with 38 additions and 20 deletions

View file

@ -235,8 +235,8 @@ void Shutdown(InitInterfaces& interfaces)
g_banman.reset(); g_banman.reset();
g_txindex.reset(); g_txindex.reset();
if (g_is_mempool_loaded && gArgs.GetArg("-persistmempool", DEFAULT_PERSIST_MEMPOOL)) { if (::mempool.IsLoaded() && gArgs.GetArg("-persistmempool", DEFAULT_PERSIST_MEMPOOL)) {
DumpMempool(); DumpMempool(::mempool);
} }
if (fFeeEstimatesInitialized) if (fFeeEstimatesInitialized)
@ -725,9 +725,9 @@ static void ThreadImport(std::vector<fs::path> vImportFiles)
} }
} // End scope of CImportingNow } // End scope of CImportingNow
if (gArgs.GetArg("-persistmempool", DEFAULT_PERSIST_MEMPOOL)) { if (gArgs.GetArg("-persistmempool", DEFAULT_PERSIST_MEMPOOL)) {
LoadMempool(); LoadMempool(::mempool);
} }
g_is_mempool_loaded = !ShutdownRequested(); ::mempool.SetIsLoaded(!ShutdownRequested());
} }
/** Sanity checks /** Sanity checks

View file

@ -1484,7 +1484,7 @@ static UniValue getchaintips(const JSONRPCRequest& request)
UniValue MempoolInfoToJSON(const CTxMemPool& pool) UniValue MempoolInfoToJSON(const CTxMemPool& pool)
{ {
UniValue ret(UniValue::VOBJ); UniValue ret(UniValue::VOBJ);
ret.pushKV("loaded", g_is_mempool_loaded); ret.pushKV("loaded", pool.IsLoaded());
ret.pushKV("size", (int64_t)pool.size()); ret.pushKV("size", (int64_t)pool.size());
ret.pushKV("bytes", (int64_t)pool.GetTotalTxSize()); ret.pushKV("bytes", (int64_t)pool.GetTotalTxSize());
ret.pushKV("usage", (int64_t)pool.DynamicMemoryUsage()); ret.pushKV("usage", (int64_t)pool.DynamicMemoryUsage());
@ -2056,11 +2056,11 @@ static UniValue savemempool(const JSONRPCRequest& request)
}.ToString()); }.ToString());
} }
if (!g_is_mempool_loaded) { if (!::mempool.IsLoaded()) {
throw JSONRPCError(RPC_MISC_ERROR, "The mempool was not loaded yet"); throw JSONRPCError(RPC_MISC_ERROR, "The mempool was not loaded yet");
} }
if (!DumpMempool()) { if (!DumpMempool(::mempool)) {
throw JSONRPCError(RPC_MISC_ERROR, "Unable to dump mempool to disk"); throw JSONRPCError(RPC_MISC_ERROR, "Unable to dump mempool to disk");
} }

View file

@ -1090,4 +1090,16 @@ void CTxMemPool::GetTransactionAncestry(const uint256& txid, size_t& ancestors,
} }
} }
bool CTxMemPool::IsLoaded() const
{
LOCK(cs);
return m_is_loaded;
}
void CTxMemPool::SetIsLoaded(bool loaded)
{
LOCK(cs);
m_is_loaded = loaded;
}
SaltedTxidHasher::SaltedTxidHasher() : k0(GetRand(std::numeric_limits<uint64_t>::max())), k1(GetRand(std::numeric_limits<uint64_t>::max())) {} SaltedTxidHasher::SaltedTxidHasher() : k0(GetRand(std::numeric_limits<uint64_t>::max())), k1(GetRand(std::numeric_limits<uint64_t>::max())) {}

View file

@ -455,6 +455,8 @@ private:
void trackPackageRemoved(const CFeeRate& rate) EXCLUSIVE_LOCKS_REQUIRED(cs); void trackPackageRemoved(const CFeeRate& rate) EXCLUSIVE_LOCKS_REQUIRED(cs);
bool m_is_loaded GUARDED_BY(cs){false};
public: public:
static const int ROLLING_FEE_HALFLIFE = 60 * 60 * 12; // public only for testing static const int ROLLING_FEE_HALFLIFE = 60 * 60 * 12; // public only for testing
@ -672,6 +674,12 @@ public:
*/ */
void GetTransactionAncestry(const uint256& txid, size_t& ancestors, size_t& descendants) const; void GetTransactionAncestry(const uint256& txid, size_t& ancestors, size_t& descendants) const;
/** @returns true if the mempool is fully loaded */
bool IsLoaded() const;
/** Sets the current loaded state */
void SetIsLoaded(bool loaded);
unsigned long size() const unsigned long size() const
{ {
LOCK(cs); LOCK(cs);

View file

@ -251,7 +251,6 @@ CAmount maxTxFee = DEFAULT_TRANSACTION_MAXFEE;
CBlockPolicyEstimator feeEstimator; CBlockPolicyEstimator feeEstimator;
CTxMemPool mempool(&feeEstimator); CTxMemPool mempool(&feeEstimator);
std::atomic_bool g_is_mempool_loaded{false};
/** Constant stuff for coinbase transactions we create: */ /** Constant stuff for coinbase transactions we create: */
CScript COINBASE_FLAGS; CScript COINBASE_FLAGS;
@ -4648,7 +4647,7 @@ int VersionBitsTipStateSinceHeight(const Consensus::Params& params, Consensus::D
static const uint64_t MEMPOOL_DUMP_VERSION = 1; static const uint64_t MEMPOOL_DUMP_VERSION = 1;
bool LoadMempool() bool LoadMempool(CTxMemPool& pool)
{ {
const CChainParams& chainparams = Params(); const CChainParams& chainparams = Params();
int64_t nExpiryTimeout = gArgs.GetArg("-mempoolexpiry", DEFAULT_MEMPOOL_EXPIRY) * 60 * 60; int64_t nExpiryTimeout = gArgs.GetArg("-mempoolexpiry", DEFAULT_MEMPOOL_EXPIRY) * 60 * 60;
@ -4683,12 +4682,12 @@ bool LoadMempool()
CAmount amountdelta = nFeeDelta; CAmount amountdelta = nFeeDelta;
if (amountdelta) { if (amountdelta) {
mempool.PrioritiseTransaction(tx->GetHash(), amountdelta); pool.PrioritiseTransaction(tx->GetHash(), amountdelta);
} }
CValidationState state; CValidationState state;
if (nTime + nExpiryTimeout > nNow) { if (nTime + nExpiryTimeout > nNow) {
LOCK(cs_main); LOCK(cs_main);
AcceptToMemoryPoolWithTime(chainparams, mempool, state, tx, nullptr /* pfMissingInputs */, nTime, AcceptToMemoryPoolWithTime(chainparams, pool, state, tx, nullptr /* pfMissingInputs */, nTime,
nullptr /* plTxnReplaced */, false /* bypass_limits */, 0 /* nAbsurdFee */, nullptr /* plTxnReplaced */, false /* bypass_limits */, 0 /* nAbsurdFee */,
false /* test_accept */); false /* test_accept */);
if (state.IsValid()) { if (state.IsValid()) {
@ -4698,7 +4697,7 @@ bool LoadMempool()
// wallet(s) having loaded it while we were processing // wallet(s) having loaded it while we were processing
// mempool transactions; consider these as valid, instead of // mempool transactions; consider these as valid, instead of
// failed, but mark them as 'already there' // failed, but mark them as 'already there'
if (mempool.exists(tx->GetHash())) { if (pool.exists(tx->GetHash())) {
++already_there; ++already_there;
} else { } else {
++failed; ++failed;
@ -4714,7 +4713,7 @@ bool LoadMempool()
file >> mapDeltas; file >> mapDeltas;
for (const auto& i : mapDeltas) { for (const auto& i : mapDeltas) {
mempool.PrioritiseTransaction(i.first, i.second); pool.PrioritiseTransaction(i.first, i.second);
} }
} catch (const std::exception& e) { } catch (const std::exception& e) {
LogPrintf("Failed to deserialize mempool data on disk: %s. Continuing anyway.\n", e.what()); LogPrintf("Failed to deserialize mempool data on disk: %s. Continuing anyway.\n", e.what());
@ -4725,7 +4724,7 @@ bool LoadMempool()
return true; return true;
} }
bool DumpMempool() bool DumpMempool(const CTxMemPool& pool)
{ {
int64_t start = GetTimeMicros(); int64_t start = GetTimeMicros();
@ -4736,11 +4735,11 @@ bool DumpMempool()
LOCK(dump_mutex); LOCK(dump_mutex);
{ {
LOCK(mempool.cs); LOCK(pool.cs);
for (const auto &i : mempool.mapDeltas) { for (const auto &i : pool.mapDeltas) {
mapDeltas[i.first] = i.second; mapDeltas[i.first] = i.second;
} }
vinfo = mempool.infoAll(); vinfo = pool.infoAll();
} }
int64_t mid = GetTimeMicros(); int64_t mid = GetTimeMicros();

View file

@ -149,7 +149,6 @@ extern CScript COINBASE_FLAGS;
extern CCriticalSection cs_main; extern CCriticalSection cs_main;
extern CBlockPolicyEstimator feeEstimator; extern CBlockPolicyEstimator feeEstimator;
extern CTxMemPool mempool; extern CTxMemPool mempool;
extern std::atomic_bool g_is_mempool_loaded;
typedef std::unordered_map<uint256, CBlockIndex*, BlockHasher> BlockMap; typedef std::unordered_map<uint256, CBlockIndex*, BlockHasher> BlockMap;
extern BlockMap& mapBlockIndex GUARDED_BY(cs_main); extern BlockMap& mapBlockIndex GUARDED_BY(cs_main);
extern const std::string strMessageMagic; extern const std::string strMessageMagic;
@ -486,10 +485,10 @@ static const unsigned int REJECT_HIGHFEE = 0x100;
CBlockFileInfo* GetBlockFileInfo(size_t n); CBlockFileInfo* GetBlockFileInfo(size_t n);
/** Dump the mempool to disk. */ /** Dump the mempool to disk. */
bool DumpMempool(); bool DumpMempool(const CTxMemPool& pool);
/** Load the mempool from disk. */ /** Load the mempool from disk. */
bool LoadMempool(); bool LoadMempool(CTxMemPool& pool);
//! Check whether the block associated with this index entry is pruned or not. //! Check whether the block associated with this index entry is pruned or not.
inline bool IsBlockPruned(const CBlockIndex* pblockindex) inline bool IsBlockPruned(const CBlockIndex* pblockindex)