forked from fjall-rs/lsm-tree
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathlib.rs
More file actions
211 lines (171 loc) · 5.06 KB
/
lib.rs
File metadata and controls
211 lines (171 loc) · 5.06 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
// Copyright (c) 2024-present, fjall-rs
// This source code is licensed under both the Apache 2.0 and MIT License
// (found in the LICENSE-* files in the repository)
//! A K.I.S.S. implementation of log-structured merge trees (LSM-trees/LSMTs).
//!
//! ##### NOTE
//!
//! > This crate only provides a primitive LSM-tree, not a full storage engine.
//! > You probably want to use <https://crates.io/crates/fjall> instead.
//! > For example, it does not ship with a write-ahead log, so writes are not
//! > persisted until manually flushing the memtable.
//!
//! ##### About
//!
//! This crate exports a `Tree` that supports a subset of the `BTreeMap` API.
//!
//! LSM-trees are an alternative to B-trees to persist a sorted list of items (e.g. a database table)
//! on disk and perform fast lookup queries.
//! Instead of updating a disk-based data structure in-place,
//! deltas (inserts and deletes) are added into an in-memory write buffer (`Memtable`).
//! Data is then flushed to disk-resident table files when the write buffer reaches some threshold.
//!
//! Amassing many tables on disk will degrade read performance and waste disk space, so tables
//! can be periodically merged into larger tables in a process called `Compaction`.
//! Different compaction strategies have different advantages and drawbacks, and should be chosen based
//! on the workload characteristics.
//!
//! Because maintaining an efficient structure is deferred to the compaction process, writing to an LSMT
//! is very fast (_O(1)_ complexity).
//!
//! Keys are limited to 65536 bytes, values are limited to 2^32 bytes. As is normal with any kind of storage
//! engine, larger keys and values have a bigger performance impact.
#![doc(html_logo_url = "https://raw.githubusercontent.com/fjall-rs/lsm-tree/main/logo.png")]
#![doc(html_favicon_url = "https://raw.githubusercontent.com/fjall-rs/lsm-tree/main/logo.png")]
#![deny(clippy::all, missing_docs, clippy::cargo)]
#![deny(clippy::unwrap_used)]
#![deny(clippy::indexing_slicing)]
#![warn(clippy::pedantic, clippy::nursery)]
#![warn(clippy::expect_used)]
#![allow(clippy::missing_const_for_fn)]
#![warn(clippy::multiple_crate_versions)]
#![allow(clippy::option_if_let_else)]
#![warn(clippy::redundant_feature_names)]
#![cfg_attr(coverage_nightly, feature(coverage_attribute))]
#[doc(hidden)]
pub type HashMap<K, V> = std::collections::HashMap<K, V, rustc_hash::FxBuildHasher>;
pub(crate) type HashSet<K> = std::collections::HashSet<K, rustc_hash::FxBuildHasher>;
macro_rules! fail_iter {
($e:expr) => {
match $e {
Ok(v) => v,
Err(e) => return Some(Err(e.into())),
}
};
}
macro_rules! unwrap {
($x:expr) => {{
$x.expect("should read")
}};
}
mod any_tree;
mod abstract_tree;
#[doc(hidden)]
pub mod blob_tree;
#[doc(hidden)]
mod cache;
#[doc(hidden)]
pub mod checksum;
#[doc(hidden)]
pub mod coding;
pub mod compaction;
mod compression;
/// Configuration
pub mod config;
#[doc(hidden)]
pub mod descriptor_table;
#[doc(hidden)]
pub mod file_accessor;
mod double_ended_peekable;
mod error;
#[doc(hidden)]
pub mod file;
mod hash;
mod ingestion;
mod iter_guard;
mod key;
mod key_range;
mod manifest;
mod memtable;
mod run_reader;
mod run_scanner;
#[doc(hidden)]
pub mod merge;
#[cfg(feature = "metrics")]
pub(crate) mod metrics;
// mod multi_reader;
#[doc(hidden)]
pub mod mvcc_stream;
mod path;
#[doc(hidden)]
pub mod range;
#[doc(hidden)]
pub mod table;
mod seqno;
mod slice;
mod slice_windows;
#[doc(hidden)]
pub mod stop_signal;
mod format_version;
mod time;
mod tree;
/// Utility functions
pub mod util;
mod value;
mod value_type;
/// Integrity verification for SST and blob files.
pub mod verify;
mod version;
mod vlog;
/// User defined key (byte array)
pub type UserKey = Slice;
/// User defined data (byte array)
pub type UserValue = Slice;
/// KV-tuple (key + value)
pub type KvPair = (UserKey, UserValue);
#[doc(hidden)]
pub use {
blob_tree::{handle::BlobIndirection, Guard as BlobGuard},
checksum::Checksum,
iter_guard::IterGuardImpl,
key_range::KeyRange,
merge::BoxedIterator,
slice::Builder,
table::{GlobalTableId, Table, TableId},
tree::inner::TreeId,
tree::Guard as StandardGuard,
value::InternalValue,
};
pub use {
abstract_tree::AbstractTree,
any_tree::AnyTree,
blob_tree::BlobTree,
cache::Cache,
compression::CompressionType,
config::{Config, KvSeparationOptions, TreeType},
descriptor_table::DescriptorTable,
error::{Error, Result},
format_version::FormatVersion,
ingestion::AnyIngestion,
iter_guard::IterGuard as Guard,
memtable::{Memtable, MemtableId},
seqno::SequenceNumberCounter,
slice::Slice,
tree::Tree,
value::SeqNo,
value_type::ValueType,
vlog::BlobFile,
};
#[cfg(feature = "metrics")]
pub use metrics::Metrics;
#[doc(hidden)]
#[must_use]
#[allow(missing_docs, clippy::missing_errors_doc, clippy::unwrap_used)]
pub fn get_tmp_folder() -> tempfile::TempDir {
if let Ok(p) = std::env::var("LSMT_TMP_FOLDER") {
tempfile::tempdir_in(p)
} else {
tempfile::tempdir()
}
.unwrap()
}