diff --git a/pageserver/src/layered_repository/inmemory_layer.rs b/pageserver/src/layered_repository/inmemory_layer.rs index 577e562115..dc1177e76c 100644 --- a/pageserver/src/layered_repository/inmemory_layer.rs +++ b/pageserver/src/layered_repository/inmemory_layer.rs @@ -335,11 +335,13 @@ impl InMemoryLayer { self.start_lsn..inner.end_lsn.unwrap(), )?; + let mut buf = Vec::new(); let mut do_steps = || -> Result<()> { for (key, vec_map) in inner.index.iter() { // Write all page versions for (lsn, pos) in vec_map.as_slice() { - let val = Value::des(&utils::read_blob(&inner.file, *pos)?)?; + let len = utils::read_blob_buf(&inner.file, *pos, &mut buf)?; + let val = Value::des(&buf[0..len])?; delta_layer_writer.put_value(*key, *lsn, val)?; } } diff --git a/pageserver/src/layered_repository/utils.rs b/pageserver/src/layered_repository/utils.rs index de6303ce35..b3aa8c7ef4 100644 --- a/pageserver/src/layered_repository/utils.rs +++ b/pageserver/src/layered_repository/utils.rs @@ -4,17 +4,22 @@ use std::os::unix::fs::FileExt; use bookfile::BoundedReader; -pub fn read_blob(file: &F, off: u64) -> Result, Error> { +pub fn read_blob_buf(file: &F, off: u64, buf: &mut Vec) -> Result { // read length let mut len_buf = [0u8; 4]; file.read_exact_at(&mut len_buf, off)?; - let len = u32::from_ne_bytes(len_buf); + let len = u32::from_ne_bytes(len_buf) as usize; - let mut buf: Vec = Vec::new(); - buf.resize(len as usize, 0); + buf.resize(len, 0); file.read_exact_at(&mut buf.as_mut_slice(), off + 4)?; + Ok(len) +} + +pub fn read_blob(file: &F, off: u64) -> Result, Error> { + let mut buf: Vec = Vec::new(); + let _ = read_blob_buf(file, off, &mut buf); Ok(buf) }