diff --git a/CHANGELOG.md b/CHANGELOG.md index 7dbd38c0309..12cecd497be 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,12 +8,20 @@ and this project adheres to [Semantic Versioning](http://semver.org/). Description of the upcoming release here. +### Added + +- [#1799](https://github.com/FuelLabs/fuel-core/pull/1799) Snapshot creation is now concurrent. + +### Changed + +- [#1812](https://github.com/FuelLabs/fuel-core/pull/1812): Follow-up PR to simplify the logic around parallel snapshot creation. + ## [Version 0.24.2] ### Changed #### Breaking -- [#1798](https://github.com/FuelLabs/fuel-core/pull/1798): add nonce to relayed transactions and also hash full messages in the inbox root. +- [#1798](https://github.com/FuelLabs/fuel-core/pull/1798): Add nonce to relayed transactions and also hash full messages in the inbox root. ### Fixed @@ -25,7 +33,6 @@ Description of the upcoming release here. ### Added -- [#1799](https://github.com/FuelLabs/fuel-core/pull/1799) Snapshot creation is now concurrent. - [#1786](https://github.com/FuelLabs/fuel-core/pull/1786): Regenesis now includes off-chain tables. - [#1716](https://github.com/FuelLabs/fuel-core/pull/1716): Added support of WASM state transition along with upgradable execution that works with native(std) and WASM(non-std) executors. The `fuel-core` now requires a `wasm32-unknown-unknown` target to build. - [#1770](https://github.com/FuelLabs/fuel-core/pull/1770): Add the new L1 event type for forced transactions. diff --git a/bin/fuel-core/src/cli/snapshot.rs b/bin/fuel-core/src/cli/snapshot.rs index ed6ca3c205c..f79fb424654 100644 --- a/bin/fuel-core/src/cli/snapshot.rs +++ b/bin/fuel-core/src/cli/snapshot.rs @@ -306,12 +306,9 @@ mod tests { builder.add(self.common.contract_balance); let height = self.common.block.value.header().height(); - builder.set_block_height(*height); - let da_height = self.common.block.value.header().application().da_height; - builder.set_da_block_height(da_height); - builder.build().unwrap() + builder.build(*height, da_height).unwrap() } fn read_from_snapshot(snapshot: SnapshotMetadata) -> Self { diff --git a/bin/fuel-core/src/main.rs b/bin/fuel-core/src/main.rs index f4f652d5b18..e7f5c817980 100644 --- a/bin/fuel-core/src/main.rs +++ b/bin/fuel-core/src/main.rs @@ -15,15 +15,3 @@ mod cli; async fn main() -> anyhow::Result<()> { cli::run_cli().await } - -#[cfg(test)] -mod tests { - // No other way to explain that the following deps are used in tests only when snapshots are activated - // (that is when rocksdb or rocksdb-production is available). - use fuel_core_storage as _; - use itertools as _; - use pretty_assertions as _; - use rand as _; - use serde as _; - use tempfile as _; -} diff --git a/crates/chain-config/src/config/state.rs b/crates/chain-config/src/config/state.rs index 0eded52e5db..9f20824d02a 100644 --- a/crates/chain-config/src/config/state.rs +++ b/crates/chain-config/src/config/state.rs @@ -93,29 +93,9 @@ pub struct StateConfigBuilder { contract_balance: Vec>, contract_code: Vec>, contract_utxo: Vec>, - block_height: Option, - da_block_height: Option, } impl StateConfigBuilder { - #[cfg(feature = "std")] - fn block_height(&self) -> Option { - self.block_height - } - - #[cfg(feature = "std")] - fn da_block_height(&self) -> Option { - self.da_block_height - } - - pub fn set_block_height(&mut self, block_height: BlockHeight) { - self.block_height = Some(block_height); - } - - pub fn set_da_block_height(&mut self, da_block_height: DaBlockHeight) { - self.da_block_height = Some(da_block_height); - } - pub fn merge(&mut self, builder: Self) -> &mut Self { self.coins.extend(builder.coins); self.messages.extend(builder.messages); @@ -124,19 +104,15 @@ impl StateConfigBuilder { self.contract_code.extend(builder.contract_code); self.contract_utxo.extend(builder.contract_utxo); - if let Some(block_height) = builder.block_height { - self.block_height = Some(block_height); - } - - if let Some(da_block_height) = builder.da_block_height { - self.da_block_height = Some(da_block_height); - } - self } #[cfg(feature = "std")] - pub fn build(self) -> anyhow::Result { + pub fn build( + self, + block_height: BlockHeight, + da_block_height: DaBlockHeight, + ) -> anyhow::Result { use std::collections::HashMap; let coins = self.coins.into_iter().map(|coin| coin.into()).collect(); @@ -220,14 +196,6 @@ impl StateConfigBuilder { }) .try_collect()?; - let block_height = self - .block_height - .ok_or_else(|| anyhow::anyhow!("Block height missing"))?; - - let da_block_height = self - .da_block_height - .ok_or_else(|| anyhow::anyhow!("Da block height missing"))?; - Ok(StateConfig { coins, messages, @@ -497,12 +465,9 @@ impl StateConfig { builder.add(contract_utxo); let block_height = reader.block_height(); - builder.set_block_height(block_height); - let da_block_height = reader.da_block_height(); - builder.set_da_block_height(da_block_height); - builder.build() + builder.build(block_height, da_block_height) } #[cfg(feature = "test-helpers")] @@ -595,7 +560,6 @@ mod tests { Randomize, }; - use fuel_core_types::fuel_types::ChainId; use rand::{ rngs::StdRng, SeedableRng, @@ -635,48 +599,6 @@ mod tests { SnapshotWriter::json(path) } - #[test_case::test_case(given_parquet_writer)] - #[test_case::test_case(given_json_writer)] - fn fragment_wont_unset_block_heights( - writer: impl Fn(&Path) -> SnapshotWriter + Copy, - ) { - // given - let temp_dir = tempfile::tempdir().unwrap(); - let create_writer = || writer(temp_dir.path()); - let original_block_height = BlockHeight::from(10); - let original_da_block_height = DaBlockHeight(11); - let block_height_fragment = { - let mut height_writer = create_writer(); - height_writer - .write_block_data(original_block_height, original_da_block_height) - .unwrap(); - height_writer.partial_close().unwrap() - }; - let no_block_height_present_fragment = create_writer().partial_close().unwrap(); - let chain_config_fragment = { - let mut chain_config_writer = create_writer(); - chain_config_writer.write_chain_config(&ChainConfig::local_testnet()); - chain_config_writer.partial_close().unwrap() - }; - - // when - let snapshot = [ - block_height_fragment, - no_block_height_present_fragment, - chain_config_fragment, - ] - .into_iter() - .reduce(|a, b| a.merge(b).unwrap()) - .unwrap() - .finalize() - .unwrap(); - - // then - let reader = SnapshotReader::open(snapshot).unwrap(); - assert_eq!(reader.block_height(), original_block_height); - assert_eq!(reader.da_block_height(), original_da_block_height); - } - #[test] fn json_roundtrip_coins_and_messages() { let writer = |temp_dir: &Path| SnapshotWriter::json(temp_dir); @@ -697,16 +619,17 @@ mod tests { .collect_vec(); let tmp_dir = tempfile::tempdir().unwrap(); - let mut writer = SnapshotWriter::json(tmp_dir.path()); + let writer = SnapshotWriter::json(tmp_dir.path()); let state = StateConfig { contracts, ..Default::default() }; - writer.write_chain_config(&ChainConfig::local_testnet()); // when - let snapshot = writer.write_state_config(state.clone()).unwrap(); + let snapshot = writer + .write_state_config(state.clone(), &ChainConfig::local_testnet()) + .unwrap(); // then let reader = SnapshotReader::open(snapshot).unwrap(); @@ -741,15 +664,6 @@ mod tests { } let chain_config = ChainConfig::local_testnet(); - let chain_and_height_fragment = { - let mut writer = create_writer(); - writer - .write_block_data(state_config.block_height, state_config.da_block_height) - .unwrap(); - - writer.write_chain_config(&chain_config); - writer.partial_close().unwrap() - }; let fragments = write_in_fragments!( Coins, Messages, @@ -762,10 +676,13 @@ mod tests { // when let snapshot = fragments .into_iter() - .chain([chain_and_height_fragment]) .reduce(|fragment, next_fragment| fragment.merge(next_fragment).unwrap()) .unwrap() - .finalize() + .finalize( + state_config.block_height, + state_config.da_block_height, + &chain_config, + ) .unwrap(); // then @@ -776,102 +693,6 @@ mod tests { assert_eq!(reader.chain_config(), &chain_config); } - #[test_case::test_case(given_parquet_writer)] - #[test_case::test_case(given_json_writer)] - fn chain_config_can_be_overridden_with_new_fragments( - writer: impl Fn(&Path) -> SnapshotWriter + Copy, - ) { - // given - let temp_dir = tempfile::tempdir().unwrap(); - let create_writer = || writer(temp_dir.path()); - - let original_chain_config = ChainConfig::local_testnet(); - let original_chain_config_fragment = { - let mut chain_config_writer = create_writer(); - chain_config_writer.write_chain_config(&original_chain_config); - chain_config_writer.partial_close().unwrap() - }; - let chain_config_override = { - let mut chain_config = ChainConfig::local_testnet(); - chain_config - .consensus_parameters - .set_chain_id(ChainId::new(u64::MAX)); - chain_config - }; - let chain_config_override_fragment = { - let mut chain_config_writer = create_writer(); - chain_config_writer.write_chain_config(&chain_config_override); - chain_config_writer.partial_close().unwrap() - }; - let block_height_fragment = { - let mut height_writer = create_writer(); - height_writer - .write_block_data(BlockHeight::from(10), DaBlockHeight(11)) - .unwrap(); - height_writer.partial_close().unwrap() - }; - - // when - let snapshot = [ - block_height_fragment, - original_chain_config_fragment, - chain_config_override_fragment, - ] - .into_iter() - .reduce(|a, b| a.merge(b).unwrap()) - .unwrap() - .finalize() - .unwrap(); - - // then - let reader = SnapshotReader::open(snapshot).unwrap(); - assert_eq!(reader.chain_config(), &chain_config_override); - } - - #[test_case::test_case(given_parquet_writer)] - #[test_case::test_case(given_json_writer)] - fn empty_fragments_wont_unset_chain_config( - writer: impl Fn(&Path) -> SnapshotWriter + Copy, - ) { - // given - let temp_dir = tempfile::tempdir().unwrap(); - let create_writer = || writer(temp_dir.path()); - let original_chain_config = ChainConfig::local_testnet(); - let chain_config_fragment = { - let mut chain_config_writer = create_writer(); - chain_config_writer.write_chain_config(&original_chain_config); - chain_config_writer.partial_close().unwrap() - }; - - let block_height_fragment = { - let mut height_writer = create_writer(); - height_writer - .write_block_data(BlockHeight::from(10), DaBlockHeight(11)) - .unwrap(); - height_writer.partial_close().unwrap() - }; - let no_chain_config_present_fragment = create_writer().partial_close().unwrap(); - - // when - let snapshot = [ - chain_config_fragment, - no_chain_config_present_fragment, - block_height_fragment, - ] - .into_iter() - .reduce(|a, b| a.merge(b).unwrap()) - .unwrap() - .finalize() - .unwrap(); - - // then - let read_chain_config = SnapshotReader::open(snapshot) - .unwrap() - .chain_config() - .clone(); - assert_eq!(read_chain_config, original_chain_config); - } - #[test_case::test_case(given_parquet_writer)] #[test_case::test_case(given_json_writer)] fn roundtrip_block_heights(writer: impl FnOnce(&Path) -> SnapshotWriter) { @@ -879,14 +700,12 @@ mod tests { let temp_dir = tempfile::tempdir().unwrap(); let block_height = 13u32.into(); let da_block_height = 14u64.into(); - let mut writer = writer(temp_dir.path()); - writer.write_chain_config(&ChainConfig::local_testnet()); + let writer = writer(temp_dir.path()); // when - writer - .write_block_data(block_height, da_block_height) + let snapshot = writer + .close(block_height, da_block_height, &ChainConfig::local_testnet()) .unwrap(); - let snapshot = writer.close().unwrap(); // then let reader = SnapshotReader::open(snapshot).unwrap(); @@ -898,58 +717,6 @@ mod tests { pretty_assertions::assert_eq!(da_block_height, da_block_height_decoded); } - #[test_case::test_case(given_parquet_writer)] - #[test_case::test_case(given_json_writer)] - fn fragment_can_override_block_height( - writer: impl Fn(&Path) -> SnapshotWriter + Copy, - ) { - // given - let temp_dir = tempfile::tempdir().unwrap(); - let create_writer = || writer(temp_dir.path()); - let original_block_height = BlockHeight::from(10); - let original_da_block_height = DaBlockHeight(11); - let block_height_fragment = { - let mut height_writer = create_writer(); - height_writer - .write_block_data(original_block_height, original_da_block_height) - .unwrap(); - height_writer.partial_close().unwrap() - }; - - let block_height_override = BlockHeight::from(20); - let da_block_height_override = DaBlockHeight(21); - let block_height_override_fragment = { - let mut height_writer = create_writer(); - height_writer - .write_block_data(block_height_override, da_block_height_override) - .unwrap(); - height_writer.partial_close().unwrap() - }; - - let chain_config_fragment = { - let mut chain_config_writer = create_writer(); - chain_config_writer.write_chain_config(&ChainConfig::local_testnet()); - chain_config_writer.partial_close().unwrap() - }; - - // when - let snapshot = [ - chain_config_fragment, - block_height_fragment, - block_height_override_fragment, - ] - .into_iter() - .reduce(|a, b| a.merge(b).unwrap()) - .unwrap() - .finalize() - .unwrap(); - - // then - let reader = SnapshotReader::open(snapshot).unwrap(); - pretty_assertions::assert_eq!(block_height_override, reader.block_height()); - pretty_assertions::assert_eq!(da_block_height_override, reader.da_block_height()); - } - fn assert_roundtrip( writer: impl FnOnce(&Path) -> SnapshotWriter, reader: impl FnOnce(SnapshotMetadata, usize) -> SnapshotReader, @@ -978,17 +745,15 @@ mod tests { let mut group_generator = GroupGenerator::new(StdRng::seed_from_u64(0), group_size, num_groups); let mut snapshot_writer = writer(temp_dir.path()); - snapshot_writer.write_chain_config(&ChainConfig::local_testnet()); // when let expected_groups = group_generator .write_groups::(&mut snapshot_writer) .into_iter() .collect_vec(); - snapshot_writer - .write_block_data(10.into(), DaBlockHeight(11)) + let snapshot = snapshot_writer + .close(10.into(), DaBlockHeight(11), &ChainConfig::local_testnet()) .unwrap(); - let snapshot = snapshot_writer.close().unwrap(); let actual_groups = reader(snapshot, group_size).read().unwrap().collect_vec(); diff --git a/crates/chain-config/src/config/state/writer.rs b/crates/chain-config/src/config/state/writer.rs index 34a6dc41053..dc0ebb022db 100644 --- a/crates/chain-config/src/config/state/writer.rs +++ b/crates/chain-config/src/config/state/writer.rs @@ -24,14 +24,11 @@ enum EncoderType { Parquet { compression: ZstdCompressionLevel, table_encoders: TableEncoders, - block_height: Option, - da_block_height: Option, }, } pub struct SnapshotWriter { dir: PathBuf, - chain_config: Option, encoder: EncoderType, } @@ -163,8 +160,7 @@ enum FragmentData { #[cfg(feature = "parquet")] Parquet { tables: std::collections::HashMap, - block_height: Option, - da_block_height: Option, + compression: ZstdCompressionLevel, }, } impl FragmentData { @@ -183,22 +179,15 @@ impl FragmentData { ( FragmentData::Parquet { tables, - block_height, - da_block_height, + compression, }, FragmentData::Parquet { tables: their_tables, - block_height: their_block_height, - da_block_height: their_da_block_height, + compression: their_compression, }, ) => { tables.extend(their_tables); - if their_block_height.is_some() { - *block_height = their_block_height; - } - if their_da_block_height.is_some() { - *da_block_height = their_da_block_height; - } + anyhow::ensure!(*compression == their_compression, "Fragments use different compressions.") } #[cfg(feature="parquet")] (a,b) => anyhow::bail!("Fragments don't have the same encoding and cannot be merged. Fragments: {a:?} and {b:?}"), @@ -210,43 +199,25 @@ impl FragmentData { #[derive(Debug, Clone)] pub struct SnapshotFragment { - chain_config: Option, dir: PathBuf, data: FragmentData, } impl SnapshotFragment { pub fn merge(mut self, fragment: Self) -> anyhow::Result { - if let Some(chain_config) = fragment.chain_config { - self.chain_config = Some(chain_config); - } - self.data = self.data.merge(fragment.data)?; Ok(self) } - pub fn finalize(self) -> anyhow::Result { - fn verify_block_heights_available( - block_height: Option, - da_block_height: Option, - ) -> anyhow::Result<(Height, DaHeight)> { - match (block_height, da_block_height) { - (Some(block_height), Some(da_block_height)) => { - Ok((block_height, da_block_height)) - } - _ => { - anyhow::bail!("Snapshot must contain the block heights. Write them before closing the writer.") - } - } - } - + pub fn finalize( + self, + block_height: BlockHeight, + da_block_height: DaBlockHeight, + chain_config: &ChainConfig, + ) -> anyhow::Result { let table_encoding = match self.data { FragmentData::Json { builder } => { - verify_block_heights_available( - builder.block_height(), - builder.da_block_height(), - )?; - let state_config = builder.build()?; + let state_config = builder.build(block_height, da_block_height)?; std::fs::create_dir_all(&self.dir)?; let state_file_path = self.dir.join("state_config.json"); let file = std::fs::File::create(&state_file_path)?; @@ -259,21 +230,33 @@ impl SnapshotFragment { #[cfg(feature = "parquet")] FragmentData::Parquet { tables, - block_height, - da_block_height, + compression, } => { - let (block_height, da_block_height) = - verify_block_heights_available(block_height, da_block_height)?; - TableEncoding::Parquet { - tables, + let block_height_file = self.dir.join("block_height.parquet"); + SnapshotWriter::write_single_el_parquet( + &block_height_file, block_height, + compression, + )?; + + let da_block_height_file = self.dir.join("da_block_height.parquet"); + SnapshotWriter::write_single_el_parquet( + &da_block_height_file, da_block_height, + compression, + )?; + + TableEncoding::Parquet { + tables, + block_height: block_height_file, + da_block_height: da_block_height_file, } } }; + SnapshotWriter::write_chain_config_and_metadata( &self.dir, - self.chain_config.as_ref(), + chain_config, table_encoding, ) } @@ -287,7 +270,6 @@ impl SnapshotWriter { builder: StateConfigBuilder::default(), }, dir: dir.into(), - chain_config: None, } } @@ -302,11 +284,8 @@ impl SnapshotWriter { encoder: EncoderType::Parquet { table_encoders: TableEncoders::new(dir.clone(), compression_level), compression: compression_level, - block_height: None, - da_block_height: None, }, dir, - chain_config: None, }) } @@ -314,6 +293,7 @@ impl SnapshotWriter { pub fn write_state_config( mut self, state_config: crate::StateConfig, + chain_config: &ChainConfig, ) -> anyhow::Result { use fuel_core_storage::tables::{ Coins, @@ -332,12 +312,11 @@ impl SnapshotWriter { self.write::(state_config.as_table())?; self.write::(state_config.as_table())?; self.write::(state_config.as_table())?; - self.write_block_data(state_config.block_height, state_config.da_block_height)?; - self.close() - } - - pub fn write_chain_config(&mut self, chain_config: &ChainConfig) { - self.chain_config = Some(chain_config.clone()); + self.close( + state_config.block_height, + state_config.da_block_height, + chain_config, + ) } pub fn write(&mut self, elements: Vec>) -> anyhow::Result<()> @@ -358,37 +337,6 @@ impl SnapshotWriter { } } - pub fn write_block_data( - &mut self, - height: BlockHeight, - da_height: DaBlockHeight, - ) -> anyhow::Result<()> { - match &mut self.encoder { - EncoderType::Json { builder, .. } => { - builder.set_block_height(height); - builder.set_da_block_height(da_height); - Ok(()) - } - #[cfg(feature = "parquet")] - EncoderType::Parquet { - block_height, - da_block_height, - compression, - .. - } => { - let file = self.dir.join("block_height.parquet"); - Self::write_single_el_parquet(&file, height, *compression)?; - *block_height = Some(file); - - let file = self.dir.join("da_block_height.parquet"); - Self::write_single_el_parquet(&file, da_height, *compression)?; - *da_block_height = Some(file); - - Ok(()) - } - } - } - #[cfg(feature = "parquet")] fn write_single_el_parquet( path: &std::path::Path, @@ -403,21 +351,23 @@ impl SnapshotWriter { encoder.close() } - pub fn close(self) -> anyhow::Result { - self.partial_close()?.finalize() + pub fn close( + self, + block_height: BlockHeight, + da_block_height: DaBlockHeight, + chain_config: &ChainConfig, + ) -> anyhow::Result { + self.partial_close()? + .finalize(block_height, da_block_height, chain_config) } fn write_chain_config_and_metadata( dir: &std::path::Path, - chain_config: Option<&ChainConfig>, + chain_config: &ChainConfig, table_encoding: TableEncoding, ) -> anyhow::Result { let chain_config_path = dir.join(Self::CHAIN_CONFIG_FILENAME); - if let Some(chain_config) = chain_config { - chain_config.write(&chain_config_path)?; - } else { - anyhow::bail!("Snapshot isn't valid without a chain config. Write it before closing the writer.") - } + chain_config.write(&chain_config_path)?; let metadata = SnapshotMetadata { chain_config: chain_config_path, @@ -433,20 +383,17 @@ impl SnapshotWriter { #[cfg(feature = "parquet")] EncoderType::Parquet { table_encoders, - block_height, - da_block_height, + compression, .. } => { let tables = table_encoders.close()?; FragmentData::Parquet { tables, - block_height, - da_block_height, + compression, } } }; let snapshot_fragment = SnapshotFragment { - chain_config: self.chain_config, dir: self.dir, data, }; @@ -583,14 +530,12 @@ mod tests { let mut writer = SnapshotWriter::parquet(dir.path(), ZstdCompressionLevel::Uncompressed) .unwrap(); - writer.write_chain_config(&ChainConfig::local_testnet()); - writer - .write_block_data(10.into(), DaBlockHeight(11)) - .unwrap(); // when writer.write::(vec![]).unwrap(); - let snapshot = writer.close().unwrap(); + let snapshot = writer + .close(10.into(), DaBlockHeight(11), &ChainConfig::local_testnet()) + .unwrap(); // then assert!(snapshot.chain_config.exists()); @@ -626,13 +571,14 @@ mod tests { // given use crate::Randomize; let dir = tempfile::tempdir().unwrap(); - let mut writer = SnapshotWriter::json(dir.path()); + let writer = SnapshotWriter::json(dir.path()); let mut rng = StdRng::from_seed([0; 32]); let state = StateConfig::randomize(&mut rng); - writer.write_chain_config(&ChainConfig::local_testnet()); // when - let snapshot = writer.write_state_config(state).unwrap(); + let snapshot = writer + .write_state_config(state, &ChainConfig::local_testnet()) + .unwrap(); // then let TableEncoding::Json { filepath } = snapshot.table_encoding else { @@ -651,26 +597,6 @@ mod tests { SnapshotWriter::json(path) } - #[test_case::test_case(given_parquet_writer)] - #[test_case::test_case(given_json_writer)] - fn cannot_close_without_chain_config( - writer: impl Fn(&Path) -> SnapshotWriter + Copy, - ) { - // given - let dir = tempfile::tempdir().unwrap(); - let mut writer = writer(dir.path()); - writer - .write_block_data(10.into(), DaBlockHeight(10)) - .unwrap(); - - // when - let result = writer.close(); - - // then - let err = result.unwrap_err(); - assert_eq!(err.to_string(), "Snapshot isn't valid without a chain config. Write it before closing the writer."); - } - #[test_case::test_case(given_parquet_writer)] #[test_case::test_case(given_json_writer)] fn can_partially_close_without_chain_and_block_height( @@ -687,24 +613,6 @@ mod tests { assert!(result.is_ok()); } - #[test_case::test_case(given_parquet_writer)] - #[test_case::test_case(given_json_writer)] - fn cannot_close_without_block_heights( - writer: impl Fn(&Path) -> SnapshotWriter + Copy, - ) { - // given - let dir = tempfile::tempdir().unwrap(); - let mut writer = writer(dir.path()); - writer.write_chain_config(&super::ChainConfig::local_testnet()); - - // when - let result = writer.close(); - - // then - let err = result.unwrap_err(); - assert_eq!(err.to_string(), "Snapshot must contain the block heights. Write them before closing the writer."); - } - #[test] fn merging_json_and_parquet_fragments_fails() { // given diff --git a/crates/fuel-core/src/combined_database.rs b/crates/fuel-core/src/combined_database.rs index 3d1852faeb1..788dee707b7 100644 --- a/crates/fuel-core/src/combined_database.rs +++ b/crates/fuel-core/src/combined_database.rs @@ -175,10 +175,8 @@ impl CombinedDatabase { ); let block = self.on_chain().latest_block()?; - builder.set_block_height(*block.header().height()); - builder.set_da_block_height(block.header().da_height); - - let state_config = builder.build()?; + let state_config = + builder.build(*block.header().height(), block.header().da_height)?; Ok(state_config) } diff --git a/crates/fuel-core/src/database/contracts.rs b/crates/fuel-core/src/database/contracts.rs index 50141382638..c99ea9300ba 100644 --- a/crates/fuel-core/src/database/contracts.rs +++ b/crates/fuel-core/src/database/contracts.rs @@ -92,14 +92,6 @@ impl Database { ) .map_ok(|(key, value)| TableEntry { key, value }) } - - pub fn filter_contract_states( - &self, - contract_id: ContractId, - ) -> impl Iterator>> + '_ { - self.iter_all_by_prefix::(Some(contract_id)) - .map_ok(|(key, value)| TableEntry { key, value }) - } } #[cfg(test)] diff --git a/crates/fuel-core/src/service/genesis/exporter.rs b/crates/fuel-core/src/service/genesis/exporter.rs index 2391576dd77..04054869c75 100644 --- a/crates/fuel-core/src/service/genesis/exporter.rs +++ b/crates/fuel-core/src/service/genesis/exporter.rs @@ -123,25 +123,20 @@ where } async fn finalize(self) -> anyhow::Result { - let remaining_fragment = self.write_block_and_chain_config()?; + let writer = self.create_writer()?; + let block = self.db.on_chain().latest_block()?; + let block_height = *block.header().height(); + let da_block_height = block.header().da_height; + + let writer_fragment = writer.partial_close()?; self.task_manager .wait() .await? .into_iter() - .try_fold(remaining_fragment, |fragment, next_fragment| { + .try_fold(writer_fragment, |fragment, next_fragment| { fragment.merge(next_fragment) })? - .finalize() - } - - fn write_block_and_chain_config(&self) -> anyhow::Result { - let mut writer = self.create_writer()?; - writer.write_chain_config(&self.prev_chain_config); - - let block = self.db.on_chain().latest_block()?; - writer.write_block_data(*block.header().height(), block.header().da_height)?; - - writer.partial_close() + .finalize(block_height, da_block_height, &self.prev_chain_config) } fn create_writer(&self) -> anyhow::Result { diff --git a/tests/tests/deployment.rs b/tests/tests/deployment.rs index 944b913bf26..15cac95a5a8 100644 --- a/tests/tests/deployment.rs +++ b/tests/tests/deployment.rs @@ -26,9 +26,8 @@ fn test_deployment_chainconfig(path: impl AsRef) -> anyhow::Result<()> { .set_gas_costs(benchmark_gas_costs); let temp_dir = tempfile::tempdir()?; - let mut writer = SnapshotWriter::json(temp_dir.path()); - writer.write_chain_config(&chain_config); - let generated_snapshot = writer.write_state_config(state_config)?; + let writer = SnapshotWriter::json(temp_dir.path()); + let generated_snapshot = writer.write_state_config(state_config, &chain_config)?; let chain_config = std::fs::read_to_string(generated_snapshot.chain_config)? .trim()