diff --git a/beacon_node/beacon_chain/src/schema_change/migration_schema_v21.rs b/beacon_node/beacon_chain/src/schema_change/migration_schema_v21.rs index 0485852551..4042d32820 100644 --- a/beacon_node/beacon_chain/src/schema_change/migration_schema_v21.rs +++ b/beacon_node/beacon_chain/src/schema_change/migration_schema_v21.rs @@ -1,20 +1,22 @@ use crate::beacon_chain::BeaconChainTypes; use crate::validator_pubkey_cache::DatabasePubkey; -use slog::{debug, Logger}; -use ssz::Decode; +use slog::{info, Logger}; +use ssz::{Decode, Encode}; use std::sync::Arc; -use store::{DBColumn, Error, HotColdDB, KeyValueStore, KeyValueStoreOp, StoreItem}; +use store::{ + get_key_for_col, DBColumn, Error, HotColdDB, KeyValueStore, KeyValueStoreOp, StoreItem, +}; use types::{Hash256, PublicKey}; -const LOG_EVERY: usize = 100_000; +const LOG_EVERY: usize = 200_000; pub fn upgrade_to_v21( db: Arc>, log: Logger, ) -> Result, Error> { - let mut ops = vec![]; + info!(log, "Upgrading from v20 to v21"); - debug!(log, "Migrating from v20 to v21"); + let mut ops = vec![]; // Iterate through all pubkeys and decompress them. for (i, res) in db @@ -24,26 +26,58 @@ pub fn upgrade_to_v21( { let (key, value) = res?; let pubkey = PublicKey::from_ssz_bytes(&value)?; - let compressed = DatabasePubkey::from_pubkey(&pubkey); - ops.push(compressed.as_kv_store_op(key)); + let decompressed = DatabasePubkey::from_pubkey(&pubkey); + ops.push(decompressed.as_kv_store_op(key)); if i > 0 && i % LOG_EVERY == 0 { - debug!( + info!( log, "Public key decompression in progress"; "keys_decompressed" => i ); } } - debug!(log, "Public key decompression complete"); + info!(log, "Public key decompression complete"); Ok(ops) } pub fn downgrade_from_v21( - _db: Arc>, - _log: Logger, + db: Arc>, + log: Logger, ) -> Result, Error> { - // TODO(sproul): impl downgrade - Ok(vec![]) + info!(log, "Downgrading from v21 to v20"); + + let mut ops = vec![]; + + // Iterate through all pubkeys and recompress them. + for (i, res) in db + .hot_db + .iter_column::(DBColumn::PubkeyCache) + .enumerate() + { + let (key, value) = res?; + let decompressed = DatabasePubkey::from_ssz_bytes(&value)?; + let (_, pubkey_bytes) = decompressed.as_pubkey().map_err(|e| Error::DBError { + message: format!("{e:?}"), + })?; + + let db_key = get_key_for_col(DBColumn::PubkeyCache.into(), key.as_bytes()); + ops.push(KeyValueStoreOp::PutKeyValue( + db_key, + pubkey_bytes.as_ssz_bytes(), + )); + + if i > 0 && i % LOG_EVERY == 0 { + info!( + log, + "Public key compression in progress"; + "keys_compressed" => i + ); + } + } + + info!(log, "Public key compression complete"); + + Ok(ops) }