From 78a17a70513a54f96504757929e99ccf2dba3579 Mon Sep 17 00:00:00 2001 From: Yuchen Liang Date: Tue, 19 Nov 2024 18:38:59 +0000 Subject: [PATCH] improve FullSlice semantics Signed-off-by: Yuchen Liang --- pageserver/src/tenant/ephemeral_file.rs | 17 +++++++++++------ .../virtual_file/owned_buffers_io/io_buf_ext.rs | 12 +++++++++--- .../src/virtual_file/owned_buffers_io/write.rs | 2 +- .../owned_buffers_io/write/flush.rs | 4 ++-- 4 files changed, 23 insertions(+), 12 deletions(-) diff --git a/pageserver/src/tenant/ephemeral_file.rs b/pageserver/src/tenant/ephemeral_file.rs index 5f7e86f364..9aecfff384 100644 --- a/pageserver/src/tenant/ephemeral_file.rs +++ b/pageserver/src/tenant/ephemeral_file.rs @@ -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]); diff --git a/pageserver/src/virtual_file/owned_buffers_io/io_buf_ext.rs b/pageserver/src/virtual_file/owned_buffers_io/io_buf_ext.rs index ede04d4957..70d33d59bf 100644 --- a/pageserver/src/virtual_file/owned_buffers_io/io_buf_ext.rs +++ b/pageserver/src/virtual_file/owned_buffers_io/io_buf_ext.rs @@ -27,10 +27,16 @@ where let FullSlice { slice: s } = self; s } +} - pub(crate) fn as_raw_slice(&self) -> &Slice { - let FullSlice { slice: s } = &self; - s +impl Clone for FullSlice +where + B: IoBuf + Clone, +{ + fn clone(&self) -> Self { + Self { + slice: self.slice.get_ref().clone().slice_full(), + } } } diff --git a/pageserver/src/virtual_file/owned_buffers_io/write.rs b/pageserver/src/virtual_file/owned_buffers_io/write.rs index 84bf32b684..0f2e8a635c 100644 --- a/pageserver/src/virtual_file/owned_buffers_io/write.rs +++ b/pageserver/src/virtual_file/owned_buffers_io/write.rs @@ -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> { self.flush_handle.maybe_flushed.as_ref() } diff --git a/pageserver/src/virtual_file/owned_buffers_io/write/flush.rs b/pageserver/src/virtual_file/owned_buffers_io/write/flush.rs index 585c70218b..4c2019076e 100644 --- a/pageserver/src/virtual_file/owned_buffers_io/write/flush.rs +++ b/pageserver/src/virtual_file/owned_buffers_io/write/flush.rs @@ -14,7 +14,7 @@ pub struct FlushHandle { inner: Option>, /// Immutable buffer for serving tail reads. /// `None` if no flush request has been submitted. - pub(super) maybe_flushed: Option, + pub(super) maybe_flushed: Option>, } // 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 };