Skip to content

Commit f009d69

Browse files
committed
feat: cache fd
1 parent 6da1114 commit f009d69

File tree

4 files changed

+22
-10
lines changed

4 files changed

+22
-10
lines changed

benches/value_log.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -92,10 +92,10 @@ impl BlobCache for NoCacher {
9292
}
9393

9494
impl FDCache for NoCacher {
95-
fn get(&self, _: ValueLogId, _: BlobFileId) -> Option<std::io::BufReader<std::fs::File>> {
95+
fn get(&self, _: ValueLogId, _: BlobFileId) -> Option<std::fs::File> {
9696
None
9797
}
98-
fn insert(&self, _: ValueLogId, _: BlobFileId, _: BufReader<File>) {}
98+
fn insert(&self, _: ValueLogId, _: BlobFileId, _: File) {}
9999
}
100100

101101
fn prefetch(c: &mut Criterion) {

src/fd_cache.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,12 @@ use std::{fs::File, io::BufReader};
88
/// The unique identifier for a value log blob file. Another name for SegmentId
99
pub type BlobFileId = u64;
1010

11-
/// File descriptor cache, to cache file descriptors after an open() syscall.
12-
/// Reduces the number of open() syscalls needed accessing the same blob file.
11+
/// File descriptor cache, to cache file descriptors after an fopen().
12+
/// Reduces the number of fopen() needed when accessing the same blob file.
1313
pub trait FDCache: Clone {
1414
/// Caches a file descriptor
15-
fn insert(&self, vlog_id: ValueLogId, blob_file_id: BlobFileId, fd: BufReader<File>);
15+
fn insert(&self, vlog_id: ValueLogId, blob_file_id: BlobFileId, fd: File);
1616

1717
/// Retrieves a file descriptor from the cache, or `None` if it could not be found
18-
fn get(&self, vlog_id: ValueLogId, blob_file_id: BlobFileId) -> Option<BufReader<File>>;
18+
fn get(&self, vlog_id: ValueLogId, blob_file_id: BlobFileId) -> Option<File>;
1919
}

src/value_log.rs

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -282,8 +282,17 @@ impl<BC: BlobCache, C: Compressor + Clone, FDC: FDCache> ValueLog<BC, FDC, C> {
282282
return Ok(None);
283283
};
284284

285-
// TODO: this is the part with the repeated fopen() to the same file
286-
let mut reader = BufReader::new(File::open(&segment.path)?);
285+
let fd = match self.fd_cache.get(self.id, vhandle.segment_id) {
286+
Some(fd) => fd,
287+
None => {
288+
let fd = File::open(&segment.path)?;
289+
let fd_clone = fd.try_clone()?;
290+
self.fd_cache.insert(self.id, vhandle.segment_id, fd_clone);
291+
fd
292+
}
293+
};
294+
295+
let mut reader = BufReader::new(fd);
287296
reader.seek(std::io::SeekFrom::Start(vhandle.offset))?;
288297
let mut reader = SegmentReader::with_reader(vhandle.segment_id, reader)
289298
.use_compression(self.config.compression.clone());
@@ -315,6 +324,9 @@ impl<BC: BlobCache, C: Compressor + Clone, FDC: FDCache> ValueLog<BC, FDC, C> {
315324
self.blob_cache.insert(self.id, &value_handle, val);
316325
}
317326

327+
// cache the fd for future use, must ensure to always use SeekFrom::Start
328+
// self.fd_cache.insert(self.id, vhandle.segment_id, reader.inner);
329+
318330
Ok(Some(val))
319331
}
320332

tests/common.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -95,8 +95,8 @@ impl BlobCache for NoCacher {
9595
}
9696

9797
impl FDCache for NoCacher {
98-
fn get(&self, _: ValueLogId, _: BlobFileId) -> Option<std::io::BufReader<std::fs::File>> {
98+
fn get(&self, _: ValueLogId, _: BlobFileId) -> Option<std::fs::File> {
9999
None
100100
}
101-
fn insert(&self, _: ValueLogId, _: BlobFileId, _: BufReader<File>) {}
101+
fn insert(&self, _: ValueLogId, _: BlobFileId, _: File) {}
102102
}

0 commit comments

Comments
 (0)