From b28c1d4a384ccd60eeaf7644d0f62d55cde3b789 Mon Sep 17 00:00:00 2001 From: marvin-j97 Date: Wed, 8 Jan 2025 20:08:29 +0100 Subject: [PATCH 01/13] closes #98 --- Cargo.toml | 5 ++--- README.md | 9 --------- src/partition/mod.rs | 8 ++------ src/partition/options.rs | 16 ++++++++++++---- 4 files changed, 16 insertions(+), 22 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 12052cd..5f0461a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -17,10 +17,9 @@ name = "fjall" path = "src/lib.rs" [features] -default = ["bloom", "single_writer_tx", "lz4"] +default = ["single_writer_tx", "lz4"] lz4 = ["lsm-tree/lz4"] miniz = ["lsm-tree/miniz"] -bloom = ["lsm-tree/bloom"] single_writer_tx = [] ssi_tx = [] __internal_whitebox = [] @@ -28,7 +27,7 @@ bytes = ["lsm-tree/bytes"] [dependencies] byteorder = "1.5.0" -lsm-tree = { version = "2.5.0", default-features = false } +lsm-tree = { version = "2.5.0", default-features = false, features = ["bloom"] } log = "0.4.21" std-semaphore = "0.1.0" tempfile = "3.10.1" diff --git a/README.md b/README.md index a07670d..c6946cf 100644 --- a/README.md +++ b/README.md @@ -147,15 +147,6 @@ Uses [`bytes`](https://github.com/tokio-rs/bytes) as the underlying `Slice` type *Disabled by default.* -### bloom *[deprecated]* - -Uses bloom filters to reduce disk I/O when serving point reads, but increases memory usage. - -*Enabled by default.* - -> Will be removed in the future. -> If you are absolutely, 100% sure you do not need bloom filters: they will be togglable on a per-partition basis. - ## Stable disk format The disk format is stable as of 1.0.0. diff --git a/src/partition/mod.rs b/src/partition/mod.rs index 21bf688..ce8da70 100644 --- a/src/partition/mod.rs +++ b/src/partition/mod.rs @@ -254,7 +254,8 @@ impl PartitionHandle { .data_block_size(config.data_block_size) .index_block_size(config.index_block_size) .level_count(config.level_count) - .compression(config.compression); + .compression(config.compression) + .bloom_bits_per_key(config.bloom_bits_per_key); if let Some(kv_opts) = &config.kv_separation { base_config = base_config @@ -263,11 +264,6 @@ impl PartitionHandle { .blob_file_target_size(kv_opts.file_target_size); } - #[cfg(feature = "bloom")] - { - base_config = base_config.bloom_bits_per_key(config.bloom_bits_per_key); - } - let tree = match config.tree_type { lsm_tree::TreeType::Standard => AnyTree::Standard(base_config.open()?), lsm_tree::TreeType::Blob => AnyTree::Blob(base_config.open_as_blob_tree()?), diff --git a/src/partition/options.rs b/src/partition/options.rs index 977cc10..9b82e73 100644 --- a/src/partition/options.rs +++ b/src/partition/options.rs @@ -115,8 +115,6 @@ pub struct CreateOptions { pub(crate) level_count: u8, /// Bits per key for levels that are not L0, L1, L2 - // NOTE: bloom_bits_per_key is not conditionally compiled, - // because that would change the file format pub(crate) bloom_bits_per_key: i8, /// Tree type, see [`TreeType`]. @@ -326,10 +324,20 @@ impl Default for CreateOptions { } impl CreateOptions { + /// Sets the bits per key for bloom filters. + /// + /// Default = 10 bits #[must_use] #[doc(hidden)] - pub fn use_bloom_filters(mut self, flag: bool) -> Self { - self.bloom_bits_per_key = if flag { 10 } else { -1 }; + pub fn bloom_filter_bits(mut self, bits: Option) -> Self { + // NOTE: Can simply cast because of the assert above + #[allow(clippy::cast_possible_wrap)] + if let Some(bits) = bits { + assert!(bits <= 20, "bloom filter bits up to 20 are supported"); + self.bloom_bits_per_key = bits as i8; + } else { + self.bloom_bits_per_key = -1; + } self } From 1d49fbc8833e7e25965f5238c7e61ad21e0bb9f8 Mon Sep 17 00:00:00 2001 From: marvin-j97 Date: Wed, 8 Jan 2025 20:15:08 +0100 Subject: [PATCH 02/13] docs --- src/partition/options.rs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/partition/options.rs b/src/partition/options.rs index 9b82e73..16dcc2e 100644 --- a/src/partition/options.rs +++ b/src/partition/options.rs @@ -326,6 +326,10 @@ impl Default for CreateOptions { impl CreateOptions { /// Sets the bits per key for bloom filters. /// + /// More bits per key increases memory usage, but decreases the + /// false positive rate of bloom filters, which decreases unnecessary + /// read I/O for point reads. + /// /// Default = 10 bits #[must_use] #[doc(hidden)] From 5f23be917605c22a797c3c52da5bbfc60b5bcb7d Mon Sep 17 00:00:00 2001 From: marvin-j97 Date: Wed, 8 Jan 2025 20:45:17 +0100 Subject: [PATCH 03/13] adjust for changes in lsm-tree --- src/partition/mod.rs | 28 ++++++++++++++++++---------- src/tx/read_tx.rs | 10 +++++----- src/tx/write/mod.rs | 16 ++++++++-------- 3 files changed, 31 insertions(+), 23 deletions(-) diff --git a/src/partition/mod.rs b/src/partition/mod.rs index ce8da70..4d3abc8 100644 --- a/src/partition/mod.rs +++ b/src/partition/mod.rs @@ -335,7 +335,9 @@ impl PartitionHandle { /// ``` #[must_use] pub fn iter(&self) -> impl DoubleEndedIterator> + 'static { - self.tree.iter().map(|item| item.map_err(Into::into)) + self.tree + .iter(None, None) + .map(|item| item.map_err(Into::into)) } /// Returns an iterator that scans through the entire partition, returning only keys. @@ -343,7 +345,9 @@ impl PartitionHandle { /// Avoid using this function, or limit it as otherwise it may scan a lot of items. #[must_use] pub fn keys(&self) -> impl DoubleEndedIterator> + 'static { - self.tree.keys().map(|item| item.map_err(Into::into)) + self.tree + .keys(None, None) + .map(|item| item.map_err(Into::into)) } /// Returns an iterator that scans through the entire partition, returning only values. @@ -351,7 +355,9 @@ impl PartitionHandle { /// Avoid using this function, or limit it as otherwise it may scan a lot of items. #[must_use] pub fn values(&self) -> impl DoubleEndedIterator> + 'static { - self.tree.values().map(|item| item.map_err(Into::into)) + self.tree + .values(None, None) + .map(|item| item.map_err(Into::into)) } /// Returns an iterator over a range of items. @@ -377,7 +383,9 @@ impl PartitionHandle { &'a self, range: R, ) -> impl DoubleEndedIterator> + 'static { - self.tree.range(range).map(|item| item.map_err(Into::into)) + self.tree + .range(range, None, None) + .map(|item| item.map_err(Into::into)) } /// Returns an iterator over a prefixed set of items. @@ -404,7 +412,7 @@ impl PartitionHandle { prefix: K, ) -> impl DoubleEndedIterator> + 'static { self.tree - .prefix(prefix) + .prefix(prefix, None, None) .map(|item| item.map_err(Into::into)) } @@ -532,7 +540,7 @@ impl PartitionHandle { /// /// Will return `Err` if an IO error occurs. pub fn contains_key>(&self, key: K) -> crate::Result { - self.tree.contains_key(key).map_err(Into::into) + self.tree.contains_key(key, None).map_err(Into::into) } /// Retrieves an item from the partition. @@ -557,7 +565,7 @@ impl PartitionHandle { /// /// Will return `Err` if an IO error occurs. pub fn get>(&self, key: K) -> crate::Result> { - Ok(self.tree.get(key)?) + Ok(self.tree.get(key, None)?) } /// Retrieves the size of an item from the partition. @@ -582,7 +590,7 @@ impl PartitionHandle { /// /// Will return `Err` if an IO error occurs. pub fn size_of>(&self, key: K) -> crate::Result> { - Ok(self.tree.size_of(key)?) + Ok(self.tree.size_of(key, None)?) } /// Returns the first key-value pair in the partition. @@ -610,7 +618,7 @@ impl PartitionHandle { /// /// Will return `Err` if an IO error occurs. pub fn first_key_value(&self) -> crate::Result> { - Ok(self.tree.first_key_value()?) + Ok(self.tree.first_key_value(None, None)?) } /// Returns the last key-value pair in the partition. @@ -638,7 +646,7 @@ impl PartitionHandle { /// /// Will return `Err` if an IO error occurs. pub fn last_key_value(&self) -> crate::Result> { - Ok(self.tree.last_key_value()?) + Ok(self.tree.last_key_value(None, None)?) } // NOTE: Used in tests diff --git a/src/tx/read_tx.rs b/src/tx/read_tx.rs index 53f4e32..1ad4702 100644 --- a/src/tx/read_tx.rs +++ b/src/tx/read_tx.rs @@ -292,7 +292,7 @@ impl ReadTransaction { let iter = partition .inner .tree - .iter_with_seqno(self.nonce.instant, None) + .iter(Some(self.nonce.instant), None) .map(|item| Ok(item?)); crate::iter::Iter::new(self.nonce.clone(), iter) @@ -309,7 +309,7 @@ impl ReadTransaction { let iter = partition .inner .tree - .keys_with_seqno(self.nonce.instant, None) + .keys(Some(self.nonce.instant), None) .map(|item| Ok(item?)); crate::iter::Iter::new(self.nonce.clone(), iter) @@ -326,7 +326,7 @@ impl ReadTransaction { let iter = partition .inner .tree - .values_with_seqno(self.nonce.instant, None) + .values(Some(self.nonce.instant), None) .map(|item| Ok(item?)); crate::iter::Iter::new(self.nonce.clone(), iter) @@ -361,7 +361,7 @@ impl ReadTransaction { let iter = partition .inner .tree - .range_with_seqno(range, self.nonce.instant, None) + .range(range, Some(self.nonce.instant), None) .map(|item| Ok(item?)); crate::iter::Iter::new(self.nonce.clone(), iter) @@ -396,7 +396,7 @@ impl ReadTransaction { let iter = partition .inner .tree - .prefix_with_seqno(prefix, self.nonce.instant, None) + .prefix(prefix, Some(self.nonce.instant), None) .map(|item| Ok(item?)); crate::iter::Iter::new(self.nonce.clone(), iter) diff --git a/src/tx/write/mod.rs b/src/tx/write/mod.rs index b3a0822..74dea55 100644 --- a/src/tx/write/mod.rs +++ b/src/tx/write/mod.rs @@ -265,8 +265,8 @@ impl BaseTransaction { partition .inner .tree - .iter_with_seqno( - self.nonce.instant, + .iter( + Some(self.nonce.instant), self.memtables.get(&partition.inner.name).cloned(), ) .map(|item| item.map_err(Into::into)) @@ -283,7 +283,7 @@ impl BaseTransaction { partition .inner .tree - .keys_with_seqno(self.nonce.instant, None) + .keys(Some(self.nonce.instant), None) .map(|item| item.map_err(Into::into)) } @@ -298,7 +298,7 @@ impl BaseTransaction { partition .inner .tree - .values_with_seqno(self.nonce.instant, None) + .values(Some(self.nonce.instant), None) .map(|item| item.map_err(Into::into)) } @@ -314,9 +314,9 @@ impl BaseTransaction { partition .inner .tree - .range_with_seqno( + .range( range, - self.nonce.instant, + Some(self.nonce.instant), self.memtables.get(&partition.inner.name).cloned(), ) .map(|item| item.map_err(Into::into)) @@ -334,9 +334,9 @@ impl BaseTransaction { partition .inner .tree - .prefix_with_seqno( + .prefix( prefix, - self.nonce.instant, + Some(self.nonce.instant), self.memtables.get(&partition.inner.name).cloned(), ) .map(|item| item.map_err(Into::into)) From 96f04a51b48c34f1bd9e85f61a06613e0861a775 Mon Sep 17 00:00:00 2001 From: marvin-j97 Date: Mon, 13 Jan 2025 00:19:24 +0100 Subject: [PATCH 04/13] add time spent compacting statistic #117 --- Cargo.toml | 4 ++-- src/compaction/worker.rs | 22 +++++++++++++++++----- src/keyspace.rs | 17 ++++++++++++++++- 3 files changed, 35 insertions(+), 8 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 5f0461a..c0e4620 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -2,7 +2,7 @@ name = "fjall" description = "LSM-based key-value storage engine" license = "MIT OR Apache-2.0" -version = "2.5.0" +version = "2.6.0" edition = "2021" rust-version = "1.74.0" readme = "README.md" @@ -27,7 +27,7 @@ bytes = ["lsm-tree/bytes"] [dependencies] byteorder = "1.5.0" -lsm-tree = { version = "2.5.0", default-features = false, features = ["bloom"] } +lsm-tree = { path = "../lsm-tree", default-features = false, features = [] } log = "0.4.21" std-semaphore = "0.1.0" tempfile = "3.10.1" diff --git a/src/compaction/worker.rs b/src/compaction/worker.rs index e56a832..f0f975e 100644 --- a/src/compaction/worker.rs +++ b/src/compaction/worker.rs @@ -5,33 +5,45 @@ use super::manager::CompactionManager; use crate::snapshot_tracker::SnapshotTracker; use lsm_tree::AbstractTree; -use std::sync::atomic::AtomicUsize; +use std::{ + sync::atomic::{AtomicU64, AtomicUsize}, + time::Instant, +}; /// Runs a single run of compaction. pub fn run( compaction_manager: &CompactionManager, snapshot_tracker: &SnapshotTracker, compaction_counter: &AtomicUsize, + time_compacting: &AtomicU64, ) { + use std::sync::atomic::Ordering::Relaxed; + let Some(item) = compaction_manager.pop() else { return; }; log::trace!( "compactor: calling compaction strategy for partition {:?}", - item.0.name + item.0.name, ); let strategy = item.config.compaction_strategy.clone(); // TODO: loop if there's more work to do - compaction_counter.fetch_add(1, std::sync::atomic::Ordering::Relaxed); + compaction_counter.fetch_add(1, Relaxed); + + let start = Instant::now(); + if let Err(e) = item .tree .compact(strategy.inner(), snapshot_tracker.get_seqno_safe_to_gc()) { log::error!("Compaction failed: {e:?}"); - }; - compaction_counter.fetch_sub(1, std::sync::atomic::Ordering::Relaxed); + } + + time_compacting.fetch_add(start.elapsed().as_micros() as u64, Relaxed); + + compaction_counter.fetch_sub(1, Relaxed); } diff --git a/src/keyspace.rs b/src/keyspace.rs index 6189c48..6aa9092 100644 --- a/src/keyspace.rs +++ b/src/keyspace.rs @@ -24,7 +24,7 @@ use std::{ fs::{remove_dir_all, File}, path::Path, sync::{ - atomic::{AtomicBool, AtomicUsize}, + atomic::{AtomicBool, AtomicU64, AtomicUsize}, Arc, RwLock, }, }; @@ -81,6 +81,9 @@ pub struct KeyspaceInner { /// Active compaction conter pub(crate) active_compaction_count: Arc, + /// Time spent in compactions (in µs) + pub(crate) time_compacting: Arc, + #[doc(hidden)] pub snapshot_tracker: SnapshotTracker, } @@ -197,6 +200,14 @@ impl Keyspace { self.write_buffer_manager.get() } + /// Returns the time all compactions took until now, in µs. + #[doc(hidden)] + #[must_use] + pub fn time_compacting(&self) -> u64 { + self.time_compacting + .load(std::sync::atomic::Ordering::Relaxed) + } + /// Returns the number of active compactions currently running. #[doc(hidden)] #[must_use] @@ -592,6 +603,7 @@ impl Keyspace { is_poisoned: Arc::default(), snapshot_tracker: SnapshotTracker::default(), active_compaction_count: Arc::default(), + time_compacting: Arc::default(), }; let keyspace = Self(Arc::new(inner)); @@ -726,6 +738,7 @@ impl Keyspace { is_poisoned: Arc::default(), snapshot_tracker: SnapshotTracker::default(), active_compaction_count: Arc::default(), + time_compacting: Arc::default(), }; // NOTE: Lastly, fsync .fjall marker, which contains the version @@ -806,6 +819,7 @@ impl Keyspace { let thread_counter = self.active_background_threads.clone(); let snapshot_tracker = self.snapshot_tracker.clone(); let compaction_counter = self.active_compaction_count.clone(); + let time_compacting = self.time_compacting.clone(); thread_counter.fetch_add(1, std::sync::atomic::Ordering::Relaxed); @@ -820,6 +834,7 @@ impl Keyspace { &compaction_manager, &snapshot_tracker, &compaction_counter, + &time_compacting, ); } From b73c3496c2138c6f1e66835ad9ebd6b9717102b8 Mon Sep 17 00:00:00 2001 From: marvin-j97 Date: Tue, 21 Jan 2025 18:07:52 +0100 Subject: [PATCH 05/13] clippy --- src/journal/marker.rs | 2 +- src/recovery.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/journal/marker.rs b/src/journal/marker.rs index 799d04f..ea6a3ab 100644 --- a/src/journal/marker.rs +++ b/src/journal/marker.rs @@ -48,7 +48,7 @@ pub fn serialize_marker_item( // NOTE: Truncation is okay and actually needed #[allow(clippy::cast_possible_truncation)] - writer.write_u8(partition.as_bytes().len() as u8)?; + writer.write_u8(partition.len() as u8)?; writer.write_all(partition.as_bytes())?; // NOTE: Truncation is okay and actually needed diff --git a/src/recovery.rs b/src/recovery.rs index f6f586c..5625549 100644 --- a/src/recovery.rs +++ b/src/recovery.rs @@ -180,7 +180,7 @@ pub fn recover_sealed_memtables( // IMPORTANT: Only apply sealed memtables to partitions // that have a lower seqno to avoid double flushing let should_skip_sealed_memtable = - partition_lsn.map_or(false, |partition_lsn| partition_lsn >= handle.lsn); + partition_lsn.is_some_and(|partition_lsn| partition_lsn >= handle.lsn); if should_skip_sealed_memtable { handle.partition.tree.lock_active_memtable().clear(); From d689b06b2437ec01267bef23bf818a084385d363 Mon Sep 17 00:00:00 2001 From: marvin-j97 Date: Fri, 24 Jan 2025 17:18:51 +0100 Subject: [PATCH 06/13] wip --- Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index c0e4620..9e037e5 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -20,10 +20,10 @@ path = "src/lib.rs" default = ["single_writer_tx", "lz4"] lz4 = ["lsm-tree/lz4"] miniz = ["lsm-tree/miniz"] +bytes = ["lsm-tree/bytes"] single_writer_tx = [] ssi_tx = [] __internal_whitebox = [] -bytes = ["lsm-tree/bytes"] [dependencies] byteorder = "1.5.0" From 8aae4ee05f192abfb79f95f73e8bdb2081fa0cac Mon Sep 17 00:00:00 2001 From: marvin-j97 Date: Thu, 30 Jan 2025 19:19:56 +0100 Subject: [PATCH 07/13] feat: closes #129 --- src/partition/mod.rs | 23 +++++++++++++++++++++++ src/partition/options.rs | 1 - 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/src/partition/mod.rs b/src/partition/mod.rs index 4d3abc8..dec3af6 100644 --- a/src/partition/mod.rs +++ b/src/partition/mod.rs @@ -649,6 +649,29 @@ impl PartitionHandle { Ok(self.tree.last_key_value(None, None)?) } + /// Returns `true` if the underlying LSM-tree is key-value-separated. + /// + /// # Examples + /// + /// ``` + /// # use fjall::{Config, Keyspace, PartitionCreateOptions}; + /// # + /// # let folder = tempfile::tempdir()?; + /// # let keyspace = Config::new(folder).open()?; + /// let tree1 = keyspace.open_partition("default", PartitionCreateOptions::default())?; + /// assert!(!tree1.is_kv_separated()); + /// + /// let blob_cfg = PartitionCreateOptions::default().with_kv_separation(Default::default()); + /// let tree2 = keyspace.open_partition("blobs", blob_cfg)?; + /// assert!(tree2.is_kv_separated()); + /// # + /// # Ok::<(), fjall::Error>(()) + /// ``` + #[must_use] + pub fn is_kv_separated(&self) -> bool { + matches!(self.tree, crate::AnyTree::Blob(_)) + } + // NOTE: Used in tests #[doc(hidden)] pub fn rotate_memtable_and_wait(&self) -> crate::Result<()> { diff --git a/src/partition/options.rs b/src/partition/options.rs index 16dcc2e..3054baa 100644 --- a/src/partition/options.rs +++ b/src/partition/options.rs @@ -232,7 +232,6 @@ impl lsm_tree::coding::Decode for CreateOptions { l0_threshold, target_size, level_ratio, - ..Default::default() }) } 1 => { From 8b5bff88e2f0eaa6d2c0854ac8cbe420e4682102 Mon Sep 17 00:00:00 2001 From: marvin-j97 Date: Thu, 30 Jan 2025 19:22:11 +0100 Subject: [PATCH 08/13] doc --- src/partition/mod.rs | 2 ++ src/partition/options.rs | 18 +----------------- 2 files changed, 3 insertions(+), 17 deletions(-) diff --git a/src/partition/mod.rs b/src/partition/mod.rs index dec3af6..8215869 100644 --- a/src/partition/mod.rs +++ b/src/partition/mod.rs @@ -651,6 +651,8 @@ impl PartitionHandle { /// Returns `true` if the underlying LSM-tree is key-value-separated. /// + /// See [`CreateOptions::with_kv_separation`] for more information. + /// /// # Examples /// /// ``` diff --git a/src/partition/options.rs b/src/partition/options.rs index 3054baa..6b3a5ab 100644 --- a/src/partition/options.rs +++ b/src/partition/options.rs @@ -425,23 +425,6 @@ impl CreateOptions { self } - /* /// Sets the level count (depth of the tree). - /// - /// Once set for a partition, this property is not considered in the future. - /// - /// Default = 7 - /// - /// # Panics - /// - /// Panics if `n` is less than 2. - #[must_use] - pub fn level_count(mut self, n: u8) -> Self { - assert!(n > 1); - - self.level_count = n; - self - } */ - /// Enables key-value separation for this partition. /// /// Key-value separation is intended for large value scenarios (1 KiB+ per KV). @@ -450,6 +433,7 @@ impl CreateOptions { /// and higher temporary space usage. /// Also, garbage collection for deleted or outdated values becomes lazy, so /// GC needs to be triggered *manually*. + /// See for more information. /// /// Once set for a partition, this property is not considered in the future. /// From 1ecf51a8d6f615c31a5cacb81c677c2485492d5d Mon Sep 17 00:00:00 2001 From: marvin-j97 Date: Fri, 31 Jan 2025 19:23:14 +0100 Subject: [PATCH 09/13] wip --- src/error.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/error.rs b/src/error.rs index eaf55e0..60afec6 100644 --- a/src/error.rs +++ b/src/error.rs @@ -7,6 +7,7 @@ use lsm_tree::{DecodeError, EncodeError}; /// Errors that may occur in the storage engine #[derive(Debug)] +#[non_exhaustive] pub enum Error { /// Error inside LSM-tree Storage(lsm_tree::Error), From 9727a4dc177cbe0fc6002272d1f7c4e45b7f9495 Mon Sep 17 00:00:00 2001 From: marvin-j97 Date: Sun, 2 Feb 2025 21:52:59 +0100 Subject: [PATCH 10/13] change lsm-tree dep --- Cargo.toml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index 9e037e5..75aa87d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -27,7 +27,8 @@ __internal_whitebox = [] [dependencies] byteorder = "1.5.0" -lsm-tree = { path = "../lsm-tree", default-features = false, features = [] } +lsm-tree = { git = "https://github.com/fjall-rs/lsm-tree", branch = "2.6.0", default-features = false, features = [ +] } log = "0.4.21" std-semaphore = "0.1.0" tempfile = "3.10.1" From ae208a2d5d8276ba76d30f3c5cd60f2c990e695f Mon Sep 17 00:00:00 2001 From: marvin-j97 Date: Sun, 2 Feb 2025 21:55:56 +0100 Subject: [PATCH 11/13] increase msrv to 1.75 --- Cargo.toml | 2 +- README.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 75aa87d..e68ae1c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,7 +4,7 @@ description = "LSM-based key-value storage engine" license = "MIT OR Apache-2.0" version = "2.6.0" edition = "2021" -rust-version = "1.74.0" +rust-version = "1.75.0" readme = "README.md" include = ["src/**/*", "LICENSE-APACHE", "LICENSE-MIT", "README.md"] repository = "https://github.com/fjall-rs/fjall" diff --git a/README.md b/README.md index c6946cf..6ce3dbb 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ Crates.io - MSRV + MSRV dependency status From bf241671ea024158cdfc7085d650e40f99c9672e Mon Sep 17 00:00:00 2001 From: marvin-j97 Date: Sun, 2 Feb 2025 21:55:56 +0100 Subject: [PATCH 12/13] increase msrv to 1.75 --- .github/workflows/test.yml | 2 +- Cargo.toml | 2 +- README.md | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index d33a793..a6e69b4 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -18,7 +18,7 @@ jobs: matrix: rust_version: - stable - - "1.74.0" # MSRV + - "1.75.0" # MSRV os: - ubuntu-latest - windows-latest diff --git a/Cargo.toml b/Cargo.toml index 75aa87d..e68ae1c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,7 +4,7 @@ description = "LSM-based key-value storage engine" license = "MIT OR Apache-2.0" version = "2.6.0" edition = "2021" -rust-version = "1.74.0" +rust-version = "1.75.0" readme = "README.md" include = ["src/**/*", "LICENSE-APACHE", "LICENSE-MIT", "README.md"] repository = "https://github.com/fjall-rs/fjall" diff --git a/README.md b/README.md index c6946cf..6ce3dbb 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ Crates.io - MSRV + MSRV dependency status From 8b6e7fd16e70f5601e2fe46ebf493846225616e5 Mon Sep 17 00:00:00 2001 From: marvin-j97 Date: Sun, 2 Feb 2025 22:04:09 +0100 Subject: [PATCH 13/13] increase msrv to 1.75 --- .github/workflows/test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index a6e69b4..2f1f283 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -63,7 +63,7 @@ jobs: matrix: rust_version: - stable - - "1.74.0" # MSRV + - "1.75.0" # MSRV os: - ubuntu-latest - windows-latest