diff options
-rw-r--r-- | src/Makefile.am | 4 | ||||
-rw-r--r-- | src/blockencodings.cpp | 1 | ||||
-rw-r--r-- | src/dbwrapper.cpp | 233 | ||||
-rw-r--r-- | src/dbwrapper.h | 161 | ||||
-rw-r--r-- | src/index/blockfilterindex.cpp | 1 | ||||
-rw-r--r-- | src/init.cpp | 1 | ||||
-rw-r--r-- | src/net_processing.cpp | 1 | ||||
-rw-r--r-- | src/node/interfaces.cpp | 1 | ||||
-rw-r--r-- | src/node/miner.cpp | 1 | ||||
-rw-r--r-- | src/qt/bitcoin.cpp | 3 | ||||
-rw-r--r-- | src/qt/test/apptests.cpp | 1 | ||||
-rw-r--r-- | src/qt/transactiondesc.cpp | 1 | ||||
-rw-r--r-- | src/rpc/node.cpp | 1 | ||||
-rw-r--r-- | src/test/util/setup_common.cpp | 1 | ||||
-rw-r--r-- | src/validation.cpp | 2 |
15 files changed, 254 insertions, 159 deletions
diff --git a/src/Makefile.am b/src/Makefile.am index b48d723bc9..a108e60c86 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -24,7 +24,7 @@ check_PROGRAMS = TESTS = BENCHMARKS = -BITCOIN_INCLUDES=-I$(builddir) -I$(srcdir)/$(MINISKETCH_INCLUDE_DIR_INT) -I$(srcdir)/secp256k1/include -I$(srcdir)/$(UNIVALUE_INCLUDE_DIR_INT) $(LEVELDB_CPPFLAGS) +BITCOIN_INCLUDES=-I$(builddir) -I$(srcdir)/$(MINISKETCH_INCLUDE_DIR_INT) -I$(srcdir)/secp256k1/include -I$(srcdir)/$(UNIVALUE_INCLUDE_DIR_INT) LIBBITCOIN_NODE=libbitcoin_node.a LIBBITCOIN_COMMON=libbitcoin_common.a @@ -370,7 +370,7 @@ obj/build.h: FORCE libbitcoin_util_a-clientversion.$(OBJEXT): obj/build.h # node # -libbitcoin_node_a_CPPFLAGS = $(AM_CPPFLAGS) $(BITCOIN_INCLUDES) $(BOOST_CPPFLAGS) $(MINIUPNPC_CPPFLAGS) $(NATPMP_CPPFLAGS) $(EVENT_CFLAGS) $(EVENT_PTHREADS_CFLAGS) +libbitcoin_node_a_CPPFLAGS = $(AM_CPPFLAGS) $(BITCOIN_INCLUDES) $(LEVELDB_CPPFLAGS) $(BOOST_CPPFLAGS) $(MINIUPNPC_CPPFLAGS) $(NATPMP_CPPFLAGS) $(EVENT_CFLAGS) $(EVENT_PTHREADS_CFLAGS) libbitcoin_node_a_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS) libbitcoin_node_a_SOURCES = \ addrdb.cpp \ diff --git a/src/blockencodings.cpp b/src/blockencodings.cpp index 9aa0a6ba20..211b4740be 100644 --- a/src/blockencodings.cpp +++ b/src/blockencodings.cpp @@ -9,6 +9,7 @@ #include <consensus/validation.h> #include <crypto/sha256.h> #include <crypto/siphash.h> +#include <logging.h> #include <random.h> #include <streams.h> #include <txmempool.h> diff --git a/src/dbwrapper.cpp b/src/dbwrapper.cpp index 7cf6bef90f..c95937ba75 100644 --- a/src/dbwrapper.cpp +++ b/src/dbwrapper.cpp @@ -4,9 +4,12 @@ #include <dbwrapper.h> +#include <clientversion.h> #include <logging.h> #include <random.h> -#include <tinyformat.h> +#include <serialize.h> +#include <span.h> +#include <streams.h> #include <util/fs.h> #include <util/fs_helpers.h> #include <util/strencodings.h> @@ -23,9 +26,31 @@ #include <leveldb/helpers/memenv/memenv.h> #include <leveldb/iterator.h> #include <leveldb/options.h> +#include <leveldb/slice.h> #include <leveldb/status.h> +#include <leveldb/write_batch.h> #include <memory> #include <optional> +#include <utility> + +static auto CharCast(const std::byte* data) { return reinterpret_cast<const char*>(data); } + +bool DestroyDB(const std::string& path_str) +{ + return leveldb::DestroyDB(path_str, {}).ok(); +} + +/** Handle database error by throwing dbwrapper_error exception. + */ +static void HandleError(const leveldb::Status& status) +{ + if (status.ok()) + return; + const std::string errmsg = "Fatal LevelDB error: " + status.ToString(); + LogPrintf("%s\n", errmsg); + LogPrintf("You can use -debug=leveldb to get more complete diagnostic messages\n"); + throw dbwrapper_error(errmsg); +} class CBitcoinLevelDBLogger : public leveldb::Logger { public: @@ -127,24 +152,91 @@ static leveldb::Options GetOptions(size_t nCacheSize) return options; } +struct CDBBatch::WriteBatchImpl { + leveldb::WriteBatch batch; +}; + +CDBBatch::CDBBatch(const CDBWrapper& _parent) : parent(_parent), + m_impl_batch{std::make_unique<CDBBatch::WriteBatchImpl>()}, + ssValue(SER_DISK, CLIENT_VERSION){}; + +CDBBatch::~CDBBatch() = default; + +void CDBBatch::Clear() +{ + m_impl_batch->batch.Clear(); + size_estimate = 0; +} + +void CDBBatch::WriteImpl(Span<const std::byte> key, CDataStream& ssValue) +{ + leveldb::Slice slKey(CharCast(key.data()), key.size()); + ssValue.Xor(dbwrapper_private::GetObfuscateKey(parent)); + leveldb::Slice slValue(CharCast(ssValue.data()), ssValue.size()); + m_impl_batch->batch.Put(slKey, slValue); + // LevelDB serializes writes as: + // - byte: header + // - varint: key length (1 byte up to 127B, 2 bytes up to 16383B, ...) + // - byte[]: key + // - varint: value length + // - byte[]: value + // The formula below assumes the key and value are both less than 16k. + size_estimate += 3 + (slKey.size() > 127) + slKey.size() + (slValue.size() > 127) + slValue.size(); +} + +void CDBBatch::EraseImpl(Span<const std::byte> key) +{ + leveldb::Slice slKey(CharCast(key.data()), key.size()); + m_impl_batch->batch.Delete(slKey); + // LevelDB serializes erases as: + // - byte: header + // - varint: key length + // - byte[]: key + // The formula below assumes the key is less than 16kB. + size_estimate += 2 + (slKey.size() > 127) + slKey.size(); +} + +struct LevelDBContext { + //! custom environment this database is using (may be nullptr in case of default environment) + leveldb::Env* penv; + + //! database options used + leveldb::Options options; + + //! options used when reading from the database + leveldb::ReadOptions readoptions; + + //! options used when iterating over values of the database + leveldb::ReadOptions iteroptions; + + //! options used when writing to the database + leveldb::WriteOptions writeoptions; + + //! options used when sync writing to the database + leveldb::WriteOptions syncoptions; + + //! the database itself + leveldb::DB* pdb; +}; + CDBWrapper::CDBWrapper(const DBParams& params) - : m_name{fs::PathToString(params.path.stem())}, m_path{params.path}, m_is_memory{params.memory_only} + : m_db_context{std::make_unique<LevelDBContext>()}, m_name{fs::PathToString(params.path.stem())}, m_path{params.path}, m_is_memory{params.memory_only} { - penv = nullptr; - readoptions.verify_checksums = true; - iteroptions.verify_checksums = true; - iteroptions.fill_cache = false; - syncoptions.sync = true; - options = GetOptions(params.cache_bytes); - options.create_if_missing = true; + DBContext().penv = nullptr; + DBContext().readoptions.verify_checksums = true; + DBContext().iteroptions.verify_checksums = true; + DBContext().iteroptions.fill_cache = false; + DBContext().syncoptions.sync = true; + DBContext().options = GetOptions(params.cache_bytes); + DBContext().options.create_if_missing = true; if (params.memory_only) { - penv = leveldb::NewMemEnv(leveldb::Env::Default()); - options.env = penv; + DBContext().penv = leveldb::NewMemEnv(leveldb::Env::Default()); + DBContext().options.env = DBContext().penv; } else { if (params.wipe_data) { LogPrintf("Wiping LevelDB in %s\n", fs::PathToString(params.path)); - leveldb::Status result = leveldb::DestroyDB(fs::PathToString(params.path), options); - dbwrapper_private::HandleError(result); + leveldb::Status result = leveldb::DestroyDB(fs::PathToString(params.path), DBContext().options); + HandleError(result); } TryCreateDirectories(params.path); LogPrintf("Opening LevelDB in %s\n", fs::PathToString(params.path)); @@ -153,13 +245,13 @@ CDBWrapper::CDBWrapper(const DBParams& params) // because on POSIX leveldb passes the byte string directly to ::open(), and // on Windows it converts from UTF-8 to UTF-16 before calling ::CreateFileW // (see env_posix.cc and env_windows.cc). - leveldb::Status status = leveldb::DB::Open(options, fs::PathToString(params.path), &pdb); - dbwrapper_private::HandleError(status); + leveldb::Status status = leveldb::DB::Open(DBContext().options, fs::PathToString(params.path), &DBContext().pdb); + HandleError(status); LogPrintf("Opened LevelDB successfully\n"); if (params.options.force_compact) { LogPrintf("Starting database compaction of %s\n", fs::PathToString(params.path)); - pdb->CompactRange(nullptr, nullptr); + DBContext().pdb->CompactRange(nullptr, nullptr); LogPrintf("Finished database compaction of %s\n", fs::PathToString(params.path)); } @@ -185,16 +277,16 @@ CDBWrapper::CDBWrapper(const DBParams& params) CDBWrapper::~CDBWrapper() { - delete pdb; - pdb = nullptr; - delete options.filter_policy; - options.filter_policy = nullptr; - delete options.info_log; - options.info_log = nullptr; - delete options.block_cache; - options.block_cache = nullptr; - delete penv; - options.env = nullptr; + delete DBContext().pdb; + DBContext().pdb = nullptr; + delete DBContext().options.filter_policy; + DBContext().options.filter_policy = nullptr; + delete DBContext().options.info_log; + DBContext().options.info_log = nullptr; + delete DBContext().options.block_cache; + DBContext().options.block_cache = nullptr; + delete DBContext().penv; + DBContext().options.env = nullptr; } bool CDBWrapper::WriteBatch(CDBBatch& batch, bool fSync) @@ -204,8 +296,8 @@ bool CDBWrapper::WriteBatch(CDBBatch& batch, bool fSync) if (log_memory) { mem_before = DynamicMemoryUsage() / 1024.0 / 1024; } - leveldb::Status status = pdb->Write(fSync ? syncoptions : writeoptions, &batch.batch); - dbwrapper_private::HandleError(status); + leveldb::Status status = DBContext().pdb->Write(fSync ? DBContext().syncoptions : DBContext().writeoptions, &batch.m_impl_batch->batch); + HandleError(status); if (log_memory) { double mem_after = DynamicMemoryUsage() / 1024.0 / 1024; LogPrint(BCLog::LEVELDB, "WriteBatch memory usage: db=%s, before=%.1fMiB, after=%.1fMiB\n", @@ -218,7 +310,7 @@ size_t CDBWrapper::DynamicMemoryUsage() const { std::string memory; std::optional<size_t> parsed; - if (!pdb->GetProperty("leveldb.approximate-memory-usage", &memory) || !(parsed = ToIntegral<size_t>(memory))) { + if (!DBContext().pdb->GetProperty("leveldb.approximate-memory-usage", &memory) || !(parsed = ToIntegral<size_t>(memory))) { LogPrint(BCLog::LEVELDB, "Failed to get approximate-memory-usage property\n"); return 0; } @@ -244,6 +336,45 @@ std::vector<unsigned char> CDBWrapper::CreateObfuscateKey() const return ret; } +std::optional<std::string> CDBWrapper::ReadImpl(Span<const std::byte> key) const +{ + leveldb::Slice slKey(CharCast(key.data()), key.size()); + std::string strValue; + leveldb::Status status = DBContext().pdb->Get(DBContext().readoptions, slKey, &strValue); + if (!status.ok()) { + if (status.IsNotFound()) + return std::nullopt; + LogPrintf("LevelDB read failure: %s\n", status.ToString()); + HandleError(status); + } + return strValue; +} + +bool CDBWrapper::ExistsImpl(Span<const std::byte> key) const +{ + leveldb::Slice slKey(CharCast(key.data()), key.size()); + + std::string strValue; + leveldb::Status status = DBContext().pdb->Get(DBContext().readoptions, slKey, &strValue); + if (!status.ok()) { + if (status.IsNotFound()) + return false; + LogPrintf("LevelDB read failure: %s\n", status.ToString()); + HandleError(status); + } + return true; +} + +size_t CDBWrapper::EstimateSizeImpl(Span<const std::byte> key1, Span<const std::byte> key2) const +{ + leveldb::Slice slKey1(CharCast(key1.data()), key1.size()); + leveldb::Slice slKey2(CharCast(key2.data()), key2.size()); + uint64_t size = 0; + leveldb::Range range(slKey1, slKey2); + DBContext().pdb->GetApproximateSizes(&range, 1, &size); + return size; +} + bool CDBWrapper::IsEmpty() { std::unique_ptr<CDBIterator> it(NewIterator()); @@ -251,23 +382,43 @@ bool CDBWrapper::IsEmpty() return !(it->Valid()); } -CDBIterator::~CDBIterator() { delete piter; } -bool CDBIterator::Valid() const { return piter->Valid(); } -void CDBIterator::SeekToFirst() { piter->SeekToFirst(); } -void CDBIterator::Next() { piter->Next(); } +struct CDBIterator::IteratorImpl { + const std::unique_ptr<leveldb::Iterator> iter; -namespace dbwrapper_private { + explicit IteratorImpl(leveldb::Iterator* _iter) : iter{_iter} {} +}; -void HandleError(const leveldb::Status& status) +CDBIterator::CDBIterator(const CDBWrapper& _parent, std::unique_ptr<IteratorImpl> _piter) : parent(_parent), + m_impl_iter(std::move(_piter)) {} + +CDBIterator* CDBWrapper::NewIterator() { - if (status.ok()) - return; - const std::string errmsg = "Fatal LevelDB error: " + status.ToString(); - LogPrintf("%s\n", errmsg); - LogPrintf("You can use -debug=leveldb to get more complete diagnostic messages\n"); - throw dbwrapper_error(errmsg); + return new CDBIterator{*this, std::make_unique<CDBIterator::IteratorImpl>(DBContext().pdb->NewIterator(DBContext().iteroptions))}; } +void CDBIterator::SeekImpl(Span<const std::byte> key) +{ + leveldb::Slice slKey(CharCast(key.data()), key.size()); + m_impl_iter->iter->Seek(slKey); +} + +Span<const std::byte> CDBIterator::GetKeyImpl() const +{ + return MakeByteSpan(m_impl_iter->iter->key()); +} + +Span<const std::byte> CDBIterator::GetValueImpl() const +{ + return MakeByteSpan(m_impl_iter->iter->value()); +} + +CDBIterator::~CDBIterator() = default; +bool CDBIterator::Valid() const { return m_impl_iter->iter->Valid(); } +void CDBIterator::SeekToFirst() { m_impl_iter->iter->SeekToFirst(); } +void CDBIterator::Next() { m_impl_iter->iter->Next(); } + +namespace dbwrapper_private { + const std::vector<unsigned char>& GetObfuscateKey(const CDBWrapper &w) { return w.obfuscate_key; diff --git a/src/dbwrapper.h b/src/dbwrapper.h index 4ae2106211..eac9594aa1 100644 --- a/src/dbwrapper.h +++ b/src/dbwrapper.h @@ -5,28 +5,21 @@ #ifndef BITCOIN_DBWRAPPER_H #define BITCOIN_DBWRAPPER_H +#include <attributes.h> #include <clientversion.h> -#include <logging.h> #include <serialize.h> #include <span.h> #include <streams.h> +#include <util/check.h> #include <util/fs.h> #include <cstddef> -#include <cstdint> #include <exception> -#include <leveldb/db.h> -#include <leveldb/iterator.h> -#include <leveldb/options.h> -#include <leveldb/slice.h> -#include <leveldb/status.h> -#include <leveldb/write_batch.h> +#include <memory> +#include <optional> #include <stdexcept> #include <string> #include <vector> -namespace leveldb { -class Env; -} static const size_t DBWRAPPER_PREALLOC_KEY_SIZE = 64; static const size_t DBWRAPPER_PREALLOC_VALUE_SIZE = 1024; @@ -54,8 +47,6 @@ struct DBParams { DBOptions options{}; }; -inline auto CharCast(const std::byte* data) { return reinterpret_cast<const char*>(data); } - class dbwrapper_error : public std::runtime_error { public: @@ -64,25 +55,19 @@ public: class CDBWrapper; -namespace dbwrapper { - using leveldb::DestroyDB; -} - /** These should be considered an implementation detail of the specific database. */ namespace dbwrapper_private { -/** Handle database error by throwing dbwrapper_error exception. - */ -void HandleError(const leveldb::Status& status); - /** Work around circular dependency, as well as for testing in dbwrapper_tests. * Database obfuscation should be considered an implementation detail of the * specific database. */ const std::vector<unsigned char>& GetObfuscateKey(const CDBWrapper &w); -}; +}; // namespace dbwrapper_private + +bool DestroyDB(const std::string& path_str); /** Batch of changes queued to be written to a CDBWrapper */ class CDBBatch @@ -91,46 +76,34 @@ class CDBBatch private: const CDBWrapper &parent; - leveldb::WriteBatch batch; + + struct WriteBatchImpl; + const std::unique_ptr<WriteBatchImpl> m_impl_batch; DataStream ssKey{}; CDataStream ssValue; size_t size_estimate{0}; + void WriteImpl(Span<const std::byte> key, CDataStream& ssValue); + void EraseImpl(Span<const std::byte> key); + public: /** * @param[in] _parent CDBWrapper that this batch is to be submitted to */ - explicit CDBBatch(const CDBWrapper& _parent) : parent(_parent), ssValue(SER_DISK, CLIENT_VERSION){}; - - void Clear() - { - batch.Clear(); - size_estimate = 0; - } + explicit CDBBatch(const CDBWrapper& _parent); + ~CDBBatch(); + void Clear(); template <typename K, typename V> void Write(const K& key, const V& value) { ssKey.reserve(DBWRAPPER_PREALLOC_KEY_SIZE); - ssKey << key; - leveldb::Slice slKey(CharCast(ssKey.data()), ssKey.size()); - ssValue.reserve(DBWRAPPER_PREALLOC_VALUE_SIZE); + ssKey << key; ssValue << value; - ssValue.Xor(dbwrapper_private::GetObfuscateKey(parent)); - leveldb::Slice slValue(CharCast(ssValue.data()), ssValue.size()); - - batch.Put(slKey, slValue); - // LevelDB serializes writes as: - // - byte: header - // - varint: key length (1 byte up to 127B, 2 bytes up to 16383B, ...) - // - byte[]: key - // - varint: value length - // - byte[]: value - // The formula below assumes the key and value are both less than 16k. - size_estimate += 3 + (slKey.size() > 127) + slKey.size() + (slValue.size() > 127) + slValue.size(); + WriteImpl(ssKey, ssValue); ssKey.clear(); ssValue.clear(); } @@ -140,15 +113,7 @@ public: { ssKey.reserve(DBWRAPPER_PREALLOC_KEY_SIZE); ssKey << key; - leveldb::Slice slKey(CharCast(ssKey.data()), ssKey.size()); - - batch.Delete(slKey); - // LevelDB serializes erases as: - // - byte: header - // - varint: key length - // - byte[]: key - // The formula below assumes the key is less than 16kB. - size_estimate += 2 + (slKey.size() > 127) + slKey.size(); + EraseImpl(ssKey); ssKey.clear(); } @@ -157,9 +122,16 @@ public: class CDBIterator { +public: + struct IteratorImpl; + private: const CDBWrapper &parent; - leveldb::Iterator *piter; + const std::unique_ptr<IteratorImpl> m_impl_iter; + + void SeekImpl(Span<const std::byte> key); + Span<const std::byte> GetKeyImpl() const; + Span<const std::byte> GetValueImpl() const; public: @@ -167,8 +139,7 @@ public: * @param[in] _parent Parent CDBWrapper instance. * @param[in] _piter The original leveldb iterator. */ - CDBIterator(const CDBWrapper &_parent, leveldb::Iterator *_piter) : - parent(_parent), piter(_piter) { }; + CDBIterator(const CDBWrapper& _parent, std::unique_ptr<IteratorImpl> _piter); ~CDBIterator(); bool Valid() const; @@ -179,16 +150,14 @@ public: DataStream ssKey{}; ssKey.reserve(DBWRAPPER_PREALLOC_KEY_SIZE); ssKey << key; - leveldb::Slice slKey(CharCast(ssKey.data()), ssKey.size()); - piter->Seek(slKey); + SeekImpl(ssKey); } void Next(); template<typename K> bool GetKey(K& key) { - leveldb::Slice slKey = piter->key(); try { - DataStream ssKey{MakeByteSpan(slKey)}; + DataStream ssKey{GetKeyImpl()}; ssKey >> key; } catch (const std::exception&) { return false; @@ -197,9 +166,8 @@ public: } template<typename V> bool GetValue(V& value) { - leveldb::Slice slValue = piter->value(); try { - CDataStream ssValue{MakeByteSpan(slValue), SER_DISK, CLIENT_VERSION}; + CDataStream ssValue{GetValueImpl(), SER_DISK, CLIENT_VERSION}; ssValue.Xor(dbwrapper_private::GetObfuscateKey(parent)); ssValue >> value; } catch (const std::exception&) { @@ -209,30 +177,14 @@ public: } }; +struct LevelDBContext; + class CDBWrapper { friend const std::vector<unsigned char>& dbwrapper_private::GetObfuscateKey(const CDBWrapper &w); private: - //! custom environment this database is using (may be nullptr in case of default environment) - leveldb::Env* penv; - - //! database options used - leveldb::Options options; - - //! options used when reading from the database - leveldb::ReadOptions readoptions; - - //! options used when iterating over values of the database - leveldb::ReadOptions iteroptions; - - //! options used when writing to the database - leveldb::WriteOptions writeoptions; - - //! options used when sync writing to the database - leveldb::WriteOptions syncoptions; - - //! the database itself - leveldb::DB* pdb; + //! holds all leveldb-specific fields of this class + std::unique_ptr<LevelDBContext> m_db_context; //! the name of this database std::string m_name; @@ -254,6 +206,11 @@ private: //! whether or not the database resides in memory bool m_is_memory; + std::optional<std::string> ReadImpl(Span<const std::byte> key) const; + bool ExistsImpl(Span<const std::byte> key) const; + size_t EstimateSizeImpl(Span<const std::byte> key1, Span<const std::byte> key2) const; + auto& DBContext() const LIFETIMEBOUND { return *Assert(m_db_context); } + public: CDBWrapper(const DBParams& params); ~CDBWrapper(); @@ -267,18 +224,12 @@ public: DataStream ssKey{}; ssKey.reserve(DBWRAPPER_PREALLOC_KEY_SIZE); ssKey << key; - leveldb::Slice slKey(CharCast(ssKey.data()), ssKey.size()); - - std::string strValue; - leveldb::Status status = pdb->Get(readoptions, slKey, &strValue); - if (!status.ok()) { - if (status.IsNotFound()) - return false; - LogPrintf("LevelDB read failure: %s\n", status.ToString()); - dbwrapper_private::HandleError(status); + std::optional<std::string> strValue{ReadImpl(ssKey)}; + if (!strValue) { + return false; } try { - CDataStream ssValue{MakeByteSpan(strValue), SER_DISK, CLIENT_VERSION}; + CDataStream ssValue{MakeByteSpan(*strValue), SER_DISK, CLIENT_VERSION}; ssValue.Xor(obfuscate_key); ssValue >> value; } catch (const std::exception&) { @@ -309,17 +260,7 @@ public: DataStream ssKey{}; ssKey.reserve(DBWRAPPER_PREALLOC_KEY_SIZE); ssKey << key; - leveldb::Slice slKey(CharCast(ssKey.data()), ssKey.size()); - - std::string strValue; - leveldb::Status status = pdb->Get(readoptions, slKey, &strValue); - if (!status.ok()) { - if (status.IsNotFound()) - return false; - LogPrintf("LevelDB read failure: %s\n", status.ToString()); - dbwrapper_private::HandleError(status); - } - return true; + return ExistsImpl(ssKey); } template <typename K> @@ -335,10 +276,7 @@ public: // Get an estimate of LevelDB memory usage (in bytes). size_t DynamicMemoryUsage() const; - CDBIterator *NewIterator() - { - return new CDBIterator(*this, pdb->NewIterator(iteroptions)); - } + CDBIterator* NewIterator(); /** * Return true if the database managed by this class contains no entries. @@ -353,12 +291,7 @@ public: ssKey2.reserve(DBWRAPPER_PREALLOC_KEY_SIZE); ssKey1 << key_begin; ssKey2 << key_end; - leveldb::Slice slKey1(CharCast(ssKey1.data()), ssKey1.size()); - leveldb::Slice slKey2(CharCast(ssKey2.data()), ssKey2.size()); - uint64_t size = 0; - leveldb::Range range(slKey1, slKey2); - pdb->GetApproximateSizes(&range, 1, &size); - return size; + return EstimateSizeImpl(ssKey1, ssKey2); } }; diff --git a/src/index/blockfilterindex.cpp b/src/index/blockfilterindex.cpp index a860b3a94d..cc7d6687b8 100644 --- a/src/index/blockfilterindex.cpp +++ b/src/index/blockfilterindex.cpp @@ -8,6 +8,7 @@ #include <dbwrapper.h> #include <hash.h> #include <index/blockfilterindex.h> +#include <logging.h> #include <node/blockstorage.h> #include <util/fs_helpers.h> #include <validation.h> diff --git a/src/init.cpp b/src/init.cpp index 65f2d221bd..33389e695c 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -33,6 +33,7 @@ #include <interfaces/chain.h> #include <interfaces/init.h> #include <interfaces/node.h> +#include <logging.h> #include <mapport.h> #include <net.h> #include <net_permissions.h> diff --git a/src/net_processing.cpp b/src/net_processing.cpp index 5bb9647f35..e2bbfe3308 100644 --- a/src/net_processing.cpp +++ b/src/net_processing.cpp @@ -17,6 +17,7 @@ #include <headerssync.h> #include <index/blockfilterindex.h> #include <kernel/mempool_entry.h> +#include <logging.h> #include <merkleblock.h> #include <netbase.h> #include <netmessagemaker.h> diff --git a/src/node/interfaces.cpp b/src/node/interfaces.cpp index 9c98e4cf0c..42e021fcc9 100644 --- a/src/node/interfaces.cpp +++ b/src/node/interfaces.cpp @@ -18,6 +18,7 @@ #include <interfaces/wallet.h> #include <kernel/chain.h> #include <kernel/mempool_entry.h> +#include <logging.h> #include <mapport.h> #include <net.h> #include <net_processing.h> diff --git a/src/node/miner.cpp b/src/node/miner.cpp index aa1a9a155c..caa2991819 100644 --- a/src/node/miner.cpp +++ b/src/node/miner.cpp @@ -15,6 +15,7 @@ #include <consensus/tx_verify.h> #include <consensus/validation.h> #include <deploymentstatus.h> +#include <logging.h> #include <policy/feerate.h> #include <policy/policy.h> #include <pow.h> diff --git a/src/qt/bitcoin.cpp b/src/qt/bitcoin.cpp index 8f45af9485..865871a6d4 100644 --- a/src/qt/bitcoin.cpp +++ b/src/qt/bitcoin.cpp @@ -9,7 +9,6 @@ #include <qt/bitcoin.h> #include <chainparams.h> -#include <node/context.h> #include <common/args.h> #include <common/init.h> #include <common/system.h> @@ -17,6 +16,8 @@ #include <interfaces/handler.h> #include <interfaces/init.h> #include <interfaces/node.h> +#include <logging.h> +#include <node/context.h> #include <node/interface_ui.h> #include <noui.h> #include <qt/bitcoingui.h> diff --git a/src/qt/test/apptests.cpp b/src/qt/test/apptests.cpp index fb8029cb65..b05009965f 100644 --- a/src/qt/test/apptests.cpp +++ b/src/qt/test/apptests.cpp @@ -6,6 +6,7 @@ #include <chainparams.h> #include <key.h> +#include <logging.h> #include <qt/bitcoin.h> #include <qt/bitcoingui.h> #include <qt/networkstyle.h> diff --git a/src/qt/transactiondesc.cpp b/src/qt/transactiondesc.cpp index fa110cfbc9..dae6a2dea9 100644 --- a/src/qt/transactiondesc.cpp +++ b/src/qt/transactiondesc.cpp @@ -18,6 +18,7 @@ #include <interfaces/node.h> #include <interfaces/wallet.h> #include <key_io.h> +#include <logging.h> #include <policy/policy.h> #include <validation.h> #include <wallet/types.h> diff --git a/src/rpc/node.cpp b/src/rpc/node.cpp index dc5ecb9cbc..6b3662996c 100644 --- a/src/rpc/node.cpp +++ b/src/rpc/node.cpp @@ -13,6 +13,7 @@ #include <interfaces/init.h> #include <interfaces/ipc.h> #include <kernel/cs_main.h> +#include <logging.h> #include <node/context.h> #include <rpc/server.h> #include <rpc/server_util.h> diff --git a/src/test/util/setup_common.cpp b/src/test/util/setup_common.cpp index 65c657da96..08ef890ec4 100644 --- a/src/test/util/setup_common.cpp +++ b/src/test/util/setup_common.cpp @@ -19,6 +19,7 @@ #include <init/common.h> #include <interfaces/chain.h> #include <kernel/mempool_entry.h> +#include <logging.h> #include <net.h> #include <net_processing.h> #include <node/blockstorage.h> diff --git a/src/validation.cpp b/src/validation.cpp index 396133a4cf..c45c847471 100644 --- a/src/validation.cpp +++ b/src/validation.cpp @@ -5056,7 +5056,7 @@ static bool DeleteCoinsDBFromDisk(const fs::path db_path, bool is_snapshot) // We have to destruct before this call leveldb::DB in order to release the db // lock, otherwise `DestroyDB` will fail. See `leveldb::~DBImpl()`. - const bool destroyed = dbwrapper::DestroyDB(path_str, {}).ok(); + const bool destroyed = DestroyDB(path_str); if (!destroyed) { LogPrintf("error: leveldb DestroyDB call failed on %s\n", path_str); |