diff options
author | Russell Yanofsky <russ@yanofsky.org> | 2017-06-07 13:00:11 -0400 |
---|---|---|
committer | Russell Yanofsky <russ@yanofsky.org> | 2017-06-07 13:00:11 -0400 |
commit | 24e44c354d5b9174cb9cb7d157a985e197aa7886 (patch) | |
tree | d48625d1dd888a11f8f73050daabc6a156802eff | |
parent | bea5b00cfe95cd37832305c0f93c339a22a7d79d (diff) | |
download | bitcoin-24e44c354d5b9174cb9cb7d157a985e197aa7886.tar.xz |
Don't return stale data from CCoinsViewCache::Cursor()
CCoinsViewCache doesn't actually support cursor iteration returning the
current contents of the cache, so raise an error when the cursor method is
called instead of returning a cursor that iterates over stale data.
Also update the gettxoutsetinfo RPC which was relying on the old behavior to be
explicit about which view it is returning data about.
-rw-r--r-- | src/coins.h | 3 | ||||
-rw-r--r-- | src/init.cpp | 1 | ||||
-rw-r--r-- | src/rpc/blockchain.cpp | 3 | ||||
-rw-r--r-- | src/validation.cpp | 1 | ||||
-rw-r--r-- | src/validation.h | 4 |
5 files changed, 10 insertions, 2 deletions
diff --git a/src/coins.h b/src/coins.h index 476db8f37c..b10c7ea9a0 100644 --- a/src/coins.h +++ b/src/coins.h @@ -212,6 +212,9 @@ public: uint256 GetBestBlock() const; void SetBestBlock(const uint256 &hashBlock); bool BatchWrite(CCoinsMap &mapCoins, const uint256 &hashBlock); + CCoinsViewCursor* Cursor() const { + throw std::logic_error("CCoinsViewCache cursor iteration not supported."); + } /** * Check if we have the given utxo already loaded in this cache. diff --git a/src/init.cpp b/src/init.cpp index 33023a1800..8d161004b0 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -162,7 +162,6 @@ public: // Writes do not need similar protection, as failure to write is handled by the caller. }; -static CCoinsViewDB *pcoinsdbview = NULL; static CCoinsViewErrorCatcher *pcoinscatcher = NULL; static std::unique_ptr<ECCVerifyHandle> globalVerifyHandle; diff --git a/src/rpc/blockchain.cpp b/src/rpc/blockchain.cpp index 96871ce1dc..c9adfefa7f 100644 --- a/src/rpc/blockchain.cpp +++ b/src/rpc/blockchain.cpp @@ -19,6 +19,7 @@ #include "rpc/server.h" #include "streams.h" #include "sync.h" +#include "txdb.h" #include "txmempool.h" #include "util.h" #include "utilstrencodings.h" @@ -917,7 +918,7 @@ UniValue gettxoutsetinfo(const JSONRPCRequest& request) CCoinsStats stats; FlushStateToDisk(); - if (GetUTXOStats(pcoinsTip, stats)) { + if (GetUTXOStats(pcoinsdbview, stats)) { ret.push_back(Pair("height", (int64_t)stats.nHeight)); ret.push_back(Pair("bestblock", stats.hashBlock.GetHex())); ret.push_back(Pair("transactions", (int64_t)stats.nTransactions)); diff --git a/src/validation.cpp b/src/validation.cpp index de65839eef..b83c677cf4 100644 --- a/src/validation.cpp +++ b/src/validation.cpp @@ -175,6 +175,7 @@ CBlockIndex* FindForkInGlobalIndex(const CChain& chain, const CBlockLocator& loc return chain.Genesis(); } +CCoinsViewDB *pcoinsdbview = NULL; CCoinsViewCache *pcoinsTip = NULL; CBlockTreeDB *pblocktree = NULL; diff --git a/src/validation.h b/src/validation.h index 096fd0a9ee..219faf0b67 100644 --- a/src/validation.h +++ b/src/validation.h @@ -36,6 +36,7 @@ class CBlockIndex; class CBlockTreeDB; class CBloomFilter; class CChainParams; +class CCoinsViewDB; class CInv; class CConnman; class CScriptCheck; @@ -482,6 +483,9 @@ bool ResetBlockFailureFlags(CBlockIndex *pindex); /** The currently-connected chain of blocks (protected by cs_main). */ extern CChain chainActive; +/** Global variable that points to the coins database (protected by cs_main) */ +extern CCoinsViewDB *pcoinsdbview; + /** Global variable that points to the active CCoinsView (protected by cs_main) */ extern CCoinsViewCache *pcoinsTip; |