Cover UTXO set access with lock annotations
i.e. any CoinsViews members. Adds a lock acquisition to `gettxoutsetinfo` RPC to comply with added annotations. Co-authored-by: Russell Yanofsky <russ@yanofsky.org>
This commit is contained in:
parent
5693530685
commit
582d2cd747
4 changed files with 22 additions and 14 deletions
|
@ -235,8 +235,11 @@ void Shutdown(InitInterfaces& interfaces)
|
||||||
//
|
//
|
||||||
// g_chainstate is referenced here directly (instead of ::ChainstateActive()) because it
|
// g_chainstate is referenced here directly (instead of ::ChainstateActive()) because it
|
||||||
// may not have been initialized yet.
|
// may not have been initialized yet.
|
||||||
if (g_chainstate && g_chainstate->CanFlushToDisk()) {
|
{
|
||||||
g_chainstate->ForceFlushStateToDisk();
|
LOCK(cs_main);
|
||||||
|
if (g_chainstate && g_chainstate->CanFlushToDisk()) {
|
||||||
|
g_chainstate->ForceFlushStateToDisk();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// After there are no more peers/RPC left to give us new data which may generate
|
// After there are no more peers/RPC left to give us new data which may generate
|
||||||
|
|
|
@ -1062,7 +1062,9 @@ static UniValue gettxoutsetinfo(const JSONRPCRequest& request)
|
||||||
|
|
||||||
CCoinsStats stats;
|
CCoinsStats stats;
|
||||||
::ChainstateActive().ForceFlushStateToDisk();
|
::ChainstateActive().ForceFlushStateToDisk();
|
||||||
if (GetUTXOStats(&::ChainstateActive().CoinsDB(), stats)) {
|
|
||||||
|
CCoinsView* coins_view = WITH_LOCK(cs_main, return &ChainstateActive().CoinsDB());
|
||||||
|
if (GetUTXOStats(coins_view, stats)) {
|
||||||
ret.pushKV("height", (int64_t)stats.nHeight);
|
ret.pushKV("height", (int64_t)stats.nHeight);
|
||||||
ret.pushKV("bestblock", stats.hashBlock.GetHex());
|
ret.pushKV("bestblock", stats.hashBlock.GetHex());
|
||||||
ret.pushKV("transactions", (int64_t)stats.nTransactions);
|
ret.pushKV("transactions", (int64_t)stats.nTransactions);
|
||||||
|
|
|
@ -314,7 +314,8 @@ bool CheckSequenceLocks(const CTxMemPool& pool, const CTransaction& tx, int flag
|
||||||
// Returns the script flags which should be checked for a given block
|
// Returns the script flags which should be checked for a given block
|
||||||
static unsigned int GetBlockScriptFlags(const CBlockIndex* pindex, const Consensus::Params& chainparams);
|
static unsigned int GetBlockScriptFlags(const CBlockIndex* pindex, const Consensus::Params& chainparams);
|
||||||
|
|
||||||
static void LimitMempoolSize(CTxMemPool& pool, size_t limit, unsigned long age) EXCLUSIVE_LOCKS_REQUIRED(pool.cs)
|
static void LimitMempoolSize(CTxMemPool& pool, size_t limit, unsigned long age)
|
||||||
|
EXCLUSIVE_LOCKS_REQUIRED(pool.cs, ::cs_main)
|
||||||
{
|
{
|
||||||
int expired = pool.Expire(GetTime() - age);
|
int expired = pool.Expire(GetTime() - age);
|
||||||
if (expired != 0) {
|
if (expired != 0) {
|
||||||
|
@ -2160,7 +2161,9 @@ static void AppendWarning(std::string& res, const std::string& warn)
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Check warning conditions and do some notifications on new chain tip set. */
|
/** Check warning conditions and do some notifications on new chain tip set. */
|
||||||
void static UpdateTip(const CBlockIndex *pindexNew, const CChainParams& chainParams) {
|
void static UpdateTip(const CBlockIndex* pindexNew, const CChainParams& chainParams)
|
||||||
|
EXCLUSIVE_LOCKS_REQUIRED(::cs_main)
|
||||||
|
{
|
||||||
// New best block
|
// New best block
|
||||||
mempool.AddTransactionsUpdated(1);
|
mempool.AddTransactionsUpdated(1);
|
||||||
|
|
||||||
|
|
|
@ -519,14 +519,14 @@ class CoinsViews {
|
||||||
public:
|
public:
|
||||||
//! The lowest level of the CoinsViews cache hierarchy sits in a leveldb database on disk.
|
//! The lowest level of the CoinsViews cache hierarchy sits in a leveldb database on disk.
|
||||||
//! All unspent coins reside in this store.
|
//! All unspent coins reside in this store.
|
||||||
CCoinsViewDB m_dbview;
|
CCoinsViewDB m_dbview GUARDED_BY(cs_main);
|
||||||
|
|
||||||
//! This view wraps access to the leveldb instance and handles read errors gracefully.
|
//! This view wraps access to the leveldb instance and handles read errors gracefully.
|
||||||
CCoinsViewErrorCatcher m_catcherview;
|
CCoinsViewErrorCatcher m_catcherview GUARDED_BY(cs_main);
|
||||||
|
|
||||||
//! This is the top layer of the cache hierarchy - it keeps as many coins in memory as
|
//! This is the top layer of the cache hierarchy - it keeps as many coins in memory as
|
||||||
//! can fit per the dbcache setting.
|
//! can fit per the dbcache setting.
|
||||||
std::unique_ptr<CCoinsViewCache> m_cacheview;
|
std::unique_ptr<CCoinsViewCache> m_cacheview GUARDED_BY(cs_main);
|
||||||
|
|
||||||
//! This constructor initializes CCoinsViewDB and CCoinsViewErrorCatcher instances, but it
|
//! This constructor initializes CCoinsViewDB and CCoinsViewErrorCatcher instances, but it
|
||||||
//! *does not* create a CCoinsViewCache instance by default. This is done separately because the
|
//! *does not* create a CCoinsViewCache instance by default. This is done separately because the
|
||||||
|
@ -537,7 +537,7 @@ public:
|
||||||
CoinsViews(std::string ldb_name, size_t cache_size_bytes, bool in_memory, bool should_wipe);
|
CoinsViews(std::string ldb_name, size_t cache_size_bytes, bool in_memory, bool should_wipe);
|
||||||
|
|
||||||
//! Initialize the CCoinsViewCache member.
|
//! Initialize the CCoinsViewCache member.
|
||||||
void InitCache();
|
void InitCache() EXCLUSIVE_LOCKS_REQUIRED(::cs_main);
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -609,11 +609,11 @@ public:
|
||||||
|
|
||||||
//! Initialize the in-memory coins cache (to be done after the health of the on-disk database
|
//! Initialize the in-memory coins cache (to be done after the health of the on-disk database
|
||||||
//! is verified).
|
//! is verified).
|
||||||
void InitCoinsCache();
|
void InitCoinsCache() EXCLUSIVE_LOCKS_REQUIRED(::cs_main);
|
||||||
|
|
||||||
//! @returns whether or not the CoinsViews object has been fully initialized and we can
|
//! @returns whether or not the CoinsViews object has been fully initialized and we can
|
||||||
//! safely flush this object to disk.
|
//! safely flush this object to disk.
|
||||||
bool CanFlushToDisk() {
|
bool CanFlushToDisk() EXCLUSIVE_LOCKS_REQUIRED(cs_main) {
|
||||||
return m_coins_views && m_coins_views->m_cacheview;
|
return m_coins_views && m_coins_views->m_cacheview;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -629,21 +629,21 @@ public:
|
||||||
std::set<CBlockIndex*, CBlockIndexWorkComparator> setBlockIndexCandidates;
|
std::set<CBlockIndex*, CBlockIndexWorkComparator> setBlockIndexCandidates;
|
||||||
|
|
||||||
//! @returns A reference to the in-memory cache of the UTXO set.
|
//! @returns A reference to the in-memory cache of the UTXO set.
|
||||||
CCoinsViewCache& CoinsTip()
|
CCoinsViewCache& CoinsTip() EXCLUSIVE_LOCKS_REQUIRED(cs_main)
|
||||||
{
|
{
|
||||||
assert(m_coins_views->m_cacheview);
|
assert(m_coins_views->m_cacheview);
|
||||||
return *m_coins_views->m_cacheview.get();
|
return *m_coins_views->m_cacheview.get();
|
||||||
}
|
}
|
||||||
|
|
||||||
//! @returns A reference to the on-disk UTXO set database.
|
//! @returns A reference to the on-disk UTXO set database.
|
||||||
CCoinsViewDB& CoinsDB()
|
CCoinsViewDB& CoinsDB() EXCLUSIVE_LOCKS_REQUIRED(cs_main)
|
||||||
{
|
{
|
||||||
return m_coins_views->m_dbview;
|
return m_coins_views->m_dbview;
|
||||||
}
|
}
|
||||||
|
|
||||||
//! @returns A reference to a wrapped view of the in-memory UTXO set that
|
//! @returns A reference to a wrapped view of the in-memory UTXO set that
|
||||||
//! handles disk read errors gracefully.
|
//! handles disk read errors gracefully.
|
||||||
CCoinsViewErrorCatcher& CoinsErrorCatcher()
|
CCoinsViewErrorCatcher& CoinsErrorCatcher() EXCLUSIVE_LOCKS_REQUIRED(cs_main)
|
||||||
{
|
{
|
||||||
return m_coins_views->m_catcherview;
|
return m_coins_views->m_catcherview;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue