improve FullSlice semantics

Signed-off-by: Yuchen Liang <yuchen@neon.tech>
This commit is contained in:
Yuchen Liang
2024-11-19 18:38:59 +00:00
parent 826e2395a8
commit 78a17a7051
4 changed files with 23 additions and 12 deletions

View File

@@ -210,13 +210,13 @@ impl super::storage_layer::inmemory_layer::vectored_dio_read::File for Ephemeral
}
}
// [ written ][ maybe_flushed ][ mutable ]
// |- TAIL_SZ -||- TAIL_SZ -|
// ^
// `flushed_offset`
//
let (written_range, maybe_flushed_range) = {
if maybe_flushed.is_some() {
// [ written ][ maybe_flushed ][ mutable ]
// <- TAIL_SZ -><- TAIL_SZ ->
// ^
// `submitted_offset`
// <++++++ on disk +++++++????????????????>
(
Range(
start,
@@ -228,6 +228,11 @@ impl super::storage_layer::inmemory_layer::vectored_dio_read::File for Ephemeral
),
)
} else {
// [ written ][ mutable ]
// <- TAIL_SZ ->
// ^
// `submitted_offset`
// <++++++ on disk +++++++++++++++++++++++>
(
Range(start, std::cmp::min(end, submitted_offset)),
// zero len
@@ -434,7 +439,7 @@ mod tests {
assert!(file_contents == content[0..cap * 2]);
let maybe_flushed_buffer_contents = file.buffered_writer.inspect_maybe_flushed().unwrap();
assert_eq!(maybe_flushed_buffer_contents, &content[cap..cap * 2]);
assert_eq!(&maybe_flushed_buffer_contents[..], &content[cap..cap * 2]);
let mutable_buffer_contents = file.buffered_writer.inspect_mutable();
assert_eq!(mutable_buffer_contents, &content[cap * 2..write_nbytes]);

View File

@@ -27,10 +27,16 @@ where
let FullSlice { slice: s } = self;
s
}
}
pub(crate) fn as_raw_slice(&self) -> &Slice<B> {
let FullSlice { slice: s } = &self;
s
impl<B> Clone for FullSlice<B>
where
B: IoBuf + Clone,
{
fn clone(&self) -> Self {
Self {
slice: self.slice.get_ref().clone().slice_full(),
}
}
}

View File

@@ -92,7 +92,7 @@ where
/// Gets a reference to the maybe flushed read-only buffer.
/// Returns `None` if the writer has not submitted any flush request.
pub fn inspect_maybe_flushed(&self) -> Option<&Buf> {
pub fn inspect_maybe_flushed(&self) -> Option<&FullSlice<Buf>> {
self.flush_handle.maybe_flushed.as_ref()
}

View File

@@ -14,7 +14,7 @@ pub struct FlushHandle<Buf, W> {
inner: Option<FlushHandleInner<Buf, W>>,
/// Immutable buffer for serving tail reads.
/// `None` if no flush request has been submitted.
pub(super) maybe_flushed: Option<Buf>,
pub(super) maybe_flushed: Option<FullSlice<Buf>>,
}
// TODO(yuchen): special actions in drop to clean up the join handle?
@@ -162,7 +162,7 @@ where
// Saves a buffer for read while flushing. This also removes reference to the old buffer.
self.maybe_flushed = if save_buf_for_read {
Some(slice.as_raw_slice().get_ref().clone())
Some(slice.clone())
} else {
None
};