remove ncli_db pruneDatabase (#3356)
This commit is contained in:
parent
de0d473ea1
commit
9c18765b3b
113
ncli/ncli_db.nim
113
ncli/ncli_db.nim
|
@ -33,7 +33,6 @@ type
|
||||||
putState = "Store a given BeaconState in the database"
|
putState = "Store a given BeaconState in the database"
|
||||||
dumpBlock = "Extract a (trusted) SignedBeaconBlock from the database"
|
dumpBlock = "Extract a (trusted) SignedBeaconBlock from the database"
|
||||||
putBlock = "Store a given SignedBeaconBlock in the database, potentially updating some of the pointers"
|
putBlock = "Store a given SignedBeaconBlock in the database, potentially updating some of the pointers"
|
||||||
pruneDatabase
|
|
||||||
rewindState = "Extract any state from the database based on a given block and slot, replaying if needed"
|
rewindState = "Extract any state from the database based on a given block and slot, replaying if needed"
|
||||||
exportEra = "Write an experimental era file"
|
exportEra = "Write an experimental era file"
|
||||||
importEra = "Import era files to the database"
|
importEra = "Import era files to the database"
|
||||||
|
@ -118,19 +117,6 @@ type
|
||||||
name: "set-genesis"
|
name: "set-genesis"
|
||||||
desc: "Update genesis to this block"}: bool
|
desc: "Update genesis to this block"}: bool
|
||||||
|
|
||||||
of DbCmd.pruneDatabase:
|
|
||||||
dryRun* {.
|
|
||||||
defaultValue: false
|
|
||||||
name: "dry-run"
|
|
||||||
desc: "Don't write to the database copy; only simulate actions; default false".}: bool
|
|
||||||
keepOldStates* {.
|
|
||||||
defaultValue: true
|
|
||||||
name: "keep-old"
|
|
||||||
desc: "Keep pre-finalization states; default true".}: bool
|
|
||||||
verbose* {.
|
|
||||||
defaultValue: false
|
|
||||||
desc: "Enables verbose output; default false".}: bool
|
|
||||||
|
|
||||||
of DbCmd.rewindState:
|
of DbCmd.rewindState:
|
||||||
blockRoot* {.
|
blockRoot* {.
|
||||||
argument
|
argument
|
||||||
|
@ -203,7 +189,7 @@ func getSlotRange(dag: ChainDAGRef, startSlot: int64, count: uint64): (Slot, Slo
|
||||||
start =
|
start =
|
||||||
if startSlot >= 0: Slot(startSlot)
|
if startSlot >= 0: Slot(startSlot)
|
||||||
elif uint64(-startSlot) >= dag.head.slot: Slot(0)
|
elif uint64(-startSlot) >= dag.head.slot: Slot(0)
|
||||||
else: Slot(dag.head.slot - uint64(-startSlot))
|
else: dag.head.slot - uint64(-startSlot)
|
||||||
ends =
|
ends =
|
||||||
if count == 0: dag.head.slot + 1
|
if count == 0: dag.head.slot + 1
|
||||||
else: start + count
|
else: start + count
|
||||||
|
@ -403,101 +389,6 @@ proc cmdPutBlock(conf: DbConf, cfg: RuntimeConfig) =
|
||||||
if conf.setGenesis:
|
if conf.setGenesis:
|
||||||
db.putGenesisBlock(blck.root)
|
db.putGenesisBlock(blck.root)
|
||||||
|
|
||||||
proc copyPrunedDatabase(
|
|
||||||
db: BeaconChainDB, copyDb: BeaconChainDB,
|
|
||||||
dryRun, verbose, keepOldStates: bool) =
|
|
||||||
## Create a pruned copy of the beacon chain database
|
|
||||||
|
|
||||||
let
|
|
||||||
headBlock = db.getHeadBlock()
|
|
||||||
tailBlock = db.getTailBlock()
|
|
||||||
genesisBlock = db.getGenesisBlock()
|
|
||||||
|
|
||||||
doAssert db.getPhase0Block(headBlock.get).isOk
|
|
||||||
doAssert db.getPhase0Block(tailBlock.get).isOk
|
|
||||||
doAssert db.getPhase0Block(genesisBlock.get).isOk
|
|
||||||
|
|
||||||
var
|
|
||||||
beaconState = (ref phase0.HashedBeaconState)()
|
|
||||||
finalizedEpoch: Epoch # default value of 0 is conservative/safe
|
|
||||||
prevBlockSlot = db.getPhase0Block(db.getHeadBlock().get).get.message.slot
|
|
||||||
|
|
||||||
let
|
|
||||||
headEpoch = db.getPhase0Block(headBlock.get).get.message.slot.epoch
|
|
||||||
tailStateRoot = db.getPhase0Block(tailBlock.get).get.message.state_root
|
|
||||||
|
|
||||||
# Tail states are specially addressed; no stateroot intermediary
|
|
||||||
if not db.getState(tailStateRoot, beaconState[].data, noRollback):
|
|
||||||
doAssert false, "could not load tail state"
|
|
||||||
beaconState[].root = tailStateRoot
|
|
||||||
|
|
||||||
if not dry_run:
|
|
||||||
copyDb.putStateRoot(
|
|
||||||
beaconState[].latest_block_root(), beaconState[].data.slot,
|
|
||||||
beaconState[].root)
|
|
||||||
copyDb.putState(beaconState[].root, beaconState[].data)
|
|
||||||
copyDb.putBlock(db.getPhase0Block(genesisBlock.get).get)
|
|
||||||
|
|
||||||
for signedBlock in getAncestors(db, headBlock.get):
|
|
||||||
if shouldShutDown: quit QuitSuccess
|
|
||||||
if not dry_run:
|
|
||||||
copyDb.putBlock(signedBlock)
|
|
||||||
copyDb.checkpoint()
|
|
||||||
if verbose:
|
|
||||||
echo "copied block at slot ", signedBlock.message.slot
|
|
||||||
|
|
||||||
for slot in countdown(prevBlockSlot, signedBlock.message.slot + 1):
|
|
||||||
if slot mod SLOTS_PER_EPOCH != 0 or
|
|
||||||
((not keepOldStates) and slot.epoch < finalizedEpoch):
|
|
||||||
continue
|
|
||||||
|
|
||||||
# Could also only copy these states, head and finalized, plus tail state
|
|
||||||
let stateRequired = slot.epoch in [finalizedEpoch, headEpoch]
|
|
||||||
|
|
||||||
let sr = db.getStateRoot(signedBlock.root, slot)
|
|
||||||
if sr.isErr:
|
|
||||||
if stateRequired:
|
|
||||||
echo "skipping state root required for slot ",
|
|
||||||
slot, " with root ", signedBlock.root
|
|
||||||
continue
|
|
||||||
|
|
||||||
if not db.getState(sr.get, beaconState[].data, noRollback):
|
|
||||||
# Don't copy dangling stateroot pointers
|
|
||||||
if stateRequired:
|
|
||||||
doAssert false, "state root and state required"
|
|
||||||
continue
|
|
||||||
beaconState[].root = sr.get()
|
|
||||||
|
|
||||||
finalizedEpoch = max(
|
|
||||||
finalizedEpoch, beaconState[].data.finalized_checkpoint.epoch)
|
|
||||||
|
|
||||||
if not dry_run:
|
|
||||||
copyDb.putStateRoot(
|
|
||||||
beaconState[].latest_block_root(), beaconState[].data.slot,
|
|
||||||
beaconState[].root)
|
|
||||||
copyDb.putState(beaconState[].root, beaconState[].data)
|
|
||||||
if verbose:
|
|
||||||
echo "copied state at slot ", slot, " from block at ", shortLog(signedBlock.message.slot)
|
|
||||||
|
|
||||||
prevBlockSlot = signedBlock.message.slot
|
|
||||||
|
|
||||||
if not dry_run:
|
|
||||||
copyDb.putHeadBlock(headBlock.get)
|
|
||||||
copyDb.putTailBlock(tailBlock.get)
|
|
||||||
copyDb.putGenesisBlock(genesisBlock.get)
|
|
||||||
|
|
||||||
proc cmdPrune(conf: DbConf) =
|
|
||||||
let
|
|
||||||
db = BeaconChainDB.new(conf.databaseDir.string)
|
|
||||||
# TODO: add the destination as CLI paramter
|
|
||||||
copyDb = BeaconChainDB.new("pruned_db")
|
|
||||||
|
|
||||||
defer:
|
|
||||||
db.close()
|
|
||||||
copyDb.close()
|
|
||||||
|
|
||||||
db.copyPrunedDatabase(copyDb, conf.dryRun, conf.verbose, conf.keepOldStates)
|
|
||||||
|
|
||||||
proc cmdRewindState(conf: DbConf, cfg: RuntimeConfig) =
|
proc cmdRewindState(conf: DbConf, cfg: RuntimeConfig) =
|
||||||
echo "Opening database..."
|
echo "Opening database..."
|
||||||
let db = BeaconChainDB.new(conf.databaseDir.string)
|
let db = BeaconChainDB.new(conf.databaseDir.string)
|
||||||
|
@ -1105,8 +996,6 @@ when isMainModule:
|
||||||
cmdDumpBlock(conf)
|
cmdDumpBlock(conf)
|
||||||
of DbCmd.putBlock:
|
of DbCmd.putBlock:
|
||||||
cmdPutBlock(conf, cfg)
|
cmdPutBlock(conf, cfg)
|
||||||
of DbCmd.pruneDatabase:
|
|
||||||
cmdPrune(conf)
|
|
||||||
of DbCmd.rewindState:
|
of DbCmd.rewindState:
|
||||||
cmdRewindState(conf, cfg)
|
cmdRewindState(conf, cfg)
|
||||||
of DbCmd.exportEra:
|
of DbCmd.exportEra:
|
||||||
|
|
Loading…
Reference in New Issue