Page MenuHomePhabricator

D11596.id.diff
No OneTemporary

D11596.id.diff

diff --git a/src/node/coinstats.h b/src/node/coinstats.h
--- a/src/node/coinstats.h
+++ b/src/node/coinstats.h
@@ -23,6 +23,7 @@
};
struct CCoinsStats {
+ CoinStatsHashType m_hash_type;
int nHeight{0};
BlockHash hashBlock{};
uint64_t nTransactions{0};
@@ -34,11 +35,12 @@
//! The number of coins contained.
uint64_t coins_count{0};
+
+ CCoinsStats(CoinStatsHashType hash_type) : m_hash_type(hash_type) {}
};
//! Calculate statistics about the unspent transaction output set
bool GetUTXOStats(CCoinsView *view, BlockManager &blockman, CCoinsStats &stats,
- const CoinStatsHashType hash_type,
const std::function<void()> &interruption_point = {});
#endif // BITCOIN_NODE_COINSTATS_H
diff --git a/src/node/coinstats.cpp b/src/node/coinstats.cpp
--- a/src/node/coinstats.cpp
+++ b/src/node/coinstats.cpp
@@ -88,7 +88,6 @@
static bool GetUTXOStats(CCoinsView *view, BlockManager &blockman,
CCoinsStats &stats, T hash_obj,
const std::function<void()> &interruption_point) {
- stats = CCoinsStats();
std::unique_ptr<CCoinsViewCursor> pcursor(view->Cursor());
assert(pcursor);
@@ -134,9 +133,8 @@
}
bool GetUTXOStats(CCoinsView *view, BlockManager &blockman, CCoinsStats &stats,
- CoinStatsHashType hash_type,
const std::function<void()> &interruption_point) {
- switch (hash_type) {
+ switch (stats.m_hash_type) {
case (CoinStatsHashType::HASH_SERIALIZED): {
CHashWriter ss(SER_GETHASH, PROTOCOL_VERSION);
return GetUTXOStats(view, blockman, stats, ss, interruption_point);
diff --git a/src/rpc/blockchain.cpp b/src/rpc/blockchain.cpp
--- a/src/rpc/blockchain.cpp
+++ b/src/rpc/blockchain.cpp
@@ -1285,16 +1285,16 @@
const JSONRPCRequest &request) -> UniValue {
UniValue ret(UniValue::VOBJ);
- CCoinsStats stats;
- NodeContext &node = EnsureAnyNodeContext(request.context);
- ChainstateManager &chainman = EnsureChainman(node);
- CChainState &active_chainstate = chainman.ActiveChainstate();
- active_chainstate.ForceFlushStateToDisk();
-
const CoinStatsHashType hash_type{
request.params[0].isNull()
? CoinStatsHashType::HASH_SERIALIZED
: ParseHashType(request.params[0].get_str())};
+ CCoinsStats stats{hash_type};
+
+ NodeContext &node = EnsureAnyNodeContext(request.context);
+ ChainstateManager &chainman = EnsureChainman(node);
+ CChainState &active_chainstate = chainman.ActiveChainstate();
+ active_chainstate.ForceFlushStateToDisk();
CCoinsView *coins_view;
BlockManager *blockman;
@@ -1303,7 +1303,8 @@
coins_view = &active_chainstate.CoinsDB();
blockman = &active_chainstate.m_blockman;
}
- if (GetUTXOStats(coins_view, *blockman, stats, hash_type,
+
+ if (GetUTXOStats(coins_view, *blockman, stats,
node.rpc_interruption_point)) {
ret.pushKV("height", int64_t(stats.nHeight));
ret.pushKV("bestblock", stats.hashBlock.GetHex());
@@ -3078,7 +3079,7 @@
UniValue CreateUTXOSnapshot(NodeContext &node, CChainState &chainstate,
CAutoFile &afile) {
std::unique_ptr<CCoinsViewCursor> pcursor;
- CCoinsStats stats;
+ CCoinsStats stats{CoinStatsHashType::NONE};
CBlockIndex *tip;
{
@@ -3100,7 +3101,6 @@
chainstate.ForceFlushStateToDisk();
if (!GetUTXOStats(&chainstate.CoinsDB(), chainstate.m_blockman, stats,
- CoinStatsHashType::NONE,
node.rpc_interruption_point)) {
throw JSONRPCError(RPC_INTERNAL_ERROR, "Unable to read UTXO set");
}
diff --git a/src/test/fuzz/coins_view.cpp b/src/test/fuzz/coins_view.cpp
--- a/src/test/fuzz/coins_view.cpp
+++ b/src/test/fuzz/coins_view.cpp
@@ -299,14 +299,14 @@
break;
}
case 3: {
- CCoinsStats stats;
+ CCoinsStats stats{CoinStatsHashType::HASH_SERIALIZED};
bool expected_code_path = false;
try {
(void)GetUTXOStats(
&coins_view_cache,
WITH_LOCK(::cs_main,
return std::ref(g_chainman.m_blockman)),
- stats, CoinStatsHashType::HASH_SERIALIZED);
+ stats);
} catch (const std::logic_error &) {
expected_code_path = true;
}
diff --git a/src/validation.cpp b/src/validation.cpp
--- a/src/validation.cpp
+++ b/src/validation.cpp
@@ -6287,7 +6287,7 @@
assert(coins_cache.GetBestBlock() == base_blockhash);
- CCoinsStats stats;
+ CCoinsStats stats{CoinStatsHashType::HASH_SERIALIZED};
auto breakpoint_fnc = [] { /* TODO insert breakpoint here? */ };
// As above, okay to immediately release cs_main here since no other context
@@ -6297,7 +6297,7 @@
if (!GetUTXOStats(snapshot_coinsdb,
WITH_LOCK(::cs_main, return std::ref(m_blockman)), stats,
- CoinStatsHashType::HASH_SERIALIZED, breakpoint_fnc)) {
+ breakpoint_fnc)) {
LogPrintf("[snapshot] failed to generate coins stats\n");
return false;
}

File Metadata

Mime Type
text/plain
Expires
Tue, May 20, 20:36 (9 h, 26 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
5863362
Default Alt Text
D11596.id.diff (5 KB)

Event Timeline