Skip to content

Commit 02b2178

Browse files
committed
perf(sqlite-native): reuse read cache for partial writes
1 parent 9f2c0cd commit 02b2178

File tree

1 file changed

+17
-4
lines changed
  • rivetkit-typescript/packages/sqlite-native/src

1 file changed

+17
-4
lines changed

rivetkit-typescript/packages/sqlite-native/src/vfs.rs

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -574,6 +574,7 @@ unsafe extern "C" fn kv_io_write(
574574
chunk_offset: usize,
575575
write_start: usize,
576576
write_end: usize,
577+
cached_chunk: Option<Vec<u8>>,
577578
existing_chunk_index: Option<usize>,
578579
}
579580

@@ -590,7 +591,13 @@ unsafe extern "C" fn kv_io_write(
590591
};
591592
let needs_existing = write_start > 0 || existing_bytes_in_chunk > write_end;
592593
let chunk_key = kv::get_chunk_key(file.file_tag, chunk_idx as u32).to_vec();
593-
let existing_chunk_index = if needs_existing {
594+
let cached_chunk = if needs_existing && ctx.read_cache_enabled {
595+
let state = get_file_state(file.state);
596+
state.read_cache.get(chunk_key.as_slice()).cloned()
597+
} else {
598+
None
599+
};
600+
let existing_chunk_index = if needs_existing && cached_chunk.is_none() {
594601
let idx = chunk_keys_to_fetch.len();
595602
chunk_keys_to_fetch.push(chunk_key.clone());
596603
Some(idx)
@@ -603,6 +610,7 @@ unsafe extern "C" fn kv_io_write(
603610
chunk_offset,
604611
write_start,
605612
write_end,
613+
cached_chunk,
606614
existing_chunk_index,
607615
});
608616
}
@@ -625,9 +633,14 @@ unsafe extern "C" fn kv_io_write(
625633
let mut entries_to_write = Vec::with_capacity(plans.len() + 1);
626634
for plan in &plans {
627635
let existing_chunk = plan
628-
.existing_chunk_index
629-
.and_then(|idx| existing_chunks.get(idx))
630-
.and_then(|value| value.as_ref());
636+
.cached_chunk
637+
.as_deref()
638+
.or_else(|| {
639+
plan
640+
.existing_chunk_index
641+
.and_then(|idx| existing_chunks.get(idx))
642+
.and_then(|value| value.as_ref())
643+
});
631644

632645
let mut new_chunk = if let Some(existing_chunk) = existing_chunk {
633646
let mut chunk = vec![0u8; std::cmp::max(existing_chunk.len(), plan.write_end)];

0 commit comments

Comments
 (0)