From 24592b7036c8f82bcdcc22556e054c5290a2b02e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Renault?= Date: Sun, 26 Apr 2026 18:30:46 +0200 Subject: [PATCH] Use the internal env from txn instead of storing it --- heed/src/envs/mod.rs | 1 - heed/src/mdb/lmdb_ffi.rs | 4 ++-- heed/src/txn.rs | 41 ++++++++++++---------------------------- 3 files changed, 14 insertions(+), 32 deletions(-) diff --git a/heed/src/envs/mod.rs b/heed/src/envs/mod.rs index 48da3d50..2b694d70 100644 --- a/heed/src/envs/mod.rs +++ b/heed/src/envs/mod.rs @@ -31,7 +31,6 @@ mod env_open_options; #[cfg(master3)] pub use encrypted_env::EncryptedEnv; pub use env::Env; -pub(crate) use env::EnvInner; pub use env_open_options::EnvOpenOptions; /// Records the current list of opened environments for tracking purposes. The canonical diff --git a/heed/src/mdb/lmdb_ffi.rs b/heed/src/mdb/lmdb_ffi.rs index e2be538a..a2665dec 100644 --- a/heed/src/mdb/lmdb_ffi.rs +++ b/heed/src/mdb/lmdb_ffi.rs @@ -7,8 +7,8 @@ pub use ffi::{ mdb_env_info, mdb_env_open, mdb_env_set_flags, mdb_env_set_mapsize, mdb_env_set_maxdbs, mdb_env_set_maxreaders, mdb_env_stat, mdb_env_sync, mdb_filehandle_t, mdb_get, mdb_put, mdb_reader_check, mdb_set_compare, mdb_set_dupsort, mdb_stat, mdb_txn_abort, mdb_txn_begin, - mdb_txn_commit, mdb_txn_id, mdb_version, MDB_cursor, MDB_dbi, MDB_env, MDB_envinfo, MDB_stat, - MDB_txn, MDB_val, MDB_CP_COMPACT, MDB_CURRENT, MDB_RDONLY, MDB_RESERVE, + mdb_txn_commit, mdb_txn_env, mdb_txn_id, mdb_version, MDB_cursor, MDB_dbi, MDB_env, + MDB_envinfo, MDB_stat, MDB_txn, MDB_val, MDB_CP_COMPACT, MDB_CURRENT, MDB_RDONLY, MDB_RESERVE, }; #[cfg(master3)] pub use ffi::{mdb_env_set_encrypt, MDB_enc_func}; diff --git a/heed/src/txn.rs b/heed/src/txn.rs index cbb6ecbc..a5e3418a 100644 --- a/heed/src/txn.rs +++ b/heed/src/txn.rs @@ -1,10 +1,8 @@ -use std::borrow::Cow; use std::marker::PhantomData; use std::ops::Deref; use std::ptr::{self, NonNull}; -use std::sync::Arc; -use crate::envs::{Env, EnvInner}; +use crate::envs::Env; use crate::mdb::error::mdb_result; use crate::mdb::ffi; use crate::Result; @@ -49,14 +47,13 @@ use crate::Result; /// ``` #[repr(transparent)] pub struct RoTxn<'e, T = AnyTls> { - inner: RoTxnInner<'e>, + inner: RoTxnInner, _tls_marker: PhantomData<&'e T>, } -struct RoTxnInner<'e> { +struct RoTxnInner { /// Makes the struct covariant and !Sync pub(crate) txn: Option>, - env: Cow<'e, Arc>, } impl<'e, T> RoTxn<'e, T> { @@ -72,10 +69,7 @@ impl<'e, T> RoTxn<'e, T> { ))? }; - Ok(RoTxn { - inner: RoTxnInner { txn: NonNull::new(txn), env: Cow::Borrowed(&env.inner) }, - _tls_marker: PhantomData, - }) + Ok(RoTxn { inner: RoTxnInner { txn: NonNull::new(txn) }, _tls_marker: PhantomData }) } pub(crate) fn static_read_txn(env: Env) -> Result> { @@ -90,10 +84,7 @@ impl<'e, T> RoTxn<'e, T> { ))? }; - Ok(RoTxn { - inner: RoTxnInner { txn: NonNull::new(txn), env: Cow::Owned(env.inner) }, - _tls_marker: PhantomData, - }) + Ok(RoTxn { inner: RoTxnInner { txn: NonNull::new(txn) }, _tls_marker: PhantomData }) } pub(crate) fn txn_ptr(&self) -> NonNull { @@ -101,7 +92,8 @@ impl<'e, T> RoTxn<'e, T> { } pub(crate) fn env_mut_ptr(&self) -> NonNull { - self.inner.env.env_mut_ptr() + let txn = self.inner.txn.unwrap(); + unsafe { NonNull::new(ffi::mdb_txn_env(txn.as_ptr())).unwrap() } } /// Return the transaction's ID. @@ -291,10 +283,7 @@ impl<'p> RwTxn<'p> { }; Ok(RwTxn { - txn: RoTxn { - inner: RoTxnInner { txn: NonNull::new(txn), env: Cow::Borrowed(&env.inner) }, - _tls_marker: PhantomData, - }, + txn: RoTxn { inner: RoTxnInner { txn: NonNull::new(txn) }, _tls_marker: PhantomData }, }) } @@ -307,15 +296,12 @@ impl<'p> RwTxn<'p> { }; Ok(RwTxn { - txn: RoTxn { - inner: RoTxnInner { txn: NonNull::new(txn), env: Cow::Borrowed(&env.inner) }, - _tls_marker: PhantomData, - }, + txn: RoTxn { inner: RoTxnInner { txn: NonNull::new(txn) }, _tls_marker: PhantomData }, }) } pub(crate) fn env_mut_ptr(&self) -> NonNull { - self.txn.inner.env.env_mut_ptr() + self.txn.env_mut_ptr() } /// Create a nested read transaction that is capable of reading uncommitted changes. @@ -372,17 +358,14 @@ impl<'p> RwTxn<'p> { unsafe { mdb_result(ffi::mdb_txn_begin( - self.inner.env.env_mut_ptr().as_mut(), + self.env_mut_ptr().as_mut(), parent_ptr, ffi::MDB_RDONLY, &mut txn, ))? }; - Ok(RoTxn { - inner: RoTxnInner { txn: NonNull::new(txn), env: self.inner.env.clone() }, - _tls_marker: PhantomData, - }) + Ok(RoTxn { inner: RoTxnInner { txn: NonNull::new(txn) }, _tls_marker: PhantomData }) } /// Commit all the operations of a transaction into the database.