aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRussell Yanofsky <[email protected]>2017-06-07 13:00:11 -0400
committerRussell Yanofsky <[email protected]>2017-06-07 13:00:11 -0400
commit24e44c354d5b9174cb9cb7d157a985e197aa7886 (patch)
treed48625d1dd888a11f8f73050daabc6a156802eff /src
parentMerge #10509: Remove xvfb configuration from travis (diff)
downloaddiscoin-24e44c354d5b9174cb9cb7d157a985e197aa7886.tar.xz
discoin-24e44c354d5b9174cb9cb7d157a985e197aa7886.zip
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.
Diffstat (limited to 'src')
-rw-r--r--src/coins.h3
-rw-r--r--src/init.cpp1
-rw-r--r--src/rpc/blockchain.cpp3
-rw-r--r--src/validation.cpp1
-rw-r--r--src/validation.h4
5 files changed, 10 insertions, 2 deletions
diff --git a/src/coins.h b/src/coins.h
index 476db8f37..b10c7ea9a 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 33023a180..8d161004b 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 96871ce1d..c9adfefa7 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 de65839ee..b83c677cf 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 096fd0a9e..219faf0b6 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;