From f921f8758cf2084f76bce9957d44bc1cf14e9fc1 Mon Sep 17 00:00:00 2001 From: ardocrat Date: Fri, 15 May 2026 10:52:09 +0300 Subject: [PATCH] lmdb: use atomic for resize and resize checking flags --- store/src/lmdb.rs | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/store/src/lmdb.rs b/store/src/lmdb.rs index 6d0b9405..ea07c1c4 100644 --- a/store/src/lmdb.rs +++ b/store/src/lmdb.rs @@ -18,6 +18,7 @@ use heed::types::Bytes; use heed::{Database, Env, EnvOpenOptions, RoTxn, RwTxn, WithoutTls}; use std::collections::HashMap; use std::path::Path; +use std::sync::atomic::{AtomicBool, Ordering}; use std::sync::{Arc, OnceLock}; use std::time::Duration; use std::{fs, thread}; @@ -96,8 +97,8 @@ static ENV_MAP: OnceLock>> = OnceLock::new(); struct EnvState { env: Env, open_txs_count: u32, - resizing: bool, - resize_checking: bool, + resizing: AtomicBool, + resize_checking: AtomicBool, stores_count: u32, } @@ -194,8 +195,8 @@ impl Store { EnvState { env, open_txs_count: 0, - resizing: false, - resize_checking: false, + resizing: AtomicBool::new(false), + resize_checking: AtomicBool::new(false), stores_count: 1, }, ); @@ -310,6 +311,7 @@ impl Store { .get(&self.env_path) .unwrap() .resize_checking + .load(Ordering::Relaxed) } /// Set flag if requirement for environment resize is checking. @@ -320,7 +322,8 @@ impl Store { .write() .get_mut(&self.env_path) .unwrap() - .resize_checking = resize_checking; + .resize_checking + .store(resize_checking, Ordering::Relaxed); } /// Wait while database is resizing. @@ -333,6 +336,7 @@ impl Store { .get(&self.env_path) .unwrap() .resizing + .load(Ordering::Relaxed) { break; } @@ -377,7 +381,8 @@ impl Store { .write() .get_mut(&env_path) .unwrap() - .resizing = true; + .resizing + .store(true, Ordering::Relaxed); // Wait to make sure there are no more active txs left. thread::sleep(Duration::from_millis(1000)); break; @@ -393,8 +398,8 @@ impl Store { let mut w_env_map = ENV_MAP.get().unwrap().write(); let env_state = w_env_map.get_mut(&env_path).unwrap(); - env_state.resizing = false; - env_state.resize_checking = false; + env_state.resizing.store(false, Ordering::Relaxed); + env_state.resize_checking.store(false, Ordering::Relaxed); }); return; } else { @@ -402,14 +407,14 @@ impl Store { let env_state = w_env_map.get_mut(&env_path).unwrap(); debug!("Start immediate resizing DB {}", env_path); - env_state.resizing = true; + env_state.resizing.store(true, Ordering::Relaxed); unsafe { match env.resize(new_size) { Ok(_) => debug!("End resizing DB {}", env_path), Err(e) => error!("Resize DB {} error: {:?}", env_path, e), } } - env_state.resizing = false; + env_state.resizing.store(false, Ordering::Relaxed); } }