Skip to content

Commit

Permalink
Fix #164 add documentation about locks and txn limitation of lmdb.
Browse files Browse the repository at this point in the history
  • Loading branch information
darnuria committed Jul 9, 2023
1 parent 4e2b8a2 commit a11c816
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 0 deletions.
18 changes: 18 additions & 0 deletions heed/src/env.rs
Original file line number Diff line number Diff line change
Expand Up @@ -584,6 +584,13 @@ impl Env {
}

/// Create a transaction with read and write access for use with the environment.
///
/// ## LMDB limitation
///
/// Only one [RwTxn] may exist at the same time on the current environnement.
/// If an other write transaction is initiated, while an other write transaction exist
/// the thread initiating the new one will wait on a mutex upon completion of the previous
/// transaction.
pub fn write_txn(&self) -> Result<RwTxn> {
RwTxn::new(self)
}
Expand All @@ -601,6 +608,17 @@ impl Env {

/// Create a transaction with read-only access for use with the environment.
///
/// ## LMDB Limitation
///
/// It's possible to have multiple read transaction on the same environnement
/// while there is a write transaction ongoing.
///
/// But read transactions prevent reuse of pages freed by newer write transactions,
/// thus the database can grow quickly. Write transactions prevent other write transactions,
/// since writes are serialized.
///
/// So avoid long lived read transaction.
///
/// ## Errors
///
/// * [heed::mdb::lmdb_error::Error::Panic]: A fatal error occurred earlier and the environnement must be shut down
Expand Down
11 changes: 11 additions & 0 deletions heed/src/txn.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,13 @@ use crate::mdb::ffi;
use crate::{Env, Result};

/// A read-only transaction.
///
/// ## LMDB Limitation
///
/// It's a must to keep read transaction short lived.
///
/// Active Read transactions prevent reuse of pages freed
/// by newer write transactions, thus the database can grow quickly.
pub struct RoTxn<'e> {
pub(crate) txn: *mut ffi::MDB_txn,
env: &'e Env,
Expand Down Expand Up @@ -50,6 +57,10 @@ fn abort_txn(txn: *mut ffi::MDB_txn) {
}

/// A read-write transaction.
///
/// Only one [RwTxn] may exist on the same environnement at the same time,
/// it two exist the new one may wait on a Mutex for [RwTxn::commit] or [RwTxn::abort] of
/// the first one.
pub struct RwTxn<'p> {
pub(crate) txn: RoTxn<'p>,
}
Expand Down

0 comments on commit a11c816

Please sign in to comment.