Rename SwornDisk to MlsDisk

This commit is contained in:
Qingsong Chen 2025-01-10 02:27:50 +00:00 committed by Tate, Hongliang Tian
parent 328ba47ccd
commit c040df72b3
7 changed files with 48 additions and 48 deletions

View File

@ -311,7 +311,7 @@ impl<K: RecordKey<K>, V: RecordValue, D: BlockSet + 'static> TreeInner<K, V, D>
recov_self.do_migration_tx()?; recov_self.do_migration_tx()?;
debug!("[SwornDisk TxLsmTree] Recovery completed: {recov_self:?}"); debug!("[MlsDisk TxLsmTree] Recovery completed: {recov_self:?}");
Ok(recov_self) Ok(recov_self)
} }
@ -539,7 +539,7 @@ impl<K: RecordKey<K>, V: RecordValue, D: BlockSet + 'static> TreeInner<K, V, D>
self.sst_manager.write().insert(new_sst, LsmLevel::L0); self.sst_manager.write().insert(new_sst, LsmLevel::L0);
debug!("[SwornDisk TxLsmTree] Minor Compaction completed: {self:?}"); debug!("[MlsDisk TxLsmTree] Minor Compaction completed: {self:?}");
Ok(()) Ok(())
} }
@ -638,7 +638,7 @@ impl<K: RecordKey<K>, V: RecordValue, D: BlockSet + 'static> TreeInner<K, V, D>
deleted_ssts.into_iter(), deleted_ssts.into_iter(),
); );
debug!("[SwornDisk TxLsmTree] Major Compaction completed: {self:?}"); debug!("[MlsDisk TxLsmTree] Major Compaction completed: {self:?}");
// Continue to do major compaction if necessary // Continue to do major compaction if necessary
if self.sst_manager.read().require_major_compaction(to_level) { if self.sst_manager.read().require_major_compaction(to_level) {

View File

@ -11,7 +11,7 @@ use core::{
use ostd_pod::Pod; use ostd_pod::Pod;
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use super::sworndisk::Hba; use super::mlsdisk::Hba;
use crate::{ use crate::{
layers::{ layers::{
bio::{BlockSet, Buf, BufRef, BID_SIZE}, bio::{BlockSet, Buf, BufRef, BID_SIZE},
@ -27,7 +27,7 @@ const BUCKET_BLOCK_VALIDITY_TABLE: &str = "BVT";
/// The bucket name of block alloc/dealloc log. /// The bucket name of block alloc/dealloc log.
const BUCKET_BLOCK_ALLOC_LOG: &str = "BAL"; const BUCKET_BLOCK_ALLOC_LOG: &str = "BAL";
/// Block validity table. Global allocator for `SwornDisk`, /// Block validity table. Global allocator for `MlsDisk`,
/// which manages validities of user data blocks. /// which manages validities of user data blocks.
pub(super) struct AllocTable { pub(super) struct AllocTable {
bitmap: Mutex<BitMap>, bitmap: Mutex<BitMap>,
@ -38,7 +38,7 @@ pub(super) struct AllocTable {
num_free: CvarMutex<usize>, num_free: CvarMutex<usize>,
} }
/// Per-TX block allocator in `SwornDisk`, recording validities /// Per-TX block allocator in `MlsDisk`, recording validities
/// of user data blocks within each TX. All metadata will be stored in /// of user data blocks within each TX. All metadata will be stored in
/// `TxLog`s of bucket `BAL` during TX for durability and recovery purpose. /// `TxLog`s of bucket `BAL` during TX for durability and recovery purpose.
pub(super) struct BlockAlloc<D> { pub(super) struct BlockAlloc<D> {

View File

@ -3,7 +3,7 @@
//! Data buffering. //! Data buffering.
use core::ops::RangeInclusive; use core::ops::RangeInclusive;
use super::sworndisk::RecordKey; use super::mlsdisk::RecordKey;
use crate::{ use crate::{
layers::bio::{BufMut, BufRef}, layers::bio::{BufMut, BufRef},
os::{BTreeMap, Condvar, CvarMutex, Mutex}, os::{BTreeMap, Condvar, CvarMutex, Mutex},

View File

@ -1,6 +1,6 @@
// SPDX-License-Identifier: MPL-2.0 // SPDX-License-Identifier: MPL-2.0
//! SwornDisk as a block device. //! MlsDisk as a block device.
//! //!
//! API: submit_bio(), submit_bio_sync(), create(), open(), //! API: submit_bio(), submit_bio_sync(), create(), open(),
//! read(), readv(), write(), writev(), sync(). //! read(), readv(), write(), writev(), sync().
@ -42,12 +42,12 @@ pub type Lba = BlockId;
/// Host Block Address. /// Host Block Address.
pub type Hba = BlockId; pub type Hba = BlockId;
/// SwornDisk. /// MlsDisk.
pub struct SwornDisk<D: BlockSet> { pub struct MlsDisk<D: BlockSet> {
inner: Arc<DiskInner<D>>, inner: Arc<DiskInner<D>>,
} }
/// Inner structures of `SwornDisk`. /// Inner structures of `MlsDisk`.
struct DiskInner<D: BlockSet> { struct DiskInner<D: BlockSet> {
/// Block I/O request queue. /// Block I/O request queue.
bio_req_queue: BioReqQueue, bio_req_queue: BioReqQueue,
@ -63,13 +63,13 @@ struct DiskInner<D: BlockSet> {
data_buf: DataBuf, data_buf: DataBuf,
/// Root encryption key. /// Root encryption key.
root_key: Key, root_key: Key,
/// Whether `SwornDisk` is dropped. /// Whether `MlsDisk` is dropped.
is_dropped: AtomicBool, is_dropped: AtomicBool,
/// Scope lock for control write and sync operation. /// Scope lock for control write and sync operation.
write_sync_region: RwLock<()>, write_sync_region: RwLock<()>,
} }
impl<D: BlockSet + 'static> aster_block::BlockDevice for SwornDisk<D> { impl<D: BlockSet + 'static> aster_block::BlockDevice for MlsDisk<D> {
fn enqueue( fn enqueue(
&self, &self,
bio: aster_block::bio::SubmittedBio, bio: aster_block::bio::SubmittedBio,
@ -165,7 +165,7 @@ impl<D: BlockSet + 'static> aster_block::BlockDevice for SwornDisk<D> {
} }
} }
impl<D: BlockSet + 'static> SwornDisk<D> { impl<D: BlockSet + 'static> MlsDisk<D> {
/// Read a specified number of blocks at a logical block address on the device. /// Read a specified number of blocks at a logical block address on the device.
/// The block contents will be read into a single contiguous buffer. /// The block contents will be read into a single contiguous buffer.
pub fn read(&self, lba: Lba, buf: BufMut) -> Result<()> { pub fn read(&self, lba: Lba, buf: BufMut) -> Result<()> {
@ -202,7 +202,7 @@ impl<D: BlockSet + 'static> SwornDisk<D> {
// TODO: Error handling the sync operation // TODO: Error handling the sync operation
self.inner.sync().unwrap(); self.inner.sync().unwrap();
trace!("[SwornDisk] Sync completed. {self:?}"); trace!("[MlsDisk] Sync completed. {self:?}");
Ok(()) Ok(())
} }
@ -211,7 +211,7 @@ impl<D: BlockSet + 'static> SwornDisk<D> {
self.inner.user_data_disk.nblocks() self.inner.user_data_disk.nblocks()
} }
/// Creates a new `SwornDisk` on the given disk, with the root encryption key. /// Creates a new `MlsDisk` on the given disk, with the root encryption key.
pub fn create( pub fn create(
disk: D, disk: D,
root_key: Key, root_key: Key,
@ -257,12 +257,12 @@ impl<D: BlockSet + 'static> SwornDisk<D> {
}), }),
}; };
info!("[SwornDisk] Created successfully! {:?}", &new_self); info!("[MlsDisk] Created successfully! {:?}", &new_self);
// XXX: Would `disk::drop()` bring unexpected behavior? // XXX: Would `disk::drop()` bring unexpected behavior?
Ok(new_self) Ok(new_self)
} }
/// Opens the `SwornDisk` on the given disk, with the root encryption key. /// Opens the `MlsDisk` on the given disk, with the root encryption key.
pub fn open( pub fn open(
disk: D, disk: D,
root_key: Key, root_key: Key,
@ -309,7 +309,7 @@ impl<D: BlockSet + 'static> SwornDisk<D> {
}), }),
}; };
info!("[SwornDisk] Opened successfully! {:?}", &opened_self); info!("[MlsDisk] Opened successfully! {:?}", &opened_self);
Ok(opened_self) Ok(opened_self)
} }
@ -360,7 +360,7 @@ impl<D: BlockSet + 'static> DiskInner<D> {
if let Err(e) = &res if let Err(e) = &res
&& e.errno() == NotFound && e.errno() == NotFound
{ {
warn!("[SwornDisk] read contains empty read on lba {lba}"); warn!("[MlsDisk] read contains empty read on lba {lba}");
return Ok(()); return Ok(());
} }
res res
@ -375,7 +375,7 @@ impl<D: BlockSet + 'static> DiskInner<D> {
if let Err(e) = &res if let Err(e) = &res
&& e.errno() == NotFound && e.errno() == NotFound
{ {
warn!("[SwornDisk] readv contains empty read on lba {lba}"); warn!("[MlsDisk] readv contains empty read on lba {lba}");
return Ok(()); return Ok(());
} }
res res
@ -622,15 +622,15 @@ impl<D: BlockSet + 'static> DiskInner<D> {
} }
} }
impl<D: BlockSet> Drop for SwornDisk<D> { impl<D: BlockSet> Drop for MlsDisk<D> {
fn drop(&mut self) { fn drop(&mut self) {
self.inner.is_dropped.store(true, Ordering::Release); self.inner.is_dropped.store(true, Ordering::Release);
} }
} }
impl<D: BlockSet + 'static> Debug for SwornDisk<D> { impl<D: BlockSet + 'static> Debug for MlsDisk<D> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("SwornDisk") f.debug_struct("MlsDisk")
.field("user_data_nblocks", &self.inner.user_data_disk.nblocks()) .field("user_data_nblocks", &self.inner.user_data_disk.nblocks())
.field("logical_block_table", &self.inner.logical_block_table) .field("logical_block_table", &self.inner.logical_block_table)
.finish() .finish()
@ -835,12 +835,12 @@ mod tests {
use crate::layers::{bio::MemDisk, disk::bio::BioReqBuilder}; use crate::layers::{bio::MemDisk, disk::bio::BioReqBuilder};
#[test] #[test]
fn sworndisk_fns() -> Result<()> { fn mlsdisk_fns() -> Result<()> {
let nblocks = 64 * 1024; let nblocks = 64 * 1024;
let mem_disk = MemDisk::create(nblocks)?; let mem_disk = MemDisk::create(nblocks)?;
let root_key = Key::random(); let root_key = Key::random();
// Create a new `SwornDisk` then do some writes // Create a new `MlsDisk` then do some writes
let sworndisk = SwornDisk::create(mem_disk.clone(), root_key, None)?; let mlsdisk = MlsDisk::create(mem_disk.clone(), root_key, None)?;
let num_rw = 1024; let num_rw = 1024;
// Submit a write block I/O request // Submit a write block I/O request
@ -854,23 +854,23 @@ mod tests {
.addr(0 as BlockId) .addr(0 as BlockId)
.bufs(bufs) .bufs(bufs)
.build(); .build();
sworndisk.submit_bio_sync(bio_req)?; mlsdisk.submit_bio_sync(bio_req)?;
// Sync the `SwornDisk` then do some reads // Sync the `MlsDisk` then do some reads
sworndisk.submit_bio_sync(BioReqBuilder::new(BioType::Sync).build())?; mlsdisk.submit_bio_sync(BioReqBuilder::new(BioType::Sync).build())?;
let mut rbuf = Buf::alloc(1)?; let mut rbuf = Buf::alloc(1)?;
for i in 0..num_rw { for i in 0..num_rw {
sworndisk.read(i as Lba, rbuf.as_mut())?; mlsdisk.read(i as Lba, rbuf.as_mut())?;
assert_eq!(rbuf.as_slice()[0], i as u8); assert_eq!(rbuf.as_slice()[0], i as u8);
} }
// Open the closed `SwornDisk` then test its data's existence // Open the closed `MlsDisk` then test its data's existence
drop(sworndisk); drop(mlsdisk);
thread::spawn(move || -> Result<()> { thread::spawn(move || -> Result<()> {
let opened_sworndisk = SwornDisk::open(mem_disk, root_key, None)?; let opened_mlsdisk = MlsDisk::open(mem_disk, root_key, None)?;
let mut rbuf = Buf::alloc(2)?; let mut rbuf = Buf::alloc(2)?;
opened_sworndisk.read(5 as Lba, rbuf.as_mut())?; opened_mlsdisk.read(5 as Lba, rbuf.as_mut())?;
assert_eq!(rbuf.as_slice()[0], 5u8); assert_eq!(rbuf.as_slice()[0], 5u8);
assert_eq!(rbuf.as_slice()[4096], 6u8); assert_eq!(rbuf.as_slice()[4096], 6u8);
Ok(()) Ok(())

View File

@ -2,33 +2,33 @@
//! The layer of secure virtual disk. //! The layer of secure virtual disk.
//! //!
//! `SwornDisk` provides three block I/O interfaces, `read()`, `write()` and `sync()`. //! `MlsDisk` provides three block I/O interfaces, `read()`, `write()` and `sync()`.
//! `SwornDisk` protects a logical block of user data using authenticated encryption. //! `MlsDisk` protects a logical block of user data using authenticated encryption.
//! The metadata of the encrypted logical blocks are inserted into a secure index `TxLsmTree`. //! The metadata of the encrypted logical blocks are inserted into a secure index `TxLsmTree`.
//! //!
//! `SwornDisk`'s backed untrusted host disk space is managed in `BlockAlloc`. Block reclamation can be //! `MlsDisk`'s backed untrusted host disk space is managed in `BlockAlloc`. Block reclamation can be
//! delayed to user-defined callbacks on `TxLsmTree`. //! delayed to user-defined callbacks on `TxLsmTree`.
//! `SwornDisk` supports buffering written logical blocks. //! `MlsDisk` supports buffering written logical blocks.
//! //!
//! # Usage Example //! # Usage Example
//! //!
//! Write, sync then read blocks from `SwornDisk`. //! Write, sync then read blocks from `MlsDisk`.
//! //!
//! ``` //! ```
//! let nblocks = 1024; //! let nblocks = 1024;
//! let mem_disk = MemDisk::create(nblocks)?; //! let mem_disk = MemDisk::create(nblocks)?;
//! let root_key = Key::random(); //! let root_key = Key::random();
//! let sworndisk = SwornDisk::create(mem_disk.clone(), root_key)?; //! let mlsdisk = MlsDisk::create(mem_disk.clone(), root_key)?;
//! //!
//! let num_rw = 128; //! let num_rw = 128;
//! let mut rw_buf = Buf::alloc(1)?; //! let mut rw_buf = Buf::alloc(1)?;
//! for i in 0..num_rw { //! for i in 0..num_rw {
//! rw_buf.as_mut_slice().fill(i as u8); //! rw_buf.as_mut_slice().fill(i as u8);
//! sworndisk.write(i as Lba, rw_buf.as_ref())?; //! mlsdisk.write(i as Lba, rw_buf.as_ref())?;
//! } //! }
//! sworndisk.sync()?; //! mlsdisk.sync()?;
//! for i in 0..num_rw { //! for i in 0..num_rw {
//! sworndisk.read(i as Lba, rw_buf.as_mut())?; //! mlsdisk.read(i as Lba, rw_buf.as_mut())?;
//! assert_eq!(rw_buf.as_slice()[0], i as u8); //! assert_eq!(rw_buf.as_slice()[0], i as u8);
//! } //! }
//! ``` //! ```
@ -36,6 +36,6 @@
mod bio; mod bio;
mod block_alloc; mod block_alloc;
mod data_buf; mod data_buf;
mod sworndisk; mod mlsdisk;
pub use self::sworndisk::SwornDisk; pub use self::mlsdisk::MlsDisk;

View File

@ -20,7 +20,7 @@ pub use self::{
error::{Errno, Error}, error::{Errno, Error},
layers::{ layers::{
bio::{BlockId, BlockSet, Buf, BufMut, BufRef, BLOCK_SIZE}, bio::{BlockId, BlockSet, Buf, BufMut, BufRef, BLOCK_SIZE},
disk::SwornDisk, disk::MlsDisk,
}, },
os::{Aead, AeadIv, AeadKey, AeadMac, Rng}, os::{Aead, AeadIv, AeadKey, AeadMac, Rng},
util::{Aead as _, RandomInit, Rng as _}, util::{Aead as _, RandomInit, Rng as _},

View File

@ -27,7 +27,7 @@ use crate::prelude::*;
/// Here is a simple example. /// Here is a simple example.
/// ///
/// ``` /// ```
/// use sworndisk_v2::lazy_delete::*; /// use crate::util::LazyDelete;
/// ///
/// let lazy_delete_u32 = LazyDelete::new(123_u32, |obj| { /// let lazy_delete_u32 = LazyDelete::new(123_u32, |obj| {
/// println!("the real deletion happens in this closure"); /// println!("the real deletion happens in this closure");