diff --git a/bench/src/speed/mdbx.rs b/bench/src/speed/mdbx.rs index f233fdd..c38fe41 100644 --- a/bench/src/speed/mdbx.rs +++ b/bench/src/speed/mdbx.rs @@ -1,4 +1,4 @@ -use std::{fs, path::Path}; +use std::{fs, path::Path, sync::OnceLock}; use log::debug; use parking_lot::RwLock; @@ -12,7 +12,7 @@ use rayon; use rayon::iter::*; use reth_libmdbx::{Environment, Geometry, ObjectLength, WriteFlags}; -static mut MDBX_ENV: Option = None; +static MDBX_ENV: OnceLock = OnceLock::new(); pub fn init(mdbx_dir: &str) { // init MDBX @@ -28,37 +28,23 @@ pub fn init(mdbx_dir: &str) { .open(Path::new(mdbx_dir)) .unwrap(); debug!("MDBX: env.map_size={}", mdbx_env.info().unwrap().map_size()); - unsafe { - MDBX_ENV = Some(mdbx_env); - } + MDBX_ENV.set(mdbx_env).unwrap(); } pub fn create_kv(_: i64, task_list: Vec>>) { - let mut mdbx_env = unsafe { MDBX_ENV.take().unwrap() }; - mdbx_create_kv(&mut mdbx_env, &task_list); - unsafe { - MDBX_ENV = Some(mdbx_env); - } + mdbx_create_kv(MDBX_ENV.get().unwrap(), &task_list); } pub fn update_kv(_: i64, task_list: Vec>>) { - let mut mdbx_env = unsafe { MDBX_ENV.take().unwrap() }; - mdbx_update_kv(&mut mdbx_env, &task_list); - unsafe { - MDBX_ENV = Some(mdbx_env); - } + mdbx_update_kv(MDBX_ENV.get().unwrap(), &task_list); } pub fn delete_kv(_: i64, task_list: Vec>>) { - let mut mdbx_env = unsafe { MDBX_ENV.take().unwrap() }; - mdbx_update_kv(&mut mdbx_env, &task_list); - unsafe { - MDBX_ENV = Some(mdbx_env); - } + mdbx_update_kv(MDBX_ENV.get().unwrap(), &task_list); } pub fn read_kv(key_list: &Vec<[u8; 52]>) { - let mdbx_env = unsafe { MDBX_ENV.take().unwrap() }; + let mdbx_env = MDBX_ENV.get().unwrap(); let txn = &mdbx_env.begin_ro_txn().unwrap(); let db = &txn.open_db(None).unwrap(); rayon::scope(|s| { @@ -69,13 +55,10 @@ pub fn read_kv(key_list: &Vec<[u8; 52]>) { }); } }); - unsafe { - MDBX_ENV = Some(mdbx_env); - } } // =========== -fn mdbx_create_kv(env: &mut Environment, task_list: &Vec>>) { +fn mdbx_create_kv(env: &Environment, task_list: &Vec>>) { let txn = env.begin_rw_txn().unwrap(); let db = txn.open_db(None).unwrap(); for item in task_list.iter() { @@ -93,7 +76,7 @@ fn mdbx_create_kv(env: &mut Environment, task_list: &Vec>>) { +fn mdbx_update_kv(env: &Environment, task_list: &Vec>>) { std::thread::scope(|s| { let handler = s.spawn(|| { let txn = env.begin_rw_txn().unwrap(); diff --git a/bench/src/speed/rocksdb.rs b/bench/src/speed/rocksdb.rs index 63190e7..3ef521f 100644 --- a/bench/src/speed/rocksdb.rs +++ b/bench/src/speed/rocksdb.rs @@ -1,4 +1,4 @@ -use std::{fs, path::Path}; +use std::{fs, path::Path, sync::OnceLock}; use parking_lot::RwLock; use qmdb::{ @@ -10,6 +10,7 @@ use qmdb::{ use rayon; use rocksdb::{Options, ReadOptions, WriteBatch, WriteBatchWithTransaction, WriteOptions, DB}; +#[derive(Debug)] struct RocksDB { db: DB, } @@ -81,7 +82,7 @@ impl RocksDB { // self.db.write(batch.batch).unwrap(); // } - fn batch_write_sync(&mut self, batch: RocksBatch) { + fn batch_write_sync(&self, batch: RocksBatch) { let mut write_options = WriteOptions::default(); write_options.set_sync(true); self.db.write_opt(batch.batch, &write_options).unwrap(); @@ -110,61 +111,43 @@ impl RocksBatch { } } -static mut RKS_DB: Option = None; +static RKS_DB: OnceLock = OnceLock::new(); pub fn init(rocksdb_dir: &str) { if Path::new(rocksdb_dir).exists() { fs::remove_dir_all(rocksdb_dir).unwrap(); } let rks_db = RocksDB::new("ROCKS", rocksdb_dir); - unsafe { - RKS_DB = Some(rks_db); - } + RKS_DB.set(rks_db).unwrap(); } pub fn create_kv(_: i64, task_list: Vec>>) { - let mut rks_db = unsafe { RKS_DB.take().unwrap() }; - rocksdb_create_kv(&mut rks_db, &task_list); - unsafe { - RKS_DB = Some(rks_db); - } + rocksdb_create_kv(RKS_DB.get().unwrap(), &task_list); } pub fn update_kv(_: i64, task_list: Vec>>) { - let mut rks_db = unsafe { RKS_DB.take().unwrap() }; - rocksdb_update_kv(&mut rks_db, &task_list); - unsafe { - RKS_DB = Some(rks_db); - } + rocksdb_update_kv(RKS_DB.get().unwrap(), &task_list); } pub fn delete_kv(_: i64, task_list: Vec>>) { - let mut rks_db = unsafe { RKS_DB.take().unwrap() }; - rocksdb_update_kv(&mut rks_db, &task_list); - unsafe { - RKS_DB = Some(rks_db); - } + rocksdb_update_kv(RKS_DB.get().unwrap(), &task_list); } pub fn read_kv(key_list: &Vec<[u8; 52]>) { - let rks_db = unsafe { RKS_DB.take().unwrap() }; - let _rks_db = &rks_db; + let rks_db = RKS_DB.get().unwrap(); rayon::scope(|s| { for k in key_list.iter() { let _ = hasher::hash(&k[..]); s.spawn(move |_| { - _rks_db.get(k).unwrap(); + rks_db.get(k).unwrap(); }); } }); - unsafe { - RKS_DB = Some(rks_db); - } } // =========== -fn rocksdb_create_kv(rks_db: &mut RocksDB, task_list: &Vec>>) { +fn rocksdb_create_kv(rks_db: &RocksDB, task_list: &Vec>>) { let mut batch = RocksBatch::new(); for item in task_list.iter() { let task_opt = item.read(); @@ -181,7 +164,7 @@ fn rocksdb_create_kv(rks_db: &mut RocksDB, task_list: &Vec>>) { +fn rocksdb_update_kv(rks_db: &RocksDB, task_list: &Vec>>) { const N: usize = 10000; let mut keys = Vec::with_capacity(N); let mut batch_out = RocksBatch::new();