Skip to content
Permalink
Browse files

rpc: Fix leveldb iterator leak, and flush before `gettxoutsetinfo`

This fixes an iterator leak resulting in

    bitcoind: db/version_set.cc:789: leveldb::VersionSet::~VersionSet(): Assertion `dummy_versions_.next_ == &dummy_versions_' failed."

exception on shutdown.

Also make sure to flush pcoinsTip before calling GetStats() to make
sure we apply them to the current height.
  • Loading branch information...
laanwj committed Oct 21, 2014
1 parent 9acbb41 commit 33dfbf57d34882aef7b83bc5ea9bf561e1f3e7b0
Showing with 2 additions and 1 deletion.
  1. +1 −0 src/rpcblockchain.cpp
  2. +1 −1 src/txdb.cpp
@@ -319,6 +319,7 @@ Value gettxoutsetinfo(const Array& params, bool fHelp)
Object ret;

CCoinsStats stats;
pcoinsTip->Flush();
if (pcoinsTip->GetStats(stats)) {
ret.push_back(Pair("height", (int64_t)stats.nHeight));
ret.push_back(Pair("bestblock", stats.hashBlock.GetHex()));
@@ -104,7 +104,7 @@ bool CCoinsViewDB::GetStats(CCoinsStats &stats) const {
/* It seems that there are no "const iterators" for LevelDB. Since we
only need read operations on it, use a const-cast to get around
that restriction. */
leveldb::Iterator *pcursor = const_cast<CLevelDBWrapper*>(&db)->NewIterator();
boost::scoped_ptr<leveldb::Iterator> pcursor(const_cast<CLevelDBWrapper*>(&db)->NewIterator());
pcursor->SeekToFirst();

CHashWriter ss(SER_GETHASH, PROTOCOL_VERSION);

0 comments on commit 33dfbf5

Please sign in to comment.
You can’t perform that action at this time.