coinstats: Extract index_requested in-member to in-param

This change removes CCoinsStats' index_requested in-param member and
adds it to the relevant functions instead.
This commit is contained in:
Carl Dong 2022-02-13 19:34:17 -05:00
parent a789f3f2b8
commit 46eb9fc56a
3 changed files with 20 additions and 14 deletions

View File

@ -93,7 +93,7 @@ static void ApplyStats(CCoinsStats& stats, const uint256& hash, const std::map<u
//! Calculate statistics about the unspent transaction output set //! Calculate statistics about the unspent transaction output set
template <typename T> template <typename T>
static bool GetUTXOStats(CCoinsView* view, BlockManager& blockman, CCoinsStats& stats, T hash_obj, const std::function<void()>& interruption_point, const CBlockIndex* pindex, CoinStatsHashType& hash_type) static bool GetUTXOStats(CCoinsView* view, BlockManager& blockman, CCoinsStats& stats, T hash_obj, const std::function<void()>& interruption_point, const CBlockIndex* pindex, CoinStatsHashType& hash_type, bool index_requested)
{ {
std::unique_ptr<CCoinsViewCursor> pcursor(view->Cursor()); std::unique_ptr<CCoinsViewCursor> pcursor(view->Cursor());
assert(pcursor); assert(pcursor);
@ -106,7 +106,7 @@ static bool GetUTXOStats(CCoinsView* view, BlockManager& blockman, CCoinsStats&
stats.hashBlock = pindex->GetBlockHash(); stats.hashBlock = pindex->GetBlockHash();
// Use CoinStatsIndex if it is requested and available and a hash_type of Muhash or None was requested // Use CoinStatsIndex if it is requested and available and a hash_type of Muhash or None was requested
if ((hash_type == CoinStatsHashType::MUHASH || hash_type == CoinStatsHashType::NONE) && g_coin_stats_index && stats.index_requested) { if ((hash_type == CoinStatsHashType::MUHASH || hash_type == CoinStatsHashType::NONE) && g_coin_stats_index && index_requested) {
stats.index_used = true; stats.index_used = true;
return g_coin_stats_index->LookUpStats(pindex, stats); return g_coin_stats_index->LookUpStats(pindex, stats);
} }
@ -144,19 +144,19 @@ static bool GetUTXOStats(CCoinsView* view, BlockManager& blockman, CCoinsStats&
return true; return true;
} }
bool GetUTXOStats(CCoinsView* view, BlockManager& blockman, CCoinsStats& stats, CoinStatsHashType hash_type, const std::function<void()>& interruption_point, const CBlockIndex* pindex) bool GetUTXOStats(CCoinsView* view, BlockManager& blockman, CCoinsStats& stats, CoinStatsHashType hash_type, const std::function<void()>& interruption_point, const CBlockIndex* pindex, bool index_requested)
{ {
switch (hash_type) { switch (hash_type) {
case(CoinStatsHashType::HASH_SERIALIZED): { case(CoinStatsHashType::HASH_SERIALIZED): {
CHashWriter ss(SER_GETHASH, PROTOCOL_VERSION); CHashWriter ss(SER_GETHASH, PROTOCOL_VERSION);
return GetUTXOStats(view, blockman, stats, ss, interruption_point, pindex, hash_type); return GetUTXOStats(view, blockman, stats, ss, interruption_point, pindex, hash_type, index_requested);
} }
case(CoinStatsHashType::MUHASH): { case(CoinStatsHashType::MUHASH): {
MuHash3072 muhash; MuHash3072 muhash;
return GetUTXOStats(view, blockman, stats, muhash, interruption_point, pindex, hash_type); return GetUTXOStats(view, blockman, stats, muhash, interruption_point, pindex, hash_type, index_requested);
} }
case(CoinStatsHashType::NONE): { case(CoinStatsHashType::NONE): {
return GetUTXOStats(view, blockman, stats, nullptr, interruption_point, pindex, hash_type); return GetUTXOStats(view, blockman, stats, nullptr, interruption_point, pindex, hash_type, index_requested);
} }
} // no default case, so the compiler can warn about missing cases } // no default case, so the compiler can warn about missing cases
assert(false); assert(false);

View File

@ -41,8 +41,6 @@ struct CCoinsStats {
//! The number of coins contained. //! The number of coins contained.
uint64_t coins_count{0}; uint64_t coins_count{0};
//! Signals if the coinstatsindex should be used (when available).
bool index_requested{true};
//! Signals if the coinstatsindex was used to retrieve the statistics. //! Signals if the coinstatsindex was used to retrieve the statistics.
bool index_used{false}; bool index_used{false};
@ -68,8 +66,16 @@ struct CCoinsStats {
CAmount total_unspendables_unclaimed_rewards{0}; CAmount total_unspendables_unclaimed_rewards{0};
}; };
//! Calculate statistics about the unspent transaction output set /**
bool GetUTXOStats(CCoinsView* view, node::BlockManager& blockman, CCoinsStats& stats, CoinStatsHashType hash_type, const std::function<void()>& interruption_point = {}, const CBlockIndex* pindex = nullptr); * Calculate statistics about the unspent transaction output set
*
* @param[in] index_requested Signals if the coinstatsindex should be used (when available).
*/
bool GetUTXOStats(CCoinsView* view, node::BlockManager& blockman,
CCoinsStats& stats, CoinStatsHashType hash_type,
const std::function<void()>& interruption_point = {},
const CBlockIndex* pindex = nullptr,
bool index_requested = true);
uint64_t GetBogoSize(const CScript& script_pub_key); uint64_t GetBogoSize(const CScript& script_pub_key);

View File

@ -863,7 +863,7 @@ static RPCHelpMan gettxoutsetinfo()
const CBlockIndex* pindex{nullptr}; const CBlockIndex* pindex{nullptr};
const CoinStatsHashType hash_type{request.params[0].isNull() ? CoinStatsHashType::HASH_SERIALIZED : ParseHashType(request.params[0].get_str())}; const CoinStatsHashType hash_type{request.params[0].isNull() ? CoinStatsHashType::HASH_SERIALIZED : ParseHashType(request.params[0].get_str())};
CCoinsStats stats{}; CCoinsStats stats{};
stats.index_requested = request.params[2].isNull() || request.params[2].get_bool(); bool index_requested = request.params[2].isNull() || request.params[2].get_bool();
NodeContext& node = EnsureAnyNodeContext(request.context); NodeContext& node = EnsureAnyNodeContext(request.context);
ChainstateManager& chainman = EnsureChainman(node); ChainstateManager& chainman = EnsureChainman(node);
@ -891,7 +891,7 @@ static RPCHelpMan gettxoutsetinfo()
pindex = ParseHashOrHeight(request.params[1], chainman); pindex = ParseHashOrHeight(request.params[1], chainman);
} }
if (stats.index_requested && g_coin_stats_index) { if (index_requested && g_coin_stats_index) {
if (!g_coin_stats_index->BlockUntilSyncedToCurrentChain()) { if (!g_coin_stats_index->BlockUntilSyncedToCurrentChain()) {
const IndexSummary summary{g_coin_stats_index->GetSummary()}; const IndexSummary summary{g_coin_stats_index->GetSummary()};
@ -903,7 +903,7 @@ static RPCHelpMan gettxoutsetinfo()
} }
} }
if (GetUTXOStats(coins_view, *blockman, stats, hash_type, node.rpc_interruption_point, pindex)) { if (GetUTXOStats(coins_view, *blockman, stats, hash_type, node.rpc_interruption_point, pindex, index_requested)) {
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("txouts", (int64_t)stats.nTransactionOutputs); ret.pushKV("txouts", (int64_t)stats.nTransactionOutputs);
@ -925,7 +925,7 @@ static RPCHelpMan gettxoutsetinfo()
CCoinsStats prev_stats{}; CCoinsStats prev_stats{};
if (pindex->nHeight > 0) { if (pindex->nHeight > 0) {
GetUTXOStats(coins_view, *blockman, prev_stats, hash_type, node.rpc_interruption_point, pindex->pprev); GetUTXOStats(coins_view, *blockman, prev_stats, hash_type, node.rpc_interruption_point, pindex->pprev, index_requested);
} }
UniValue block_info(UniValue::VOBJ); UniValue block_info(UniValue::VOBJ);