Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions heed/src/envs/encrypted_env.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ use aead::{AeadMutInPlace, Key, KeyInit, Nonce, Tag};

use super::{Env, EnvClosingEvent, EnvInfo, FlagSetMode};
use crate::databases::{EncryptedDatabase, EncryptedDatabaseOpenOptions};
use crate::envs::EnvStat;
use crate::mdb::ffi::{self};
use crate::{CompactionOption, EnvFlags, Result, RoTxn, RwTxn, Unspecified, WithTls};
#[allow(unused)] // fro cargo auto doc links
Expand Down Expand Up @@ -93,6 +94,11 @@ impl<T> EncryptedEnv<T> {
self.inner.info()
}

/// Returns some statistics about this environment.
pub fn stat(&self) -> EnvStat {
self.inner.stat()
}

/// Returns the size used by all the databases in the environment without the free pages.
///
/// It is crucial to configure [`EnvOpenOptions::max_dbs`] with a sufficiently large value
Expand Down
47 changes: 40 additions & 7 deletions heed/src/envs/env.rs
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ use super::{
EnvInfo, FlagSetMode, IntegerComparator, OPENED_ENV,
};
use crate::cursor::{MoveOperation, RoCursor};
use crate::envs::EnvStat;
use crate::mdb::ffi::{self, MDB_env};
use crate::mdb::lmdb_error::mdb_result;
use crate::mdb::lmdb_flags::AllDatabaseFlags;
Expand Down Expand Up @@ -136,15 +137,47 @@ impl<T> Env<T> {
pub fn info(&self) -> EnvInfo {
let mut raw_info = mem::MaybeUninit::uninit();
unsafe { ffi::mdb_env_info(self.inner.env_ptr.as_ptr(), raw_info.as_mut_ptr()) };
let raw_info = unsafe { raw_info.assume_init() };
let ffi::MDB_envinfo {
me_mapaddr,
me_mapsize,
me_last_pgno,
me_last_txnid,
me_maxreaders,
me_numreaders,
} = unsafe { raw_info.assume_init() };

EnvInfo {
map_addr: raw_info.me_mapaddr,
map_size: raw_info.me_mapsize,
last_page_number: raw_info.me_last_pgno,
last_txn_id: raw_info.me_last_txnid,
maximum_number_of_readers: raw_info.me_maxreaders,
number_of_readers: raw_info.me_numreaders,
map_addr: me_mapaddr,
map_size: me_mapsize,
last_page_number: me_last_pgno,
last_txn_id: me_last_txnid,
maximum_number_of_readers: me_maxreaders,
number_of_readers: me_numreaders,
}
}

/// Returns some statistics about this environment.
pub fn stat(&self) -> EnvStat {
let mut raw_stat = mem::MaybeUninit::uninit();
unsafe { ffi::mdb_env_stat(self.inner.env_ptr.as_ptr(), raw_stat.as_mut_ptr()) };
// SAFETY: `mdb_env_stat` can only ever return EINVAL, and only if `env` or `stat` are null,
// which cannot be the case here as `raw_stat` is on the stack, and `env` is a `NonNull`.
let ffi::MDB_stat {
ms_psize,
ms_depth,
ms_branch_pages,
ms_leaf_pages,
ms_overflow_pages,
ms_entries,
} = unsafe { raw_stat.assume_init() };

EnvStat {
page_size: ms_psize,
depth: ms_depth,
branch_pages: ms_branch_pages,
leaf_pages: ms_leaf_pages,
overflow_pages: ms_overflow_pages,
entries: ms_entries,
}
}

Expand Down
18 changes: 18 additions & 0 deletions heed/src/envs/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,24 @@ pub struct EnvInfo {
pub number_of_readers: u32,
}

/// Statistics for an environment.
#[derive(Debug, Clone, Copy)]
pub struct EnvStat {
/// Size of a database page.
/// This is currently the same for all databases.
pub page_size: u32,
/// Depth (height) of the B-tree.
pub depth: u32,
/// Number of internal (non-leaf) pages
pub branch_pages: usize,
/// Number of leaf pages.
pub leaf_pages: usize,
/// Number of overflow pages.
pub overflow_pages: usize,
/// Number of data items.
pub entries: usize,
}

/// A structure that can be used to wait for the closing event.
/// Multiple threads can wait on this event.
#[derive(Clone)]
Expand Down
4 changes: 2 additions & 2 deletions heed/src/mdb/lmdb_ffi.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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_stat, MDB_txn,
MDB_val, MDB_CP_COMPACT, MDB_CURRENT, MDB_RDONLY, MDB_RESERVE,
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,
};
#[cfg(master3)]
pub use ffi::{mdb_env_set_encrypt, MDB_enc_func};
Expand Down
Loading