Pin buffer into memory

Make sure the buffer is pinned into memory for I/O.
This commit is contained in:
Pekka Enberg
2023-09-30 19:20:48 +03:00
parent 9db164b319
commit 97185bfefc
4 changed files with 37 additions and 4 deletions

View File

@@ -19,7 +19,7 @@ impl BufferPool {
if let Some(buffer) = free_buffers.pop() {
Buffer::new(self, buffer)
} else {
let raw_buffer = vec![0; self.page_size];
let raw_buffer = IoBuffer::allocate(self.page_size);
Buffer::new(self, raw_buffer)
}
}

View File

@@ -30,7 +30,7 @@ impl File {
pub fn pread(&self, pos: usize, buf: &mut Buffer) -> Result<()> {
let mut file = self.file.borrow_mut();
file.seek(std::io::SeekFrom::Start(pos as u64))?;
file.read_exact(buf)?;
file.read_exact(buf.as_mut_slice())?;
Ok(())
}
}

View File

@@ -1,6 +1,37 @@
use cfg_block::cfg_block;
use std::pin::Pin;
pub type Buffer = Vec<u8>;
pub struct Buffer {
data: Pin<Vec<u8>>,
}
impl Buffer {
pub fn allocate(size: usize) -> Self {
Self {
data: Pin::new(vec![0; size]),
}
}
pub fn len(&self) -> usize {
self.data.len()
}
pub fn as_slice(&self) -> &[u8] {
&self.data
}
pub fn as_mut_slice(&mut self) -> &mut [u8] {
&mut self.data
}
pub fn as_ptr(&self) -> *const u8 {
self.data.as_ptr()
}
pub fn as_mut_ptr(&mut self) -> *mut u8 {
self.data.as_mut_ptr()
}
}
cfg_block! {
#[cfg(target_os = "linux")] {

View File

@@ -60,8 +60,9 @@ pub struct DatabaseHeader {
}
pub fn read_database_header(storage: &Storage) -> Result<DatabaseHeader> {
let mut buf = vec![0; 512];
let mut buf = crate::Buffer::allocate(512);
storage.get(1, &mut buf)?;
let buf = buf.as_slice();
let mut header = DatabaseHeader::default();
header.magic.copy_from_slice(&buf[0..16]);
header.page_size = u16::from_be_bytes([buf[16], buf[17]]);
@@ -141,6 +142,7 @@ pub fn read_btree_page(
} else {
0
};
let page = page.as_slice();
let mut header = BTreePageHeader {
page_type: page[pos].try_into()?,
_first_freeblock_offset: u16::from_be_bytes([page[pos + 1], page[pos + 2]]),