Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
68 changes: 21 additions & 47 deletions rivetkit-typescript/packages/sqlite-native/src/vfs.rs
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,12 @@

*READ_CACHE_ENABLED.get_or_init(|| {
std::env::var(READ_CACHE_ENV_VAR)
.map(|value| matches!(value.to_ascii_lowercase().as_str(), "1" | "true" | "yes" | "on"))
.map(|value| {
matches!(
value.to_ascii_lowercase().as_str(),
"1" | "true" | "yes" | "on"
)
})
.unwrap_or(false)
})
}
Expand Down Expand Up @@ -177,91 +182,62 @@
}

fn kv_get(&self, keys: Vec<Vec<u8>>) -> Result<KvGetResult, String> {
let op_name = format!("get({}keys)", keys.len());
let key_count = keys.len();
let start = std::time::Instant::now();
let result = self
.rt_handle
.block_on(self.kv.batch_get(&self.actor_id, keys))
.map_err(|e| e.to_string());
let elapsed = start.elapsed();
if std::env::var("RIVET_TRACE_SQL").is_ok() {
eprintln!(
"[sql-trace] kv_roundtrip op={} duration={}us",
op_name,
elapsed.as_micros()
);
}
tracing::debug!(
op = %op_name,
op = %format_args!("get({key_count}keys)"),
duration_us = elapsed.as_micros() as u64,
"kv round-trip"
);
result
}

fn kv_put(&self, keys: Vec<Vec<u8>>, values: Vec<Vec<u8>>) -> Result<(), String> {
let op_name = format!("put({}keys)", keys.len());
let key_count = keys.len();
let start = std::time::Instant::now();
let result = self
.rt_handle
.block_on(self.kv.batch_put(&self.actor_id, keys, values))
.map_err(|e| e.to_string());
let elapsed = start.elapsed();
if std::env::var("RIVET_TRACE_SQL").is_ok() {
eprintln!(
"[sql-trace] kv_roundtrip op={} duration={}us",
op_name,
elapsed.as_micros()
);
}
tracing::debug!(
op = %op_name,
op = %format_args!("put({key_count}keys)"),
duration_us = elapsed.as_micros() as u64,
"kv round-trip"
);
result
}

fn kv_delete(&self, keys: Vec<Vec<u8>>) -> Result<(), String> {
let op_name = format!("del({}keys)", keys.len());
let key_count = keys.len();
let start = std::time::Instant::now();
let result = self
.rt_handle
.block_on(self.kv.batch_delete(&self.actor_id, keys))
.map_err(|e| e.to_string());
let elapsed = start.elapsed();
if std::env::var("RIVET_TRACE_SQL").is_ok() {
eprintln!(
"[sql-trace] kv_roundtrip op={} duration={}us",
op_name,
elapsed.as_micros()
);
}
tracing::debug!(
op = %op_name,
op = %format_args!("del({key_count}keys)"),
duration_us = elapsed.as_micros() as u64,
"kv round-trip"
);
result
}

fn kv_delete_range(&self, start: Vec<u8>, end: Vec<u8>) -> Result<(), String> {
let op_name = "delRange";
let start_time = std::time::Instant::now();
let result = self
.rt_handle
.block_on(self.kv.delete_range(&self.actor_id, start, end))
.map_err(|e| e.to_string());
let elapsed = start_time.elapsed();
if std::env::var("RIVET_TRACE_SQL").is_ok() {
eprintln!(
"[sql-trace] kv_roundtrip op={} duration={}us",
op_name,
elapsed.as_micros()
);
}
tracing::debug!(
op = %op_name,
op = "delRange",
duration_us = elapsed.as_micros() as u64,
"kv round-trip"
);
Expand Down Expand Up @@ -593,7 +569,7 @@
let chunk_key = kv::get_chunk_key(file.file_tag, chunk_idx as u32).to_vec();
let cached_chunk = if needs_existing && ctx.read_cache_enabled {
let state = get_file_state(file.state);
state.read_cache.get(chunk_key.as_slice()).cloned()

Check failure on line 572 in rivetkit-typescript/packages/sqlite-native/src/vfs.rs

View workflow job for this annotation

GitHub Actions / Check

no method named `get` found for enum `Option<T>` in the current scope
} else {
None
};
Expand Down Expand Up @@ -632,15 +608,11 @@

let mut entries_to_write = Vec::with_capacity(plans.len() + 1);
for plan in &plans {
let existing_chunk = plan
.cached_chunk
.as_deref()
.or_else(|| {
plan
.existing_chunk_index
.and_then(|idx| existing_chunks.get(idx))
.and_then(|value| value.as_ref())
});
let existing_chunk = plan.cached_chunk.as_deref().or_else(|| {
plan.existing_chunk_index

Check failure on line 612 in rivetkit-typescript/packages/sqlite-native/src/vfs.rs

View workflow job for this annotation

GitHub Actions / Check

mismatched types
.and_then(|idx| existing_chunks.get(idx))
.and_then(|value| value.as_ref())
});

let mut new_chunk = if let Some(existing_chunk) = existing_chunk {
let mut chunk = vec![0u8; std::cmp::max(existing_chunk.len(), plan.write_end)];
Expand Down Expand Up @@ -924,7 +896,9 @@

// Move dirty buffer entries into the read cache so subsequent
// reads can serve them without a KV round-trip.
let flushed: Vec<_> = std::mem::take(&mut state.dirty_buffer).into_iter().collect();
let flushed: Vec<_> = std::mem::take(&mut state.dirty_buffer)
.into_iter()
.collect();
if let Some(read_cache) = state.read_cache.as_mut() {
// Only chunk pages belong in the read cache. The metadata write above
// still goes through KV, but should not be cached as a page.
Expand Down
Loading