From 02abf422df4502140b453b57401dba064c874022 Mon Sep 17 00:00:00 2001 From: Pankaj Garg Date: Fri, 14 Jun 2019 14:22:52 -0700 Subject: [PATCH] Serialize genesis block using bincode (#4687) * use mmap to read the genesis block, and deserialize --- Cargo.lock | 1 + multinode-demo/fullnode.sh | 2 +- sdk/Cargo.toml | 1 + sdk/src/genesis_block.rs | 22 ++++++++++++++++------ 4 files changed, 19 insertions(+), 7 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 9f838adc8..16c8080cc 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2690,6 +2690,7 @@ dependencies = [ "hex 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "itertools 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "memmap 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", "num-derive 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", "num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", diff --git a/multinode-demo/fullnode.sh b/multinode-demo/fullnode.sh index 7f604e343..5830dc6a4 100755 --- a/multinode-demo/fullnode.sh +++ b/multinode-demo/fullnode.sh @@ -386,7 +386,7 @@ if [[ -z $CI ]]; then # Skip in CI fi new_gensis_block() { - ! diff -q "$SOLANA_RSYNC_CONFIG_DIR"/ledger/genesis.json "$ledger_config_dir"/genesis.json >/dev/null 2>&1 + ! diff -q "$SOLANA_RSYNC_CONFIG_DIR"/ledger/genesis.bin "$ledger_config_dir"/genesis.bin >/dev/null 2>&1 } set -e diff --git a/sdk/Cargo.toml b/sdk/Cargo.toml index 861c46300..329fa50d9 100644 --- a/sdk/Cargo.toml +++ b/sdk/Cargo.toml @@ -18,6 +18,7 @@ generic-array = { version = "0.13.0", default-features = false, features = ["ser hex = "0.3.2" itertools = "0.8.0" log = "0.4.2" +memmap = "0.6.2" num-derive = "0.2" num-traits = "0.2" rand = "0.6.5" diff --git a/sdk/src/genesis_block.rs b/sdk/src/genesis_block.rs index 9c2cfc6cf..b3efb5ba5 100644 --- a/sdk/src/genesis_block.rs +++ b/sdk/src/genesis_block.rs @@ -9,7 +9,9 @@ use crate::pubkey::Pubkey; use crate::signature::{Keypair, KeypairUtil}; use crate::system_program; use crate::timing::{DEFAULT_SLOTS_PER_EPOCH, DEFAULT_TICKS_PER_SLOT}; -use std::fs::File; +use bincode::{deserialize, serialize}; +use memmap::Mmap; +use std::fs::{File, OpenOptions}; use std::io::Write; use std::path::Path; @@ -75,19 +77,27 @@ impl GenesisBlock { } pub fn load(ledger_path: &str) -> Result { - let file = File::open(&Path::new(ledger_path).join("genesis.json"))?; - let genesis_block = serde_json::from_reader(file)?; + let file = OpenOptions::new() + .read(true) + .open(&Path::new(ledger_path).join("genesis.bin")) + .expect("Unable to open genesis file"); + + //UNSAFE: Required to create a Mmap + let mem = unsafe { Mmap::map(&file).expect("failed to map the genesis file") }; + let genesis_block = deserialize(&mem) + .map_err(|err| std::io::Error::new(std::io::ErrorKind::Other, format!("{:?}", err)))?; Ok(genesis_block) } pub fn write(&self, ledger_path: &str) -> Result<(), std::io::Error> { - let serialized = serde_json::to_string(self)?; + let serialized = serialize(&self) + .map_err(|err| std::io::Error::new(std::io::ErrorKind::Other, format!("{:?}", err)))?; let dir = Path::new(ledger_path); std::fs::create_dir_all(&dir)?; - let mut file = File::create(&dir.join("genesis.json"))?; - file.write_all(&serialized.into_bytes()) + let mut file = File::create(&dir.join("genesis.bin"))?; + file.write_all(&serialized) } }