diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 3ea4894..b86d586 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -14,14 +14,14 @@ jobs: steps: - uses: actions/checkout@v2 - name: setup rust toolchain - run: rustup show + run: rustup toolchain install - uses: taiki-e/install-action@nextest - uses: taiki-e/install-action@mdbook - name: patch for gh-pages build run: mv mini-lsm-book/theme/head.hbs._ mini-lsm-book/theme/head.hbs - name: check and build run: cargo x ci - - uses: actions/upload-pages-artifact@v1 + - uses: actions/upload-pages-artifact@v3 with: path: mini-lsm-book/book @@ -38,4 +38,4 @@ jobs: steps: - name: Deploy to GitHub Pages id: deployment - uses: actions/deploy-pages@v1 + uses: actions/deploy-pages@v4 diff --git a/Cargo.toml b/Cargo.toml index 9d968d6..edfbb47 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,7 +4,7 @@ resolver = "2" [workspace.package] version = "0.2.0" -edition = "2021" +edition = "2024" homepage = "https://github.com/skyzh/mini-lsm" keywords = ["storage", "database", "tutorial", "course"] license = "Apache-2.0" diff --git a/mini-lsm-book/src/week1-01-memtable.md b/mini-lsm-book/src/week1-01-memtable.md index 991beb4..50a2f25 100644 --- a/mini-lsm-book/src/week1-01-memtable.md +++ b/mini-lsm-book/src/week1-01-memtable.md @@ -33,7 +33,7 @@ crossbeam-skiplist provides similar interfaces to the Rust std's `BTreeMap`: ins You will also notice that the `MemTable` structure does not have a `delete` interface. In the mini-lsm implementation, deletion is represented as a key corresponding to an empty value. -In this task, you will need to implement `MemTable::get` and `MemTable::put` to enable modifications of the memtable. +In this task, you will need to implement `MemTable::get` and `MemTable::put` to enable modifications of the memtable. Note that `put` should always overwrite a key if it already exists. You won't have mutiple entries of the same key in a single memtable. We use the `bytes` crate for storing the data in the memtable. `bytes::Byte` is similar to `Arc<[u8]>`. When you clone the `Bytes`, or get a slice of `Bytes`, the underlying data will not be copied, and therefore cloning it is cheap. Instead, it simply creates a new reference to the storage area and the storage area will be freed when there are no reference to that area. @@ -157,6 +157,7 @@ Now that you have multiple memtables, you may modify your read path `get` functi ## Test Your Understanding * Why doesn't the memtable provide a `delete` API? +* Does it make sense for the memtable to store all write operations instead of only the latest version of a key? For example, the user puts a->1, a->2, and a->3 into the same memtable. * Is it possible to use other data structures as the memtable in LSM? What are the pros/cons of using the skiplist? * Why do we need a combination of `state` and `state_lock`? Can we only use `state.read()` and `state.write()`? * Why does the order to store and to probe the memtables matter? If a key appears in multiple memtables, which version should you return to the user? diff --git a/mini-lsm-mvcc/src/compact.rs b/mini-lsm-mvcc/src/compact.rs index 83e9654..5b9f736 100644 --- a/mini-lsm-mvcc/src/compact.rs +++ b/mini-lsm-mvcc/src/compact.rs @@ -28,10 +28,10 @@ pub use simple_leveled::{ }; pub use tiered::{TieredCompactionController, TieredCompactionOptions, TieredCompactionTask}; +use crate::iterators::StorageIterator; use crate::iterators::concat_iterator::SstConcatIterator; use crate::iterators::merge_iterator::MergeIterator; use crate::iterators::two_merge_iterator::TwoMergeIterator; -use crate::iterators::StorageIterator; use crate::key::KeySlice; use crate::lsm_storage::{CompactionFilter, LsmStorageInner, LsmStorageState}; use crate::manifest::ManifestRecord; diff --git a/mini-lsm-mvcc/src/iterators/merge_iterator.rs b/mini-lsm-mvcc/src/iterators/merge_iterator.rs index a4cc3c0..02361d7 100644 --- a/mini-lsm-mvcc/src/iterators/merge_iterator.rs +++ b/mini-lsm-mvcc/src/iterators/merge_iterator.rs @@ -13,8 +13,8 @@ // limitations under the License. use std::cmp::{self}; -use std::collections::binary_heap::PeekMut; use std::collections::BinaryHeap; +use std::collections::binary_heap::PeekMut; use anyhow::Result; diff --git a/mini-lsm-mvcc/src/iterators/two_merge_iterator.rs b/mini-lsm-mvcc/src/iterators/two_merge_iterator.rs index a6feaa9..7b4ef8b 100644 --- a/mini-lsm-mvcc/src/iterators/two_merge_iterator.rs +++ b/mini-lsm-mvcc/src/iterators/two_merge_iterator.rs @@ -25,9 +25,9 @@ pub struct TwoMergeIterator { } impl< - A: 'static + StorageIterator, - B: 'static + for<'a> StorageIterator = A::KeyType<'a>>, - > TwoMergeIterator + A: 'static + StorageIterator, + B: 'static + for<'a> StorageIterator = A::KeyType<'a>>, +> TwoMergeIterator { fn choose_a(a: &A, b: &B) -> bool { if !a.is_valid() { @@ -59,9 +59,9 @@ impl< } impl< - A: 'static + StorageIterator, - B: 'static + for<'a> StorageIterator = A::KeyType<'a>>, - > StorageIterator for TwoMergeIterator + A: 'static + StorageIterator, + B: 'static + for<'a> StorageIterator = A::KeyType<'a>>, +> StorageIterator for TwoMergeIterator { type KeyType<'a> = A::KeyType<'a>; diff --git a/mini-lsm-mvcc/src/lsm_iterator.rs b/mini-lsm-mvcc/src/lsm_iterator.rs index 1e04f20..f71225d 100644 --- a/mini-lsm-mvcc/src/lsm_iterator.rs +++ b/mini-lsm-mvcc/src/lsm_iterator.rs @@ -14,13 +14,13 @@ use std::ops::Bound; -use anyhow::{bail, Result}; +use anyhow::{Result, bail}; use bytes::Bytes; +use crate::iterators::StorageIterator; use crate::iterators::concat_iterator::SstConcatIterator; use crate::iterators::merge_iterator::MergeIterator; use crate::iterators::two_merge_iterator::TwoMergeIterator; -use crate::iterators::StorageIterator; use crate::mem_table::MemTableIterator; use crate::table::SsTableIterator; diff --git a/mini-lsm-mvcc/src/lsm_storage.rs b/mini-lsm-mvcc/src/lsm_storage.rs index 77247dd..3705da9 100644 --- a/mini-lsm-mvcc/src/lsm_storage.rs +++ b/mini-lsm-mvcc/src/lsm_storage.rs @@ -16,8 +16,8 @@ use std::collections::{BTreeSet, HashMap}; use std::fs::File; use std::ops::Bound; use std::path::{Path, PathBuf}; -use std::sync::atomic::AtomicUsize; use std::sync::Arc; +use std::sync::atomic::AtomicUsize; use anyhow::{Context, Result}; use bytes::Bytes; @@ -28,16 +28,16 @@ use crate::compact::{ CompactionController, CompactionOptions, LeveledCompactionController, LeveledCompactionOptions, SimpleLeveledCompactionController, SimpleLeveledCompactionOptions, TieredCompactionController, }; +use crate::iterators::StorageIterator; use crate::iterators::concat_iterator::SstConcatIterator; use crate::iterators::merge_iterator::MergeIterator; use crate::iterators::two_merge_iterator::TwoMergeIterator; -use crate::iterators::StorageIterator; use crate::key::{self, KeySlice}; use crate::lsm_iterator::{FusedIterator, LsmIterator}; use crate::manifest::{Manifest, ManifestRecord}; -use crate::mem_table::{map_bound, map_key_bound_plus_ts, MemTable}; -use crate::mvcc::txn::{Transaction, TxnIterator}; +use crate::mem_table::{MemTable, map_bound, map_key_bound_plus_ts}; use crate::mvcc::LsmMvccInner; +use crate::mvcc::txn::{Transaction, TxnIterator}; use crate::table::{FileObject, SsTable, SsTableBuilder, SsTableIterator}; pub type BlockCache = moka::sync::Cache<(usize, usize), Arc>; diff --git a/mini-lsm-mvcc/src/manifest.rs b/mini-lsm-mvcc/src/manifest.rs index f13ff5f..0cad63f 100644 --- a/mini-lsm-mvcc/src/manifest.rs +++ b/mini-lsm-mvcc/src/manifest.rs @@ -17,7 +17,7 @@ use std::io::{Read, Write}; use std::path::Path; use std::sync::Arc; -use anyhow::{bail, Context, Result}; +use anyhow::{Context, Result, bail}; use bytes::{Buf, BufMut}; use parking_lot::{Mutex, MutexGuard}; use serde::{Deserialize, Serialize}; diff --git a/mini-lsm-mvcc/src/mem_table.rs b/mini-lsm-mvcc/src/mem_table.rs index 79480cd..5a5102b 100644 --- a/mini-lsm-mvcc/src/mem_table.rs +++ b/mini-lsm-mvcc/src/mem_table.rs @@ -14,13 +14,13 @@ use std::ops::Bound; use std::path::Path; -use std::sync::atomic::AtomicUsize; use std::sync::Arc; +use std::sync::atomic::AtomicUsize; use anyhow::Result; use bytes::Bytes; -use crossbeam_skiplist::map::Entry; use crossbeam_skiplist::SkipMap; +use crossbeam_skiplist::map::Entry; use ouroboros::self_referencing; use crate::iterators::StorageIterator; diff --git a/mini-lsm-mvcc/src/mvcc.rs b/mini-lsm-mvcc/src/mvcc.rs index 7f9f02a..3d31957 100644 --- a/mini-lsm-mvcc/src/mvcc.rs +++ b/mini-lsm-mvcc/src/mvcc.rs @@ -20,7 +20,7 @@ pub mod watermark; use std::{ collections::{BTreeMap, HashSet}, - sync::{atomic::AtomicBool, Arc}, + sync::{Arc, atomic::AtomicBool}, }; use crossbeam_skiplist::SkipMap; diff --git a/mini-lsm-mvcc/src/mvcc/txn.rs b/mini-lsm-mvcc/src/mvcc/txn.rs index f1adbb9..7165342 100644 --- a/mini-lsm-mvcc/src/mvcc/txn.rs +++ b/mini-lsm-mvcc/src/mvcc/txn.rs @@ -16,19 +16,19 @@ use std::{ collections::HashSet, ops::Bound, sync::{ - atomic::{AtomicBool, Ordering}, Arc, + atomic::{AtomicBool, Ordering}, }, }; -use anyhow::{bail, Result}; +use anyhow::{Result, bail}; use bytes::Bytes; -use crossbeam_skiplist::{map::Entry, SkipMap}; +use crossbeam_skiplist::{SkipMap, map::Entry}; use ouroboros::self_referencing; use parking_lot::Mutex; use crate::{ - iterators::{two_merge_iterator::TwoMergeIterator, StorageIterator}, + iterators::{StorageIterator, two_merge_iterator::TwoMergeIterator}, lsm_iterator::{FusedIterator, LsmIterator}, lsm_storage::{LsmStorageInner, WriteBatchRecord}, mem_table::map_bound, diff --git a/mini-lsm-mvcc/src/table.rs b/mini-lsm-mvcc/src/table.rs index 5d5747f..c6fa4cc 100644 --- a/mini-lsm-mvcc/src/table.rs +++ b/mini-lsm-mvcc/src/table.rs @@ -20,7 +20,7 @@ use std::fs::File; use std::path::Path; use std::sync::Arc; -use anyhow::{anyhow, bail, Result}; +use anyhow::{Result, anyhow, bail}; pub use builder::SsTableBuilder; use bytes::{Buf, BufMut}; pub use iterator::SsTableIterator; diff --git a/mini-lsm-mvcc/src/table/bloom.rs b/mini-lsm-mvcc/src/table/bloom.rs index ddeac13..0a0e5fc 100644 --- a/mini-lsm-mvcc/src/table/bloom.rs +++ b/mini-lsm-mvcc/src/table/bloom.rs @@ -14,7 +14,7 @@ // Copyright 2021 TiKV Project Authors. Licensed under Apache-2.0. -use anyhow::{bail, Result}; +use anyhow::{Result, bail}; use bytes::{Buf, BufMut, Bytes, BytesMut}; /// Implements a bloom filter diff --git a/mini-lsm-mvcc/src/wal.rs b/mini-lsm-mvcc/src/wal.rs index d89b6b1..c4aa6bb 100644 --- a/mini-lsm-mvcc/src/wal.rs +++ b/mini-lsm-mvcc/src/wal.rs @@ -18,7 +18,7 @@ use std::io::{BufWriter, Read, Write}; use std::path::Path; use std::sync::Arc; -use anyhow::{bail, Context, Result}; +use anyhow::{Context, Result, bail}; use bytes::{Buf, BufMut, Bytes}; use crossbeam_skiplist::SkipMap; use parking_lot::Mutex; diff --git a/mini-lsm-starter/Cargo.toml b/mini-lsm-starter/Cargo.toml index e84ac93..1c90263 100644 --- a/mini-lsm-starter/Cargo.toml +++ b/mini-lsm-starter/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "mini-lsm-starter" version = "0.2.0" -edition = "2021" +edition = "2024" publish = false [dependencies] diff --git a/mini-lsm-starter/src/iterators/two_merge_iterator.rs b/mini-lsm-starter/src/iterators/two_merge_iterator.rs index a6769e5..c65bff4 100644 --- a/mini-lsm-starter/src/iterators/two_merge_iterator.rs +++ b/mini-lsm-starter/src/iterators/two_merge_iterator.rs @@ -28,9 +28,9 @@ pub struct TwoMergeIterator { } impl< - A: 'static + StorageIterator, - B: 'static + for<'a> StorageIterator = A::KeyType<'a>>, - > TwoMergeIterator + A: 'static + StorageIterator, + B: 'static + for<'a> StorageIterator = A::KeyType<'a>>, +> TwoMergeIterator { pub fn create(a: A, b: B) -> Result { unimplemented!() @@ -38,9 +38,9 @@ impl< } impl< - A: 'static + StorageIterator, - B: 'static + for<'a> StorageIterator = A::KeyType<'a>>, - > StorageIterator for TwoMergeIterator + A: 'static + StorageIterator, + B: 'static + for<'a> StorageIterator = A::KeyType<'a>>, +> StorageIterator for TwoMergeIterator { type KeyType<'a> = A::KeyType<'a>; diff --git a/mini-lsm-starter/src/lsm_iterator.rs b/mini-lsm-starter/src/lsm_iterator.rs index 7e3e2c3..29c589d 100644 --- a/mini-lsm-starter/src/lsm_iterator.rs +++ b/mini-lsm-starter/src/lsm_iterator.rs @@ -18,7 +18,7 @@ use anyhow::Result; use crate::{ - iterators::{merge_iterator::MergeIterator, StorageIterator}, + iterators::{StorageIterator, merge_iterator::MergeIterator}, mem_table::MemTableIterator, }; diff --git a/mini-lsm-starter/src/lsm_storage.rs b/mini-lsm-starter/src/lsm_storage.rs index 503b130..1f8c2e9 100644 --- a/mini-lsm-starter/src/lsm_storage.rs +++ b/mini-lsm-starter/src/lsm_storage.rs @@ -18,8 +18,8 @@ use std::collections::HashMap; use std::ops::Bound; use std::path::{Path, PathBuf}; -use std::sync::atomic::AtomicUsize; use std::sync::Arc; +use std::sync::atomic::AtomicUsize; use anyhow::Result; use bytes::Bytes; diff --git a/mini-lsm-starter/src/mem_table.rs b/mini-lsm-starter/src/mem_table.rs index b847d90..ab559f6 100644 --- a/mini-lsm-starter/src/mem_table.rs +++ b/mini-lsm-starter/src/mem_table.rs @@ -17,8 +17,8 @@ use std::ops::Bound; use std::path::Path; -use std::sync::atomic::AtomicUsize; use std::sync::Arc; +use std::sync::atomic::AtomicUsize; use anyhow::Result; use bytes::Bytes; diff --git a/mini-lsm-starter/src/mvcc/txn.rs b/mini-lsm-starter/src/mvcc/txn.rs index 22adb68..e9ec40a 100644 --- a/mini-lsm-starter/src/mvcc/txn.rs +++ b/mini-lsm-starter/src/mvcc/txn.rs @@ -18,7 +18,7 @@ use std::{ collections::HashSet, ops::Bound, - sync::{atomic::AtomicBool, Arc}, + sync::{Arc, atomic::AtomicBool}, }; use anyhow::Result; @@ -28,7 +28,7 @@ use ouroboros::self_referencing; use parking_lot::Mutex; use crate::{ - iterators::{two_merge_iterator::TwoMergeIterator, StorageIterator}, + iterators::{StorageIterator, two_merge_iterator::TwoMergeIterator}, lsm_iterator::{FusedIterator, LsmIterator}, lsm_storage::LsmStorageInner, }; diff --git a/mini-lsm/src/compact.rs b/mini-lsm/src/compact.rs index 3212b98..e531e11 100644 --- a/mini-lsm/src/compact.rs +++ b/mini-lsm/src/compact.rs @@ -28,10 +28,10 @@ pub use simple_leveled::{ }; pub use tiered::{TieredCompactionController, TieredCompactionOptions, TieredCompactionTask}; +use crate::iterators::StorageIterator; use crate::iterators::concat_iterator::SstConcatIterator; use crate::iterators::merge_iterator::MergeIterator; use crate::iterators::two_merge_iterator::TwoMergeIterator; -use crate::iterators::StorageIterator; use crate::key::KeySlice; use crate::lsm_storage::{LsmStorageInner, LsmStorageState}; use crate::manifest::ManifestRecord; diff --git a/mini-lsm/src/iterators/merge_iterator.rs b/mini-lsm/src/iterators/merge_iterator.rs index a4cc3c0..02361d7 100644 --- a/mini-lsm/src/iterators/merge_iterator.rs +++ b/mini-lsm/src/iterators/merge_iterator.rs @@ -13,8 +13,8 @@ // limitations under the License. use std::cmp::{self}; -use std::collections::binary_heap::PeekMut; use std::collections::BinaryHeap; +use std::collections::binary_heap::PeekMut; use anyhow::Result; diff --git a/mini-lsm/src/iterators/two_merge_iterator.rs b/mini-lsm/src/iterators/two_merge_iterator.rs index a85fd73..9ed5ffa 100644 --- a/mini-lsm/src/iterators/two_merge_iterator.rs +++ b/mini-lsm/src/iterators/two_merge_iterator.rs @@ -25,9 +25,9 @@ pub struct TwoMergeIterator { } impl< - A: 'static + StorageIterator, - B: 'static + for<'a> StorageIterator = A::KeyType<'a>>, - > TwoMergeIterator + A: 'static + StorageIterator, + B: 'static + for<'a> StorageIterator = A::KeyType<'a>>, +> TwoMergeIterator { fn choose_a(a: &A, b: &B) -> bool { if !a.is_valid() { @@ -59,9 +59,9 @@ impl< } impl< - A: 'static + StorageIterator, - B: 'static + for<'a> StorageIterator = A::KeyType<'a>>, - > StorageIterator for TwoMergeIterator + A: 'static + StorageIterator, + B: 'static + for<'a> StorageIterator = A::KeyType<'a>>, +> StorageIterator for TwoMergeIterator { type KeyType<'a> = A::KeyType<'a>; diff --git a/mini-lsm/src/lsm_iterator.rs b/mini-lsm/src/lsm_iterator.rs index ba6fe99..8d2b341 100644 --- a/mini-lsm/src/lsm_iterator.rs +++ b/mini-lsm/src/lsm_iterator.rs @@ -14,13 +14,13 @@ use std::ops::Bound; -use anyhow::{bail, Result}; +use anyhow::{Result, bail}; use bytes::Bytes; +use crate::iterators::StorageIterator; use crate::iterators::concat_iterator::SstConcatIterator; use crate::iterators::merge_iterator::MergeIterator; use crate::iterators::two_merge_iterator::TwoMergeIterator; -use crate::iterators::StorageIterator; use crate::mem_table::MemTableIterator; use crate::table::SsTableIterator; diff --git a/mini-lsm/src/lsm_storage.rs b/mini-lsm/src/lsm_storage.rs index fc611c7..e8930d3 100644 --- a/mini-lsm/src/lsm_storage.rs +++ b/mini-lsm/src/lsm_storage.rs @@ -16,8 +16,8 @@ use std::collections::{BTreeSet, HashMap}; use std::fs::File; use std::ops::Bound; use std::path::{Path, PathBuf}; -use std::sync::atomic::AtomicUsize; use std::sync::Arc; +use std::sync::atomic::AtomicUsize; use anyhow::{Context, Result}; use bytes::Bytes; @@ -28,14 +28,14 @@ use crate::compact::{ CompactionController, CompactionOptions, LeveledCompactionController, LeveledCompactionOptions, SimpleLeveledCompactionController, SimpleLeveledCompactionOptions, TieredCompactionController, }; +use crate::iterators::StorageIterator; use crate::iterators::concat_iterator::SstConcatIterator; use crate::iterators::merge_iterator::MergeIterator; use crate::iterators::two_merge_iterator::TwoMergeIterator; -use crate::iterators::StorageIterator; use crate::key::KeySlice; use crate::lsm_iterator::{FusedIterator, LsmIterator}; use crate::manifest::{Manifest, ManifestRecord}; -use crate::mem_table::{map_bound, MemTable}; +use crate::mem_table::{MemTable, map_bound}; use crate::mvcc::LsmMvccInner; use crate::table::{FileObject, SsTable, SsTableBuilder, SsTableIterator}; diff --git a/mini-lsm/src/manifest.rs b/mini-lsm/src/manifest.rs index f13ff5f..0cad63f 100644 --- a/mini-lsm/src/manifest.rs +++ b/mini-lsm/src/manifest.rs @@ -17,7 +17,7 @@ use std::io::{Read, Write}; use std::path::Path; use std::sync::Arc; -use anyhow::{bail, Context, Result}; +use anyhow::{Context, Result, bail}; use bytes::{Buf, BufMut}; use parking_lot::{Mutex, MutexGuard}; use serde::{Deserialize, Serialize}; diff --git a/mini-lsm/src/mem_table.rs b/mini-lsm/src/mem_table.rs index 5c89150..3cb52c8 100644 --- a/mini-lsm/src/mem_table.rs +++ b/mini-lsm/src/mem_table.rs @@ -14,13 +14,13 @@ use std::ops::Bound; use std::path::Path; -use std::sync::atomic::AtomicUsize; use std::sync::Arc; +use std::sync::atomic::AtomicUsize; use anyhow::Result; use bytes::Bytes; -use crossbeam_skiplist::map::Entry; use crossbeam_skiplist::SkipMap; +use crossbeam_skiplist::map::Entry; use ouroboros::self_referencing; use crate::iterators::StorageIterator; diff --git a/mini-lsm/src/table.rs b/mini-lsm/src/table.rs index 10afeae..0ed1459 100644 --- a/mini-lsm/src/table.rs +++ b/mini-lsm/src/table.rs @@ -20,7 +20,7 @@ use std::fs::File; use std::path::Path; use std::sync::Arc; -use anyhow::{anyhow, bail, Result}; +use anyhow::{Result, anyhow, bail}; pub use builder::SsTableBuilder; use bytes::{Buf, BufMut}; pub use iterator::SsTableIterator; diff --git a/mini-lsm/src/table/bloom.rs b/mini-lsm/src/table/bloom.rs index ddeac13..0a0e5fc 100644 --- a/mini-lsm/src/table/bloom.rs +++ b/mini-lsm/src/table/bloom.rs @@ -14,7 +14,7 @@ // Copyright 2021 TiKV Project Authors. Licensed under Apache-2.0. -use anyhow::{bail, Result}; +use anyhow::{Result, bail}; use bytes::{Buf, BufMut, Bytes, BytesMut}; /// Implements a bloom filter diff --git a/mini-lsm/src/tests/harness.rs b/mini-lsm/src/tests/harness.rs index ba4a2eb..6bcf70e 100644 --- a/mini-lsm/src/tests/harness.rs +++ b/mini-lsm/src/tests/harness.rs @@ -1,3 +1,5 @@ +#![allow(dead_code)] // REMOVE THIS LINE once all modules are complete + // Copyright (c) 2022-2025 Alex Chi Z // // Licensed under the Apache License, Version 2.0 (the "License"); @@ -17,7 +19,7 @@ use std::{ time::Duration, }; -use anyhow::{bail, Result}; +use anyhow::{Result, bail}; use bytes::Bytes; use crate::{ @@ -25,7 +27,7 @@ use crate::{ CompactionOptions, LeveledCompactionOptions, SimpleLeveledCompactionOptions, TieredCompactionOptions, }, - iterators::{merge_iterator::MergeIterator, StorageIterator}, + iterators::{StorageIterator, merge_iterator::MergeIterator}, key::{KeySlice, TS_ENABLED}, lsm_storage::{BlockCache, LsmStorageInner, LsmStorageState, MiniLsm}, table::{SsTable, SsTableBuilder, SsTableIterator}, @@ -128,7 +130,6 @@ where assert!(!iter.is_valid()); } -#[allow(dead_code)] pub fn check_iter_result_by_key_and_ts(iter: &mut I, expected: Vec<((Bytes, u64), Bytes)>) where I: for<'a> StorageIterator = KeySlice<'a>>, @@ -207,7 +208,6 @@ pub fn generate_sst( builder.build(id, block_cache, path.as_ref()).unwrap() } -#[allow(dead_code)] pub fn generate_sst_with_ts( id: usize, path: impl AsRef, @@ -290,7 +290,9 @@ pub fn compaction_bench(storage: Arc) { storage.dump_structure(); - println!("This test case does not guarantee your compaction algorithm produces a LSM state as expected. It only does minimal checks on the size of the levels. Please use the compaction simulator to check if the compaction is correctly going on."); + println!( + "This test case does not guarantee your compaction algorithm produces a LSM state as expected. It only does minimal checks on the size of the levels. Please use the compaction simulator to check if the compaction is correctly going on." + ); } pub fn check_compaction_ratio(storage: Arc) { diff --git a/mini-lsm/src/tests/week1_day2.rs b/mini-lsm/src/tests/week1_day2.rs index 6cb42e0..66cf07b 100644 --- a/mini-lsm/src/tests/week1_day2.rs +++ b/mini-lsm/src/tests/week1_day2.rs @@ -18,14 +18,14 @@ use bytes::Bytes; use tempfile::tempdir; use crate::{ - iterators::{merge_iterator::MergeIterator, StorageIterator}, + iterators::{StorageIterator, merge_iterator::MergeIterator}, lsm_iterator::FusedIterator, lsm_storage::{LsmStorageInner, LsmStorageOptions}, mem_table::MemTable, tests::harness::check_lsm_iter_result_by_key, }; -use super::harness::{check_iter_result_by_key, expect_iter_error, MockIterator}; +use super::harness::{MockIterator, check_iter_result_by_key, expect_iter_error}; #[test] fn test_task1_memtable_iter() { diff --git a/mini-lsm/src/tests/week1_day4.rs b/mini-lsm/src/tests/week1_day4.rs index 7a82cf6..64b0ce8 100644 --- a/mini-lsm/src/tests/week1_day4.rs +++ b/mini-lsm/src/tests/week1_day4.rs @@ -15,7 +15,7 @@ use std::sync::Arc; use bytes::Bytes; -use tempfile::{tempdir, TempDir}; +use tempfile::{TempDir, tempdir}; use crate::iterators::StorageIterator; use crate::key::{KeySlice, KeyVec}; diff --git a/mini-lsm/src/tests/week1_day5.rs b/mini-lsm/src/tests/week1_day5.rs index fcd2233..9532e97 100644 --- a/mini-lsm/src/tests/week1_day5.rs +++ b/mini-lsm/src/tests/week1_day5.rs @@ -15,7 +15,7 @@ use std::ops::Bound; use std::sync::Arc; -use self::harness::{check_iter_result_by_key, MockIterator}; +use self::harness::{MockIterator, check_iter_result_by_key}; use self::harness::{check_lsm_iter_result_by_key, generate_sst}; use bytes::Bytes; use tempfile::tempdir; diff --git a/mini-lsm/src/tests/week1_day7.rs b/mini-lsm/src/tests/week1_day7.rs index b2b6c3c..24bc889 100644 --- a/mini-lsm/src/tests/week1_day7.rs +++ b/mini-lsm/src/tests/week1_day7.rs @@ -16,7 +16,7 @@ use tempfile::tempdir; use crate::{ key::{KeySlice, TS_ENABLED}, - table::{bloom::Bloom, FileObject, SsTable, SsTableBuilder}, + table::{FileObject, SsTable, SsTableBuilder, bloom::Bloom}, }; fn key_of(idx: usize) -> Vec { diff --git a/mini-lsm/src/tests/week2_day1.rs b/mini-lsm/src/tests/week2_day1.rs index ee44175..3337392 100644 --- a/mini-lsm/src/tests/week2_day1.rs +++ b/mini-lsm/src/tests/week2_day1.rs @@ -21,7 +21,7 @@ use week2_day1::harness::construct_merge_iterator_over_storage; use super::*; use crate::{ - iterators::{concat_iterator::SstConcatIterator, StorageIterator}, + iterators::{StorageIterator, concat_iterator::SstConcatIterator}, key::{KeySlice, TS_ENABLED}, lsm_storage::{LsmStorageInner, LsmStorageOptions}, table::{SsTable, SsTableBuilder}, diff --git a/mini-lsm/src/wal.rs b/mini-lsm/src/wal.rs index 08f615c..2bd5812 100644 --- a/mini-lsm/src/wal.rs +++ b/mini-lsm/src/wal.rs @@ -18,7 +18,7 @@ use std::io::{BufWriter, Read, Write}; use std::path::Path; use std::sync::Arc; -use anyhow::{bail, Context, Result}; +use anyhow::{Context, Result, bail}; use bytes::{Buf, BufMut, Bytes}; use crossbeam_skiplist::SkipMap; use parking_lot::Mutex; diff --git a/xtask/src/main.rs b/xtask/src/main.rs index 5aaa880..fada57f 100644 --- a/xtask/src/main.rs +++ b/xtask/src/main.rs @@ -14,7 +14,7 @@ use std::path::{Path, PathBuf}; -use anyhow::{anyhow, Result}; +use anyhow::{Result, anyhow}; use clap::Parser; use console::style; use duct::cmd;