Skip to content

Commit

Permalink
Merge pull request #2101 from skalenetwork/enhancement/1978-disable-l…
Browse files Browse the repository at this point in the history
…eveldb-log-during-snapshot

Enhancement/1978 Disable leveldb log during snapshot & add DB path to log
  • Loading branch information
PropzSaladaz authored Feb 21, 2025
2 parents 64665c6 + d31e8c2 commit cebb86d
Show file tree
Hide file tree
Showing 6 changed files with 73 additions and 27 deletions.
7 changes: 5 additions & 2 deletions libdevcore/DBFactory.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -138,10 +138,13 @@ std::unique_ptr< DatabaseFace > DBFactory::create( DatabaseKind _kind, fs::path

std::unique_ptr< DatabaseFace > DBFactory::createHistoric(
DatabaseKind _kind, fs::path const& _path ) {
LevelDB::LevelDBOptions options;
LevelDB::WrapperOptions wrapperOptions;

switch ( _kind ) {
case DatabaseKind::LevelDB:
return std::unique_ptr< DatabaseFace >( new LevelDB( _path, LevelDB::defaultReadOptions(),
LevelDB::defaultWriteOptions(), LevelDB::defaultDBOptions(), s_reopenPeriodMs ) );
wrapperOptions.reopenPeriodMs = s_reopenPeriodMs;
return std::unique_ptr< DatabaseFace >( new LevelDB( _path, options, wrapperOptions ) );
break;
default:
assert( false );
Expand Down
36 changes: 26 additions & 10 deletions libdevcore/LevelDB.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -119,21 +119,33 @@ leveldb::Options LevelDB::defaultSnapshotDBOptions() {
return options;
}

LevelDB::LevelDB( boost::filesystem::path const& _path, leveldb::ReadOptions _readOptions,
leveldb::WriteOptions _writeOptions, leveldb::Options _dbOptions, int64_t _reopenPeriodMs )
LevelDB::LevelDBOptions LevelDB::defaultLevelDBOptions() {
LevelDBOptions options;
return options;
}
LevelDB::WrapperOptions LevelDB::defaultWrapperOptions() {
WrapperOptions options;
return options;
}

LevelDB::LevelDB( boost::filesystem::path const& _path, LevelDBOptions _levelDBOptions,
WrapperOptions _wrapperOptions )
: m_db( nullptr ),
m_readOptions( std::move( _readOptions ) ),
m_writeOptions( std::move( _writeOptions ) ),
m_options( std::move( _dbOptions ) ),
m_readOptions( std::move( _levelDBOptions.readOptions ) ),
m_writeOptions( std::move( _levelDBOptions.writeOptions ) ),
m_options( std::move( _levelDBOptions.dbOptions ) ),
m_path( _path ),
m_reopenPeriodMs( _reopenPeriodMs ) {
openDBInstanceUnsafe();
m_reopenPeriodMs( _wrapperOptions.reopenPeriodMs ) {
openDBInstanceUnsafe( _wrapperOptions.enableLogger );
}

// this does not hold any locks so it needs to be called
// either from a constructor or from a function that holds a lock on m_db
void LevelDB::openDBInstanceUnsafe() {
cnote << "Time to (re)open LevelDB at " + m_path.string();
void LevelDB::openDBInstanceUnsafe( bool _enableLogger ) {
if ( _enableLogger ) {
cnote << "Time to (re)open LevelDB at " + m_path.string();
}

auto startTimeMs = getCurrentTimeMs();
auto db = static_cast< leveldb::DB* >( nullptr );
auto const status = leveldb::DB::Open( m_options, m_path.string(), &db );
Expand All @@ -146,7 +158,11 @@ void LevelDB::openDBInstanceUnsafe() {
m_db.reset( db );
m_lastDBOpenTimeMs = getCurrentTimeMs();
m_dbReopenId++;
cnote << "LEVELDB_OPENED:TIME_MS:" << m_lastDBOpenTimeMs - startTimeMs;

if ( _enableLogger ) {
cnote << "LEVELDB_OPENED:" << m_path.string()
<< ":TIME_MS:" << m_lastDBOpenTimeMs - startTimeMs;
}
}
uint64_t LevelDB::getCurrentTimeMs() {
auto currentTime = std::chrono::system_clock::now().time_since_epoch();
Expand Down
23 changes: 19 additions & 4 deletions libdevcore/LevelDB.h
Original file line number Diff line number Diff line change
Expand Up @@ -49,10 +49,22 @@ class LevelDB : public DatabaseFace {
static leveldb::ReadOptions defaultSnapshotReadOptions();
static leveldb::Options defaultSnapshotDBOptions();

/// Options regarding levelDB database
struct LevelDBOptions {
leveldb::ReadOptions readOptions = defaultReadOptions();
leveldb::WriteOptions writeOptions = defaultWriteOptions();
leveldb::Options dbOptions = defaultDBOptions();
};

/// Options regarding the wrapper of levelDB
struct WrapperOptions {
int64_t reopenPeriodMs = -1;
bool enableLogger = true;
};

explicit LevelDB( boost::filesystem::path const& _path,
leveldb::ReadOptions _readOptions = defaultReadOptions(),
leveldb::WriteOptions _writeOptions = defaultWriteOptions(),
leveldb::Options _dbOptions = defaultDBOptions(), int64_t _reopenPeriodMs = -1 );
LevelDBOptions _levelDBOptions = defaultLevelDBOptions(),
WrapperOptions _wrapperOptions = defaultWrapperOptions() );

~LevelDB();

Expand Down Expand Up @@ -154,11 +166,14 @@ class LevelDB : public DatabaseFace {
m_levedlDB.m_dbMutex.unlock();
}
};
void openDBInstanceUnsafe();
void openDBInstanceUnsafe( bool _enableLogger = true );
void reopenDataBaseIfNeeded();
leveldb::Status getValue( leveldb::ReadOptions _readOptions, const leveldb::Slice& _key,
std::string& _value, const std::shared_ptr< LevelDBSnap >& _snap ) const;
void reopen();

static LevelDBOptions defaultLevelDBOptions();
static WrapperOptions defaultWrapperOptions();
};

} // namespace dev::db
5 changes: 3 additions & 2 deletions libdevcore/SplitDB.h
Original file line number Diff line number Diff line change
Expand Up @@ -69,8 +69,9 @@ class LevelDBThroughSplit : public DatabaseFace {
leveldb::ReadOptions _readOptions = defaultReadOptions(),
leveldb::WriteOptions _writeOptions = defaultWriteOptions(),
leveldb::Options _dbOptions = defaultDBOptions() ) {
auto leveldb =
std::make_shared< LevelDB >( _path, _readOptions, _writeOptions, _dbOptions );
LevelDB::LevelDBOptions options = { _readOptions, _writeOptions, _dbOptions };

auto leveldb = std::make_shared< LevelDB >( _path, options );
split_db = std::make_unique< SplitDB >( leveldb );
backend = split_db->newInterface();
}
Expand Down
19 changes: 13 additions & 6 deletions libskale/SnapshotManager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -496,9 +496,13 @@ void SnapshotManager::computeDatabaseHash(
bool isContinue = true;

while ( isContinue ) {
std::unique_ptr< dev::db::LevelDB > m_db( new dev::db::LevelDB( _dbDir.string(),
dev::db::LevelDB::defaultSnapshotReadOptions(), dev::db::LevelDB::defaultWriteOptions(),
dev::db::LevelDB::defaultSnapshotDBOptions() ) );
dev::db::LevelDB::LevelDBOptions options = { dev::db::LevelDB::defaultSnapshotReadOptions(),
dev::db::LevelDB::defaultWriteOptions(), dev::db::LevelDB::defaultSnapshotDBOptions() };
dev::db::LevelDB::WrapperOptions wrapperOptions;
wrapperOptions.enableLogger = false;

std::unique_ptr< dev::db::LevelDB > m_db(
new dev::db::LevelDB( _dbDir.string(), options, wrapperOptions ) );

isContinue = m_db->hashBasePartially( &dbCtx, lastHashedKey );
}
Expand All @@ -522,9 +526,12 @@ void SnapshotManager::addLastPriceToHash( unsigned _blockNumber, secp256k1_sha25
std::string last_price_str;
std::string last_price_key = "1.0:" + std::to_string( _blockNumber );
while ( it != end ) {
std::unique_ptr< dev::db::LevelDB > m_db( new dev::db::LevelDB( it->path().string(),
dev::db::LevelDB::defaultReadOptions(), dev::db::LevelDB::defaultWriteOptions(),
dev::db::LevelDB::defaultSnapshotDBOptions() ) );
dev::db::LevelDB::LevelDBOptions options;
options.dbOptions = dev::db::LevelDB::defaultSnapshotDBOptions();

std::unique_ptr< dev::db::LevelDB > m_db(
new dev::db::LevelDB( it->path().string(), options ) );

if ( m_db->exists( last_price_key ) ) {
last_price_str = m_db->lookup( last_price_key );
break;
Expand Down
10 changes: 7 additions & 3 deletions test/unittests/libweb3core/LevelDBHash.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -76,9 +76,13 @@ BOOST_AUTO_TEST_CASE( hash ) {
std::string lastHashedKey = "start";
bool isContinue = true;
while ( isContinue ) {
std::unique_ptr< dev::db::LevelDB > m_db( new dev::db::LevelDB( td.path(),
dev::db::LevelDB::defaultSnapshotReadOptions(), dev::db::LevelDB::defaultWriteOptions(),
dev::db::LevelDB::defaultSnapshotDBOptions() ) );
dev::db::LevelDB::LevelDBOptions options = {
dev::db::LevelDB::defaultSnapshotReadOptions(),
dev::db::LevelDB::defaultWriteOptions(),
dev::db::LevelDB::defaultSnapshotDBOptions()
};

std::unique_ptr< dev::db::LevelDB > m_db( new dev::db::LevelDB( td.path(), options) );

isContinue = m_db->hashBasePartially( &dbCtx, lastHashedKey );
}
Expand Down

0 comments on commit cebb86d

Please sign in to comment.