Skip to content

Commit 741f017

Browse files
committed
Add DynamicMemoryUsage() to LevelDB
This adds a DynamicMemoryUsage() method similar to the existing methods of the same name, and adds logging of memory usage to CDBWrapper::WriteBatch.
1 parent 47a7666 commit 741f017

File tree

2 files changed

+26
-0
lines changed

2 files changed

+26
-0
lines changed

src/dbwrapper.cpp

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,7 @@ static leveldb::Options GetOptions(size_t nCacheSize)
8989
}
9090

9191
CDBWrapper::CDBWrapper(const fs::path& path, size_t nCacheSize, bool fMemory, bool fWipe, bool obfuscate)
92+
: m_name(fs::basename(path))
9293
{
9394
penv = nullptr;
9495
readoptions.verify_checksums = true;
@@ -155,11 +156,30 @@ CDBWrapper::~CDBWrapper()
155156

156157
bool CDBWrapper::WriteBatch(CDBBatch& batch, bool fSync)
157158
{
159+
const bool log_memory = LogAcceptCategory(BCLog::LEVELDB);
160+
double mem_before = 0;
161+
if (log_memory) {
162+
mem_before = DynamicMemoryUsage() / 1024 / 1024;
163+
}
158164
leveldb::Status status = pdb->Write(fSync ? syncoptions : writeoptions, &batch.batch);
159165
dbwrapper_private::HandleError(status);
166+
if (log_memory) {
167+
double mem_after = DynamicMemoryUsage() / 1024 / 1024;
168+
LogPrint(BCLog::LEVELDB, "WriteBatch memory usage: db=%s, before=%.1fMiB, after=%.1fMiB\n",
169+
m_name, mem_before, mem_after);
170+
}
160171
return true;
161172
}
162173

174+
size_t CDBWrapper::DynamicMemoryUsage() const {
175+
std::string memory;
176+
if (!pdb->GetProperty("leveldb.approximate-memory-usage", &memory)) {
177+
LogPrint(BCLog::LEVELDB, "Failed to get approximate-memory-usage property\n");
178+
return 0;
179+
}
180+
return stoul(memory);
181+
}
182+
163183
// Prefixed with null character to avoid collisions with other keys
164184
//
165185
// We must use a string constructor which specifies length so that we copy

src/dbwrapper.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -198,6 +198,9 @@ class CDBWrapper
198198
//! the database itself
199199
leveldb::DB* pdb;
200200

201+
//! the name of this database
202+
std::string m_name;
203+
201204
//! a key used for optional XOR-obfuscation of the database
202205
std::vector<unsigned char> obfuscate_key;
203206

@@ -284,6 +287,9 @@ class CDBWrapper
284287

285288
bool WriteBatch(CDBBatch& batch, bool fSync = false);
286289

290+
// Get an estimate of LevelDB memory usage (in bytes).
291+
size_t DynamicMemoryUsage() const;
292+
287293
// not available for LevelDB; provide for compatibility with BDB
288294
bool Flush()
289295
{

0 commit comments

Comments
 (0)