Fix bug when resuming from DB prior to genesis (#946)
* Use default client genesis if no chain in store * Always use resume if there is a beacon chain
This commit is contained in:
parent
0759806c89
commit
88d37e96fa
@ -178,6 +178,19 @@ where
|
|||||||
.map_err(|e| format!("DB error whilst reading eth1 cache: {:?}", e))
|
.map_err(|e| format!("DB error whilst reading eth1 cache: {:?}", e))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Returns true if `self.store` contains a persisted beacon chain.
|
||||||
|
pub fn store_contains_beacon_chain(&self) -> Result<bool, String> {
|
||||||
|
let store = self
|
||||||
|
.store
|
||||||
|
.clone()
|
||||||
|
.ok_or_else(|| "load_from_store requires a store.".to_string())?;
|
||||||
|
|
||||||
|
Ok(store
|
||||||
|
.get::<PersistedBeaconChain>(&Hash256::from_slice(&BEACON_CHAIN_DB_KEY))
|
||||||
|
.map_err(|e| format!("DB error when reading persisted beacon chain: {:?}", e))?
|
||||||
|
.is_some())
|
||||||
|
}
|
||||||
|
|
||||||
/// Attempt to load an existing chain from the builder's `Store`.
|
/// Attempt to load an existing chain from the builder's `Store`.
|
||||||
///
|
///
|
||||||
/// May initialize several components; including the op_pool and finalized checkpoints.
|
/// May initialize several components; including the op_pool and finalized checkpoints.
|
||||||
|
@ -151,6 +151,26 @@ where
|
|||||||
Ok((builder, spec, context))
|
Ok((builder, spec, context))
|
||||||
})
|
})
|
||||||
.and_then(move |(builder, spec, context)| {
|
.and_then(move |(builder, spec, context)| {
|
||||||
|
let chain_exists = builder
|
||||||
|
.store_contains_beacon_chain()
|
||||||
|
.unwrap_or_else(|_| false);
|
||||||
|
|
||||||
|
// If the client is expect to resume but there's no beacon chain in the database,
|
||||||
|
// use the `DepositContract` method. This scenario is quite common when the client
|
||||||
|
// is shutdown before finding genesis via eth1.
|
||||||
|
//
|
||||||
|
// Alternatively, if there's a beacon chain in the database then always resume
|
||||||
|
// using it.
|
||||||
|
let client_genesis = if client_genesis == ClientGenesis::Resume && !chain_exists {
|
||||||
|
info!(context.log, "Defaulting to deposit contract genesis");
|
||||||
|
|
||||||
|
ClientGenesis::DepositContract
|
||||||
|
} else if chain_exists {
|
||||||
|
ClientGenesis::Resume
|
||||||
|
} else {
|
||||||
|
client_genesis
|
||||||
|
};
|
||||||
|
|
||||||
let genesis_state_future: Box<dyn Future<Item = _, Error = _> + Send> =
|
let genesis_state_future: Box<dyn Future<Item = _, Error = _> + Send> =
|
||||||
match client_genesis {
|
match client_genesis {
|
||||||
ClientGenesis::Interop {
|
ClientGenesis::Interop {
|
||||||
|
@ -12,7 +12,7 @@ const TESTNET_SPEC_CONSTANTS: &str = "minimal";
|
|||||||
const DEFAULT_FREEZER_DB_DIR: &str = "freezer_db";
|
const DEFAULT_FREEZER_DB_DIR: &str = "freezer_db";
|
||||||
|
|
||||||
/// Defines how the client should initialize the `BeaconChain` and other components.
|
/// Defines how the client should initialize the `BeaconChain` and other components.
|
||||||
#[derive(Debug, Clone, Serialize, Deserialize)]
|
#[derive(PartialEq, Debug, Clone, Serialize, Deserialize)]
|
||||||
pub enum ClientGenesis {
|
pub enum ClientGenesis {
|
||||||
/// Reads the genesis state and other persisted data from the `Store`.
|
/// Reads the genesis state and other persisted data from the `Store`.
|
||||||
Resume,
|
Resume,
|
||||||
|
Loading…
Reference in New Issue
Block a user