From 71de8a51dc614bea8f57771b126ad6959c2fe20e Mon Sep 17 00:00:00 2001 From: Stan Kladko <13399135+kladkogex@users.noreply.github.com> Date: Fri, 21 Jun 2024 13:56:57 +0100 Subject: [PATCH] #1545 state locking --- libdevcore/LevelDB.cpp | 14 +++++--------- libdevcore/LevelDB.h | 11 +++++++---- 2 files changed, 12 insertions(+), 13 deletions(-) diff --git a/libdevcore/LevelDB.cpp b/libdevcore/LevelDB.cpp index 7b65fe7b0..9a8660f21 100644 --- a/libdevcore/LevelDB.cpp +++ b/libdevcore/LevelDB.cpp @@ -30,10 +30,6 @@ namespace dev::db { unsigned c_maxOpenLeveldbFiles = 25; -const size_t LevelDB::BATCH_CHUNK_SIZE = 10000; -const size_t LevelDB::MAX_OLD_SNAPS_LIFETIME_MS = 10000; -const size_t LevelDB::FORCE_CLOSE_TIME_MS = 3000; - namespace { inline leveldb::Slice toLDBSlice( Slice _slice ) { return leveldb::Slice( _slice.data(), _slice.size() ); @@ -296,14 +292,14 @@ void LevelDB::reopenDataBaseIfNeeded() { auto startTimeMs = getCurrentTimeMs(); - while (getCurrentTimeMs() <= startTimeMs + FORCE_CLOSE_TIME_MS) { - cleanOldSnapsUnsafe(FORCE_CLOSE_TIME_MS); + while (getCurrentTimeMs() <= startTimeMs + FORCE_SNAP_CLOSE_TIME_MS ) { + cleanUnusedOldSnapsUnsafe( FORCE_SNAP_CLOSE_TIME_MS ); } if (oldSnaps.empty()) { // there are still open snaps. Close all of them not waiting for // eth_calls to complete by passing 0 as wait time - cleanOldSnapsUnsafe(0); + cleanUnusedOldSnapsUnsafe( 0 ); } LDB_CHECK(oldSnaps.empty()); @@ -463,12 +459,12 @@ void LevelDB::createBlockSnap( uint64_t _blockId ) { // we clean unneeded old snaps that no-one used or that exist for more that max // lifetime we give for eth_calls to complete - cleanOldSnapsUnsafe( MAX_OLD_SNAPS_LIFETIME_MS ); + cleanUnusedOldSnapsUnsafe( OLD_SNAP_LIFETIME_MS ); } // this function should be called while holding database reopen lock -void LevelDB::cleanOldSnapsUnsafe( uint64_t _maxSnapLifetimeMs ) { +void LevelDB::cleanUnusedOldSnapsUnsafe( uint64_t _maxSnapLifetimeMs ) { std::unique_lock< std::shared_mutex > snapLock( m_snapMutex ); //now we iterate over oldSnaps closing the ones that are not more in use diff --git a/libdevcore/LevelDB.h b/libdevcore/LevelDB.h index 6bfc32c34..082616901 100644 --- a/libdevcore/LevelDB.h +++ b/libdevcore/LevelDB.h @@ -120,9 +120,12 @@ class LevelDB : public DatabaseFace { std::shared_mutex m_snapMutex; - static const size_t BATCH_CHUNK_SIZE; - static const size_t MAX_OLD_SNAPS_LIFETIME_MS; - static const size_t FORCE_CLOSE_TIME_MS; + static constexpr size_t BATCH_CHUNK_SIZE = 10000; + // time after an existing old snap will be closed if no-one is using it + static const size_t OLD_SNAP_LIFETIME_MS = 10000; + // time after an existing old snap will be closed it is used in eth_call + // this will cause the eth_call to return an error + static const size_t FORCE_SNAP_CLOSE_TIME_MS = 3000; class SharedDBGuard { const LevelDB& m_levedlDB; @@ -161,7 +164,7 @@ class LevelDB : public DatabaseFace { }; void openDBInstanceUnsafe(); void reopenDataBaseIfNeeded(); - void cleanOldSnapsUnsafe( uint64_t _maxSnapLifetimeMs ); + void cleanUnusedOldSnapsUnsafe( uint64_t _maxSnapLifetimeMs ); }; } // namespace dev::db