mirror of
https://github.com/status-im/nimbus-eth1.git
synced 2025-02-07 17:55:52 +00:00
For the block cache to be shared between column families, the options instance must be shared between the various column families being created. This also ensures that there is only one source of truth for configuration options instead of having two different sets depending on how the tables were initialized. This PR also removes the re-opening mechanism which can double startup time - every time the database is opened, the log is replayed - a large log file will take a long time to open. Finally, several options got correclty implemented as column family options, including an one that puts a hash index in the SST files.
104 lines
3.0 KiB
Nim
104 lines
3.0 KiB
Nim
# nimbus-eth1
|
|
# Copyright (c) 2023-2024 Status Research & Development GmbH
|
|
# Licensed under either of
|
|
# * Apache License, version 2.0, ([LICENSE-APACHE](LICENSE-APACHE) or
|
|
# http://www.apache.org/licenses/LICENSE-2.0)
|
|
# * MIT license ([LICENSE-MIT](LICENSE-MIT) or
|
|
# http://opensource.org/licenses/MIT)
|
|
# at your option. This file may not be copied, modified, or distributed
|
|
# except according to those terms.
|
|
|
|
## Rocksdb constructor/destructor for Kvt DB
|
|
## =========================================
|
|
|
|
{.push raises: [].}
|
|
|
|
import
|
|
std/[sequtils, os],
|
|
rocksdb,
|
|
results,
|
|
../../../opts,
|
|
../../kvt_desc,
|
|
../../kvt_desc/desc_error as kdb,
|
|
./rdb_desc
|
|
|
|
export rdb_desc, results
|
|
|
|
# ------------------------------------------------------------------------------
|
|
# Public constructor
|
|
# ------------------------------------------------------------------------------
|
|
|
|
proc init*(
|
|
rdb: var RdbInst;
|
|
basePath: string;
|
|
dbOpts: DbOptionsRef;
|
|
cfOpts: ColFamilyOptionsRef;
|
|
): Result[void,(KvtError,string)] =
|
|
## Database backend constructor for stand-alone version
|
|
##
|
|
const initFailed = "RocksDB/init() failed"
|
|
|
|
rdb.basePath = basePath
|
|
|
|
let
|
|
dataDir = rdb.dataDir
|
|
try:
|
|
dataDir.createDir
|
|
except OSError, IOError:
|
|
return err((kdb.RdbBeCantCreateDataDir, ""))
|
|
|
|
# Column familiy names to allocate when opening the database.
|
|
let cfs = KvtCFs.mapIt(($it).initColFamilyDescriptor cfOpts)
|
|
|
|
# Open database for the extended family :)
|
|
let baseDb = openRocksDb(dataDir, dbOpts, columnFamilies=cfs).valueOr:
|
|
raiseAssert initFailed & " cannot create base descriptor: " & error
|
|
|
|
# Initialise column handlers (this stores implicitely `baseDb`)
|
|
for col in KvtCFs:
|
|
rdb.store[col] = baseDb.withColFamily($col).valueOr:
|
|
raiseAssert initFailed & " cannot initialise " &
|
|
$col & " descriptor: " & error
|
|
ok()
|
|
|
|
proc guestCFs*(T: type RdbInst, cfOpts: ColFamilyOptionsRef): seq =
|
|
KvtCFs.toSeq.mapIt(initColFamilyDescriptor($it, cfOpts))
|
|
|
|
proc init*(
|
|
rdb: var RdbInst;
|
|
oCfs: openArray[ColFamilyReadWrite];
|
|
): Result[void,(KvtError,string)] =
|
|
## Initalise column handlers piggy-backing on the `Aristo` backend.
|
|
##
|
|
# Collect column family descriptors (this stores implicitely `baseDb`)
|
|
for n in KvtCFs:
|
|
assert oCfs[n.ord].name != "" # debugging only
|
|
rdb.store[n] = oCfs[n.ord]
|
|
|
|
ok()
|
|
|
|
|
|
proc destroy*(rdb: var RdbInst; eradicate: bool) =
|
|
## Destructor (no need to do anything if piggybacked)
|
|
if 0 < rdb.basePath.len:
|
|
rdb.baseDb.close()
|
|
|
|
if eradicate:
|
|
try:
|
|
rdb.dataDir.removeDir
|
|
|
|
# Remove the base folder if it is empty
|
|
block done:
|
|
for w in rdb.baseDir.walkDirRec:
|
|
# Ignore backup files
|
|
if 0 < w.len and w[^1] != '~':
|
|
break done
|
|
rdb.baseDir.removeDir
|
|
|
|
except CatchableError:
|
|
discard
|
|
|
|
# ------------------------------------------------------------------------------
|
|
# End
|
|
# ------------------------------------------------------------------------------
|