|
|
@ -89,6 +89,7 @@ static leveldb::Options GetOptions(size_t nCacheSize)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
CDBWrapper::CDBWrapper(const fs::path& path, size_t nCacheSize, bool fMemory, bool fWipe, bool obfuscate)
|
|
|
|
CDBWrapper::CDBWrapper(const fs::path& path, size_t nCacheSize, bool fMemory, bool fWipe, bool obfuscate)
|
|
|
|
|
|
|
|
: m_name(fs::basename(path))
|
|
|
|
{
|
|
|
|
{
|
|
|
|
penv = nullptr;
|
|
|
|
penv = nullptr;
|
|
|
|
readoptions.verify_checksums = true;
|
|
|
|
readoptions.verify_checksums = true;
|
|
|
@ -155,11 +156,30 @@ CDBWrapper::~CDBWrapper()
|
|
|
|
|
|
|
|
|
|
|
|
bool CDBWrapper::WriteBatch(CDBBatch& batch, bool fSync)
|
|
|
|
bool CDBWrapper::WriteBatch(CDBBatch& batch, bool fSync)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
|
|
|
|
const bool log_memory = LogAcceptCategory(BCLog::LEVELDB);
|
|
|
|
|
|
|
|
double mem_before = 0;
|
|
|
|
|
|
|
|
if (log_memory) {
|
|
|
|
|
|
|
|
mem_before = DynamicMemoryUsage() / 1024 / 1024;
|
|
|
|
|
|
|
|
}
|
|
|
|
leveldb::Status status = pdb->Write(fSync ? syncoptions : writeoptions, &batch.batch);
|
|
|
|
leveldb::Status status = pdb->Write(fSync ? syncoptions : writeoptions, &batch.batch);
|
|
|
|
dbwrapper_private::HandleError(status);
|
|
|
|
dbwrapper_private::HandleError(status);
|
|
|
|
|
|
|
|
if (log_memory) {
|
|
|
|
|
|
|
|
double mem_after = DynamicMemoryUsage() / 1024 / 1024;
|
|
|
|
|
|
|
|
LogPrint(BCLog::LEVELDB, "WriteBatch memory usage: db=%s, before=%.1fMiB, after=%.1fMiB\n",
|
|
|
|
|
|
|
|
m_name, mem_before, mem_after);
|
|
|
|
|
|
|
|
}
|
|
|
|
return true;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
size_t CDBWrapper::DynamicMemoryUsage() const {
|
|
|
|
|
|
|
|
std::string memory;
|
|
|
|
|
|
|
|
if (!pdb->GetProperty("leveldb.approximate-memory-usage", &memory)) {
|
|
|
|
|
|
|
|
LogPrint(BCLog::LEVELDB, "Failed to get approximate-memory-usage property\n");
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
return stoul(memory);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Prefixed with null character to avoid collisions with other keys
|
|
|
|
// Prefixed with null character to avoid collisions with other keys
|
|
|
|
//
|
|
|
|
//
|
|
|
|
// We must use a string constructor which specifies length so that we copy
|
|
|
|
// We must use a string constructor which specifies length so that we copy
|
|
|
|