lora-python 0.8.3__tar.gz → 0.8.5__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {lora_python-0.8.3 → lora_python-0.8.5}/Cargo.lock +20 -20
- {lora_python-0.8.3 → lora_python-0.8.5}/Cargo.toml +11 -11
- {lora_python-0.8.3 → lora_python-0.8.5}/PKG-INFO +1 -1
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-database/benches/concurrency_guard_benchmarks.rs +10 -7
- lora_python-0.8.5/crates/lora-database/benches/perf_smoke_baseline.json +89 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-database/benches/perf_smoke_benchmarks.rs +228 -2
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-database/benches/wal_benchmarks.rs +160 -196
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-database/src/named.rs +1 -1
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-database/tests/managed_snapshots.rs +3 -1
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-database/tests/wal.rs +33 -12
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-executor/src/executor/immutable.rs +16 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-executor/src/pull/mod.rs +3 -1
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-store/src/memory/graph.rs +17 -21
- lora_python-0.8.5/crates/lora-wal/src/config.rs +51 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-wal/src/recorder/recorder.rs +4 -5
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-wal/src/recorder/tests.rs +36 -7
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-wal/src/replay.rs +10 -1
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-wal/src/segment.rs +38 -8
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-wal/src/wal/group_flusher.rs +31 -24
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-wal/src/wal/mod.rs +2 -2
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-wal/src/wal/tests.rs +84 -15
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-wal/src/wal/wal.rs +29 -60
- {lora_python-0.8.3 → lora_python-0.8.5}/pyproject.toml +1 -1
- lora_python-0.8.3/crates/lora-database/benches/perf_smoke_baseline.json +0 -45
- lora_python-0.8.3/crates/lora-wal/src/config.rs +0 -65
- {lora_python-0.8.3 → lora_python-0.8.5}/LICENSE +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/README.md +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/bindings/lora-python/.gitignore +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/bindings/lora-python/Cargo.toml +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/bindings/lora-python/LICENSE +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/bindings/lora-python/README.md +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/bindings/lora-python/build.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/bindings/lora-python/examples/async_demo.py +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/bindings/lora-python/examples/basic.py +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/bindings/lora-python/src/errors.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/bindings/lora-python/src/from_python.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/bindings/lora-python/src/lib.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/bindings/lora-python/src/to_python.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/bindings/lora-python/tests/test_async.py +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/bindings/lora-python/tests/test_explain_profile.py +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/bindings/lora-python/tests/test_sync.py +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-analyzer/Cargo.toml +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-analyzer/src/analyzer/clauses.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-analyzer/src/analyzer/expressions.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-analyzer/src/analyzer/mod.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-analyzer/src/analyzer/patterns.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-analyzer/src/analyzer/state.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-analyzer/src/analyzer/tests.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-analyzer/src/errors.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-analyzer/src/lib.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-analyzer/src/resolved.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-analyzer/src/scope.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-analyzer/src/symbols.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-analyzer/tests/error_messages.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-ast/Cargo.toml +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-ast/src/ast.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-ast/src/lib.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-compiler/Cargo.toml +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-compiler/src/lib.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-compiler/src/logical.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-compiler/src/optimizer.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-compiler/src/pattern.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-compiler/src/physical.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-compiler/src/plan_tree.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-compiler/src/planner.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-database/Cargo.toml +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-database/benches/advanced_benchmarks.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-database/benches/concurrent_benchmarks.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-database/benches/engine_benchmarks.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-database/benches/fixtures.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-database/benches/scale_benchmarks.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-database/benches/temporal_spatial_benchmarks.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-database/src/database/builder.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-database/src/database/compile.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-database/src/database/execute.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-database/src/database/explain.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-database/src/database/graph_api.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-database/src/database/mod.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-database/src/database/occ.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-database/src/database/profile.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-database/src/database/pull_mode.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-database/src/database/replay.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-database/src/database/stream.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-database/src/database/write_guard.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-database/src/durable_io.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-database/src/error.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-database/src/explain.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-database/src/lib.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-database/src/live_store.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-database/src/plan_cache.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-database/src/snapshot/json.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-database/src/snapshot/mod.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-database/src/snapshot/store.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-database/src/stream.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-database/src/transaction.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-database/src/wal/admin.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-database/src/wal/archive/format.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-database/src/wal/archive/lock.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-database/src/wal/archive/platform.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-database/src/wal/archive/worker.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-database/src/wal/archive/workspace.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-database/src/wal/archive.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-database/src/wal/mod.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-database/src/wal/write_scope.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-database/tests/advanced_queries.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-database/tests/aggregation.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-database/tests/backend_stub.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-database/tests/binary.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-database/tests/create.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-database/tests/error_messages.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-database/tests/errors.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-database/tests/explain_profile.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-database/tests/expressions.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-database/tests/functions_extended.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-database/tests/invariants.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-database/tests/match.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-database/tests/merge.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-database/tests/ordering.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-database/tests/parameters.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-database/tests/parser.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-database/tests/paths.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-database/tests/projection.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-database/tests/scale.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-database/tests/seeds.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-database/tests/snapshot.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-database/tests/spatial.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-database/tests/temporal.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-database/tests/test_helpers.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-database/tests/transactions.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-database/tests/types_advanced.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-database/tests/union.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-database/tests/update.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-database/tests/vectors.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-database/tests/where_clause.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-database/tests/with.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-executor/Cargo.toml +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-executor/src/errors.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-executor/src/eval/binops.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-executor/src/eval/errors.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-executor/src/eval/expr.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-executor/src/eval/functions.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-executor/src/eval/mod.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-executor/src/eval/point.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-executor/src/eval/vector.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-executor/src/executor/helpers.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-executor/src/executor/mod.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-executor/src/executor/mutable.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-executor/src/lib.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-executor/src/profile.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-executor/src/pull/aggregate.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-executor/src/pull/columns.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-executor/src/pull/context.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-executor/src/pull/expand.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-executor/src/pull/filter.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-executor/src/pull/hydration.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-executor/src/pull/mutable.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-executor/src/pull/optional.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-executor/src/pull/path.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-executor/src/pull/projection.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-executor/src/pull/scan.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-executor/src/pull/shape.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-executor/src/pull/sort.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-executor/src/pull/source.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-executor/src/pull/tests.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-executor/src/pull/traits.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-executor/src/pull/union.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-executor/src/value.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-executor/tests/error_messages.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-parser/Cargo.toml +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-parser/src/cypher.pest +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-parser/src/errors.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-parser/src/lib.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-parser/src/parser/clauses.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-parser/src/parser/expressions.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-parser/src/parser/literals.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-parser/src/parser/mod.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-parser/src/parser/patterns.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-parser/src/parser/query.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-parser/src/parser/tests.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-parser/src/parser/util.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-parser/tests/error_messages.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-snapshot/Cargo.toml +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-snapshot/src/body.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-snapshot/src/codec.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-snapshot/src/columnar.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-snapshot/src/envelope.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-snapshot/src/errors.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-snapshot/src/format.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-snapshot/src/lib.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-snapshot/src/options.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-snapshot/src/tests.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-snapshot/src/transform.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-snapshot/src/view.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-snapshot/tests/error_messages.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-store/Cargo.toml +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-store/src/lib.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-store/src/lock_table.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-store/src/memory/impls.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-store/src/memory/mod.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-store/src/memory/property_index.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-store/src/memory/snapshot.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-store/src/memory/tests.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-store/src/mutation.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-store/src/snapshot.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-store/src/traits.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-store/src/types/binary/mod.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-store/src/types/binary/tests.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-store/src/types/binary/traits.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-store/src/types/binary/types.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-store/src/types/graph.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-store/src/types/mod.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-store/src/types/property_value.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-store/src/types/spatial/distance.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-store/src/types/spatial/mod.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-store/src/types/spatial/point.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-store/src/types/spatial/srid.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-store/src/types/spatial/tests.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-store/src/types/temporal/calendar.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-store/src/types/temporal/date.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-store/src/types/temporal/datetime.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-store/src/types/temporal/duration.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-store/src/types/temporal/format.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-store/src/types/temporal/mod.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-store/src/types/temporal/parsing.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-store/src/types/temporal/time.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-store/src/types/vector/build.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-store/src/types/vector/mod.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-store/src/types/vector/similarity.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-store/src/types/vector/tests.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-store/src/types/vector/types.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-store/tests/error_messages.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-wal/Cargo.toml +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-wal/src/codec/decode.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-wal/src/codec/encode.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-wal/src/codec/format.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-wal/src/codec/mod.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-wal/src/codec/tests.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-wal/src/dir.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-wal/src/errors.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-wal/src/io.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-wal/src/lib.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-wal/src/lock.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-wal/src/lsn.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-wal/src/record.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-wal/src/recorder/errors.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-wal/src/recorder/mirror.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-wal/src/recorder/mod.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-wal/src/testing.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-wal/tests/error_messages.rs +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/python/lora_python/__init__.py +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/python/lora_python/_async.py +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/python/lora_python/_native.pyi +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/python/lora_python/py.typed +0 -0
- {lora_python-0.8.3 → lora_python-0.8.5}/python/lora_python/types.py +0 -0
|
@@ -797,7 +797,7 @@ checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897"
|
|
|
797
797
|
|
|
798
798
|
[[package]]
|
|
799
799
|
name = "lora-analyzer"
|
|
800
|
-
version = "0.8.
|
|
800
|
+
version = "0.8.5"
|
|
801
801
|
dependencies = [
|
|
802
802
|
"lora-ast",
|
|
803
803
|
"lora-parser",
|
|
@@ -807,14 +807,14 @@ dependencies = [
|
|
|
807
807
|
|
|
808
808
|
[[package]]
|
|
809
809
|
name = "lora-ast"
|
|
810
|
-
version = "0.8.
|
|
810
|
+
version = "0.8.5"
|
|
811
811
|
dependencies = [
|
|
812
812
|
"smallvec 2.0.0-alpha.12",
|
|
813
813
|
]
|
|
814
814
|
|
|
815
815
|
[[package]]
|
|
816
816
|
name = "lora-binding-buffer"
|
|
817
|
-
version = "0.8.
|
|
817
|
+
version = "0.8.5"
|
|
818
818
|
dependencies = [
|
|
819
819
|
"lora-database",
|
|
820
820
|
"lora-store",
|
|
@@ -822,7 +822,7 @@ dependencies = [
|
|
|
822
822
|
|
|
823
823
|
[[package]]
|
|
824
824
|
name = "lora-compiler"
|
|
825
|
-
version = "0.8.
|
|
825
|
+
version = "0.8.5"
|
|
826
826
|
dependencies = [
|
|
827
827
|
"lora-analyzer",
|
|
828
828
|
"lora-ast",
|
|
@@ -830,7 +830,7 @@ dependencies = [
|
|
|
830
830
|
|
|
831
831
|
[[package]]
|
|
832
832
|
name = "lora-database"
|
|
833
|
-
version = "0.8.
|
|
833
|
+
version = "0.8.5"
|
|
834
834
|
dependencies = [
|
|
835
835
|
"anyhow",
|
|
836
836
|
"arc-swap",
|
|
@@ -852,7 +852,7 @@ dependencies = [
|
|
|
852
852
|
|
|
853
853
|
[[package]]
|
|
854
854
|
name = "lora-executor"
|
|
855
|
-
version = "0.8.
|
|
855
|
+
version = "0.8.5"
|
|
856
856
|
dependencies = [
|
|
857
857
|
"lora-analyzer",
|
|
858
858
|
"lora-ast",
|
|
@@ -867,7 +867,7 @@ dependencies = [
|
|
|
867
867
|
|
|
868
868
|
[[package]]
|
|
869
869
|
name = "lora-ffi"
|
|
870
|
-
version = "0.8.
|
|
870
|
+
version = "0.8.5"
|
|
871
871
|
dependencies = [
|
|
872
872
|
"anyhow",
|
|
873
873
|
"lora-binding-buffer",
|
|
@@ -879,7 +879,7 @@ dependencies = [
|
|
|
879
879
|
|
|
880
880
|
[[package]]
|
|
881
881
|
name = "lora-node"
|
|
882
|
-
version = "0.8.
|
|
882
|
+
version = "0.8.5"
|
|
883
883
|
dependencies = [
|
|
884
884
|
"anyhow",
|
|
885
885
|
"lora-binding-buffer",
|
|
@@ -894,7 +894,7 @@ dependencies = [
|
|
|
894
894
|
|
|
895
895
|
[[package]]
|
|
896
896
|
name = "lora-parser"
|
|
897
|
-
version = "0.8.
|
|
897
|
+
version = "0.8.5"
|
|
898
898
|
dependencies = [
|
|
899
899
|
"lora-ast",
|
|
900
900
|
"pest",
|
|
@@ -905,7 +905,7 @@ dependencies = [
|
|
|
905
905
|
|
|
906
906
|
[[package]]
|
|
907
907
|
name = "lora-python"
|
|
908
|
-
version = "0.8.
|
|
908
|
+
version = "0.8.5"
|
|
909
909
|
dependencies = [
|
|
910
910
|
"anyhow",
|
|
911
911
|
"lora-database",
|
|
@@ -917,7 +917,7 @@ dependencies = [
|
|
|
917
917
|
|
|
918
918
|
[[package]]
|
|
919
919
|
name = "lora-server"
|
|
920
|
-
version = "0.8.
|
|
920
|
+
version = "0.8.5"
|
|
921
921
|
dependencies = [
|
|
922
922
|
"anyhow",
|
|
923
923
|
"axum",
|
|
@@ -931,7 +931,7 @@ dependencies = [
|
|
|
931
931
|
|
|
932
932
|
[[package]]
|
|
933
933
|
name = "lora-snapshot"
|
|
934
|
-
version = "0.8.
|
|
934
|
+
version = "0.8.5"
|
|
935
935
|
dependencies = [
|
|
936
936
|
"argon2",
|
|
937
937
|
"bincode",
|
|
@@ -946,7 +946,7 @@ dependencies = [
|
|
|
946
946
|
|
|
947
947
|
[[package]]
|
|
948
948
|
name = "lora-store"
|
|
949
|
-
version = "0.8.
|
|
949
|
+
version = "0.8.5"
|
|
950
950
|
dependencies = [
|
|
951
951
|
"bincode",
|
|
952
952
|
"crc32fast",
|
|
@@ -958,7 +958,7 @@ dependencies = [
|
|
|
958
958
|
|
|
959
959
|
[[package]]
|
|
960
960
|
name = "lora-wal"
|
|
961
|
-
version = "0.8.
|
|
961
|
+
version = "0.8.5"
|
|
962
962
|
dependencies = [
|
|
963
963
|
"crc32fast",
|
|
964
964
|
"lora-store",
|
|
@@ -968,7 +968,7 @@ dependencies = [
|
|
|
968
968
|
|
|
969
969
|
[[package]]
|
|
970
970
|
name = "lora-wasm"
|
|
971
|
-
version = "0.8.
|
|
971
|
+
version = "0.8.5"
|
|
972
972
|
dependencies = [
|
|
973
973
|
"anyhow",
|
|
974
974
|
"console_error_panic_hook",
|
|
@@ -984,7 +984,7 @@ dependencies = [
|
|
|
984
984
|
|
|
985
985
|
[[package]]
|
|
986
986
|
name = "lora_ruby"
|
|
987
|
-
version = "0.8.
|
|
987
|
+
version = "0.8.5"
|
|
988
988
|
dependencies = [
|
|
989
989
|
"anyhow",
|
|
990
990
|
"lora-database",
|
|
@@ -1408,18 +1408,18 @@ dependencies = [
|
|
|
1408
1408
|
|
|
1409
1409
|
[[package]]
|
|
1410
1410
|
name = "rb-sys"
|
|
1411
|
-
version = "0.9.
|
|
1411
|
+
version = "0.9.128"
|
|
1412
1412
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
1413
|
-
checksum = "
|
|
1413
|
+
checksum = "45ca28513560e56cfb79a62b1fce363c73af170a182024ce880c77ee9429920a"
|
|
1414
1414
|
dependencies = [
|
|
1415
1415
|
"rb-sys-build",
|
|
1416
1416
|
]
|
|
1417
1417
|
|
|
1418
1418
|
[[package]]
|
|
1419
1419
|
name = "rb-sys-build"
|
|
1420
|
-
version = "0.9.
|
|
1420
|
+
version = "0.9.128"
|
|
1421
1421
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
1422
|
-
checksum = "
|
|
1422
|
+
checksum = "ce04b2c55eff3a21aaa623fcc655d94373238e72cac6b3e1a3641ff31649f99a"
|
|
1423
1423
|
dependencies = [
|
|
1424
1424
|
"bindgen",
|
|
1425
1425
|
"lazy_static",
|
|
@@ -4,7 +4,7 @@ resolver = "2"
|
|
|
4
4
|
|
|
5
5
|
[workspace.package]
|
|
6
6
|
edition = "2021"
|
|
7
|
-
version = "0.8.
|
|
7
|
+
version = "0.8.5"
|
|
8
8
|
license = "BUSL-1.1"
|
|
9
9
|
authors = ["LoraDB, Inc."]
|
|
10
10
|
repository = "https://github.com/lora-db/lora"
|
|
@@ -15,16 +15,16 @@ rust-version = "1.87"
|
|
|
15
15
|
# Internal crates — versions are kept in lockstep with [workspace.package].version
|
|
16
16
|
# by `scripts/sync-versions.mjs`. Both `path` and `version` are set so that
|
|
17
17
|
# `cargo publish` works (crates.io cannot resolve path-only deps).
|
|
18
|
-
lora-ast = { path = "crates/lora-ast", version = "=0.8.
|
|
19
|
-
lora-parser = { path = "crates/lora-parser", version = "=0.8.
|
|
20
|
-
lora-analyzer = { path = "crates/lora-analyzer", version = "=0.8.
|
|
21
|
-
lora-compiler = { path = "crates/lora-compiler", version = "=0.8.
|
|
22
|
-
lora-store = { path = "crates/lora-store", version = "=0.8.
|
|
23
|
-
lora-snapshot = { path = "crates/lora-snapshot", version = "=0.8.
|
|
24
|
-
lora-wal = { path = "crates/lora-wal", version = "=0.8.
|
|
25
|
-
lora-executor = { path = "crates/lora-executor", version = "=0.8.
|
|
26
|
-
lora-database = { path = "crates/lora-database", version = "=0.8.
|
|
27
|
-
lora-binding-buffer = { path = "crates/bindings/lora-binding-buffer", version = "=0.8.
|
|
18
|
+
lora-ast = { path = "crates/lora-ast", version = "=0.8.5" }
|
|
19
|
+
lora-parser = { path = "crates/lora-parser", version = "=0.8.5" }
|
|
20
|
+
lora-analyzer = { path = "crates/lora-analyzer", version = "=0.8.5" }
|
|
21
|
+
lora-compiler = { path = "crates/lora-compiler", version = "=0.8.5" }
|
|
22
|
+
lora-store = { path = "crates/lora-store", version = "=0.8.5" }
|
|
23
|
+
lora-snapshot = { path = "crates/lora-snapshot", version = "=0.8.5", default-features = false }
|
|
24
|
+
lora-wal = { path = "crates/lora-wal", version = "=0.8.5" }
|
|
25
|
+
lora-executor = { path = "crates/lora-executor", version = "=0.8.5" }
|
|
26
|
+
lora-database = { path = "crates/lora-database", version = "=0.8.5" }
|
|
27
|
+
lora-binding-buffer = { path = "crates/bindings/lora-binding-buffer", version = "=0.8.5" }
|
|
28
28
|
|
|
29
29
|
# External crates.
|
|
30
30
|
anyhow = "1"
|
{lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-database/benches/concurrency_guard_benchmarks.rs
RENAMED
|
@@ -247,14 +247,17 @@ fn bench_concurrency_guard(c: &mut Criterion) {
|
|
|
247
247
|
}
|
|
248
248
|
|
|
249
249
|
// WAL write paths without the per-iteration directory setup measured.
|
|
250
|
-
//
|
|
251
|
-
//
|
|
250
|
+
// GroupSync isolates WAL encoding/flush-buffer overhead plus background
|
|
251
|
+
// fsync coordination.
|
|
252
252
|
{
|
|
253
|
-
let dir = ScratchDir::new("wal-
|
|
254
|
-
let db = Database::<InMemoryGraph>::open_with_wal(wal_config(
|
|
255
|
-
.
|
|
253
|
+
let dir = ScratchDir::new("wal-group-sync");
|
|
254
|
+
let db = Database::<InMemoryGraph>::open_with_wal(wal_config(
|
|
255
|
+
&dir.path,
|
|
256
|
+
SyncMode::GroupSync { interval_ms: 50 },
|
|
257
|
+
))
|
|
258
|
+
.unwrap();
|
|
256
259
|
let mut next = 0i64;
|
|
257
|
-
group.bench_function("
|
|
260
|
+
group.bench_function("wal_group_sync_create_delete_one", |b| {
|
|
258
261
|
b.iter(|| {
|
|
259
262
|
next += 1;
|
|
260
263
|
black_box(
|
|
@@ -273,7 +276,7 @@ fn bench_concurrency_guard(c: &mut Criterion) {
|
|
|
273
276
|
let dir = ScratchDir::new("wal-group");
|
|
274
277
|
let db = Database::<InMemoryGraph>::open_with_wal(wal_config(
|
|
275
278
|
&dir.path,
|
|
276
|
-
SyncMode::
|
|
279
|
+
SyncMode::GroupSync { interval_ms: 50 },
|
|
277
280
|
))
|
|
278
281
|
.unwrap();
|
|
279
282
|
let mut next = 0i64;
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
{
|
|
2
|
+
"_meta": {
|
|
3
|
+
"purpose": "Baseline ns/iter for the perf_smoke_benchmarks suite. Used by scripts/check-perf-smoke.mjs to detect performance regressions. NOT an authoritative performance record. See docs/performance/perf-smoke.md.",
|
|
4
|
+
"refresh": "node scripts/check-perf-smoke.mjs --update <bencher-output>",
|
|
5
|
+
"default_threshold": 3,
|
|
6
|
+
"threshold_policy": "Each bench carries an explicit `threshold` (regression multiplier). 3 is the canonical 'obvious-regression' gate for low-variance in-memory paths; 5 is used for sub-µs benches and WAL-backed benches where filesystem and runner noise inflate variance. Widen rather than remove if a bench becomes chronically flaky — a 5× gate still catches a catastrophic regression.",
|
|
7
|
+
"seeded_on": "2026-04-24",
|
|
8
|
+
"seeded_from": "Rough scaling of docs/performance/benchmarks.md numbers to allow for ubuntu-latest CI being slower and noisier than the reference Apple Silicon run. Replace with real CI-measured values on first green run.",
|
|
9
|
+
"last_updated": "2026-05-06"
|
|
10
|
+
},
|
|
11
|
+
"benchmarks": {
|
|
12
|
+
"perf_smoke/scan_1k": {
|
|
13
|
+
"ns": 172801,
|
|
14
|
+
"threshold": 2
|
|
15
|
+
},
|
|
16
|
+
"perf_smoke/filter_1k": {
|
|
17
|
+
"ns": 166596,
|
|
18
|
+
"threshold": 2
|
|
19
|
+
},
|
|
20
|
+
"perf_smoke/traversal_chain_500": {
|
|
21
|
+
"ns": 167629,
|
|
22
|
+
"threshold": 2
|
|
23
|
+
},
|
|
24
|
+
"perf_smoke/write_batch_100": {
|
|
25
|
+
"ns": 109584,
|
|
26
|
+
"threshold": 2
|
|
27
|
+
},
|
|
28
|
+
"perf_smoke/stream_scan_1k": {
|
|
29
|
+
"ns": 201749,
|
|
30
|
+
"threshold": 2
|
|
31
|
+
},
|
|
32
|
+
"perf_smoke/stream_pull_one": {
|
|
33
|
+
"ns": 717,
|
|
34
|
+
"threshold": 2
|
|
35
|
+
},
|
|
36
|
+
"perf_smoke/stream_write_100": {
|
|
37
|
+
"ns": 80604,
|
|
38
|
+
"threshold": 2
|
|
39
|
+
},
|
|
40
|
+
"perf_smoke/stream_write_sort_100": {
|
|
41
|
+
"ns": 205564,
|
|
42
|
+
"threshold": 2
|
|
43
|
+
},
|
|
44
|
+
"perf_smoke/tx_roundtrip_empty": {
|
|
45
|
+
"ns": 147,
|
|
46
|
+
"threshold": 2
|
|
47
|
+
},
|
|
48
|
+
"perf_smoke/tx_read_1k": {
|
|
49
|
+
"ns": 267327,
|
|
50
|
+
"threshold": 2
|
|
51
|
+
},
|
|
52
|
+
"perf_smoke/tx_write_100": {
|
|
53
|
+
"ns": 99217,
|
|
54
|
+
"threshold": 2
|
|
55
|
+
},
|
|
56
|
+
"perf_smoke/write_one_wal_group": {
|
|
57
|
+
"ns": 4417,
|
|
58
|
+
"threshold": 2
|
|
59
|
+
},
|
|
60
|
+
"perf_smoke/write_batch_100_wal_group": {
|
|
61
|
+
"ns": 189573,
|
|
62
|
+
"threshold": 2
|
|
63
|
+
},
|
|
64
|
+
"perf_smoke/tx_write_100_wal_group": {
|
|
65
|
+
"ns": 2446265,
|
|
66
|
+
"threshold": 2
|
|
67
|
+
},
|
|
68
|
+
"perf_smoke/write_one_wal_persistent": {
|
|
69
|
+
"ns": 4268990,
|
|
70
|
+
"threshold": 2
|
|
71
|
+
},
|
|
72
|
+
"perf_smoke/scan_1k_wal_group": {
|
|
73
|
+
"ns": 177912,
|
|
74
|
+
"threshold": 2
|
|
75
|
+
},
|
|
76
|
+
"perf_smoke/delete_100_wal_group": {
|
|
77
|
+
"ns": 4509379,
|
|
78
|
+
"threshold": 2
|
|
79
|
+
},
|
|
80
|
+
"perf_smoke/update_100_wal_group": {
|
|
81
|
+
"ns": 81676,
|
|
82
|
+
"threshold": 2
|
|
83
|
+
},
|
|
84
|
+
"perf_smoke/wal_replay_100": {
|
|
85
|
+
"ns": 533982,
|
|
86
|
+
"threshold": 2
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
{lora_python-0.8.3 → lora_python-0.8.5}/crates/lora-database/benches/perf_smoke_benchmarks.rs
RENAMED
|
@@ -22,9 +22,12 @@ mod fixtures;
|
|
|
22
22
|
|
|
23
23
|
use criterion::{criterion_group, criterion_main, BatchSize, Criterion};
|
|
24
24
|
use fixtures::*;
|
|
25
|
-
use lora_database::{
|
|
25
|
+
use lora_database::{
|
|
26
|
+
Database, ExecuteOptions, InMemoryGraph, ResultFormat, SyncMode, TransactionMode, WalConfig,
|
|
27
|
+
};
|
|
26
28
|
use std::hint::black_box;
|
|
27
|
-
use std::
|
|
29
|
+
use std::path::PathBuf;
|
|
30
|
+
use std::time::{Duration, SystemTime, UNIX_EPOCH};
|
|
28
31
|
|
|
29
32
|
fn opts() -> Option<ExecuteOptions> {
|
|
30
33
|
Some(ExecuteOptions {
|
|
@@ -32,6 +35,51 @@ fn opts() -> Option<ExecuteOptions> {
|
|
|
32
35
|
})
|
|
33
36
|
}
|
|
34
37
|
|
|
38
|
+
/// Per-iteration scratch directory for WAL-backed benches. Removed on
|
|
39
|
+
/// drop, so each Criterion sample starts on an empty WAL.
|
|
40
|
+
struct WalScratch {
|
|
41
|
+
path: PathBuf,
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
impl WalScratch {
|
|
45
|
+
fn new(tag: &str) -> Self {
|
|
46
|
+
let mut path = std::env::temp_dir();
|
|
47
|
+
path.push(format!(
|
|
48
|
+
"lora-perf-smoke-{}-{}-{}",
|
|
49
|
+
tag,
|
|
50
|
+
std::process::id(),
|
|
51
|
+
SystemTime::now()
|
|
52
|
+
.duration_since(UNIX_EPOCH)
|
|
53
|
+
.unwrap()
|
|
54
|
+
.as_nanos()
|
|
55
|
+
));
|
|
56
|
+
std::fs::create_dir_all(&path).unwrap();
|
|
57
|
+
Self { path }
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
impl Drop for WalScratch {
|
|
62
|
+
fn drop(&mut self) {
|
|
63
|
+
let _ = std::fs::remove_dir_all(&self.path);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/// Open a WAL-backed database with `SyncMode::GroupSync`. Group sync matches
|
|
68
|
+
/// the durability profile most embedded callers reach for — write-only
|
|
69
|
+
/// on commit, background flusher fsyncs on a 50 ms interval — and keeps
|
|
70
|
+
/// the bench dominated by engine + WAL append cost rather than fsync
|
|
71
|
+
/// latency.
|
|
72
|
+
fn open_wal_group(tag: &str) -> (WalScratch, Database<InMemoryGraph>) {
|
|
73
|
+
let dir = WalScratch::new(tag);
|
|
74
|
+
let cfg = WalConfig::Enabled {
|
|
75
|
+
dir: dir.path.clone(),
|
|
76
|
+
sync_mode: SyncMode::GroupSync { interval_ms: 50 },
|
|
77
|
+
segment_target_bytes: 8 * 1024 * 1024,
|
|
78
|
+
};
|
|
79
|
+
let db = Database::open_with_wal(cfg).unwrap();
|
|
80
|
+
(dir, db)
|
|
81
|
+
}
|
|
82
|
+
|
|
35
83
|
/// CI-friendly Criterion config: short warmup + short measurement + modest
|
|
36
84
|
/// sample count. Total measurement budget per bench ≈ 1.8 s.
|
|
37
85
|
fn smoke_config() -> Criterion {
|
|
@@ -263,6 +311,184 @@ fn bench_perf_smoke(c: &mut Criterion) {
|
|
|
263
311
|
);
|
|
264
312
|
});
|
|
265
313
|
|
|
314
|
+
// --- 11. persistent single CREATE: WAL group sync --------------------
|
|
315
|
+
//
|
|
316
|
+
// Auto-commit `CREATE` against a WAL-backed DB. The DB is opened
|
|
317
|
+
// once and shared across iterations — the WAL grows, but UNWIND-free
|
|
318
|
+
// CREATE has no scan cost, so per-iteration cost stays steady-state.
|
|
319
|
+
// What this bench captures is one record-encode + one segment append
|
|
320
|
+
// + one `Arc::make_mut` mutation. A regression here means the
|
|
321
|
+
// durable single-write path picked up per-call overhead beyond the
|
|
322
|
+
// fixed WAL append cost.
|
|
323
|
+
{
|
|
324
|
+
let (_dir, db) = open_wal_group("write-one");
|
|
325
|
+
group.bench_function("write_one_wal_group", |b| {
|
|
326
|
+
b.iter(|| {
|
|
327
|
+
black_box(db.execute("CREATE (:B {n: 1})", opts()).unwrap());
|
|
328
|
+
});
|
|
329
|
+
});
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
// --- 12. persistent batched write: WAL group sync --------------------
|
|
333
|
+
//
|
|
334
|
+
// Same shape as `write_batch_100` but committed durably via the
|
|
335
|
+
// group-sync WAL path. Distance from `write_batch_100` is the
|
|
336
|
+
// batched-write WAL overhead (one append, not 100). A regression
|
|
337
|
+
// that affects only the persistence write path — e.g., a per-row
|
|
338
|
+
// WAL fence or extra encode pass — shows up here without moving
|
|
339
|
+
// the in-memory baseline.
|
|
340
|
+
{
|
|
341
|
+
let (_dir, db) = open_wal_group("write-batch-100");
|
|
342
|
+
group.bench_function("write_batch_100_wal_group", |b| {
|
|
343
|
+
b.iter(|| {
|
|
344
|
+
black_box(
|
|
345
|
+
db.execute(
|
|
346
|
+
"UNWIND range(1, 100) AS i CREATE (:B {id: i, val: i * 2})",
|
|
347
|
+
opts(),
|
|
348
|
+
)
|
|
349
|
+
.unwrap(),
|
|
350
|
+
);
|
|
351
|
+
});
|
|
352
|
+
});
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
// --- 13. persistent explicit transaction: WAL group sync -------------
|
|
356
|
+
//
|
|
357
|
+
// Mirror of `tx_write_100` against the WAL/group profile. Catches
|
|
358
|
+
// regressions in the explicit-transaction commit path where it
|
|
359
|
+
// intersects the WAL recorder (transaction commit promotes the
|
|
360
|
+
// staged graph and appends one batched commit record).
|
|
361
|
+
{
|
|
362
|
+
let (_dir, db) = open_wal_group("tx-write-100");
|
|
363
|
+
group.bench_function("tx_write_100_wal_group", |b| {
|
|
364
|
+
b.iter(|| {
|
|
365
|
+
let mut tx = db.begin_transaction(TransactionMode::ReadWrite).unwrap();
|
|
366
|
+
black_box(
|
|
367
|
+
tx.execute("UNWIND range(1, 100) AS i CREATE (:B {id: i})", opts())
|
|
368
|
+
.unwrap(),
|
|
369
|
+
);
|
|
370
|
+
tx.commit().unwrap();
|
|
371
|
+
});
|
|
372
|
+
});
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
// --- 14. persistent single CREATE: WAL + force_fsync per commit ------
|
|
376
|
+
//
|
|
377
|
+
// Same shape as `write_one_wal_group` but adds an explicit
|
|
378
|
+
// `Database::sync()` on each iteration, forcing the WAL through to
|
|
379
|
+
// durable storage before the next commit lands. This captures the
|
|
380
|
+
// fully-durable per-commit profile (formerly `SyncMode::PerCommit`)
|
|
381
|
+
// — the gap to `write_one_wal_group` is one `fsync` per iteration.
|
|
382
|
+
// A regression here without one in `write_one_wal_group` points at
|
|
383
|
+
// the durability boundary path (`force_fsync` / `sync_dir`).
|
|
384
|
+
{
|
|
385
|
+
let (_dir, db) = open_wal_group("write-one-persistent");
|
|
386
|
+
group.bench_function("write_one_wal_persistent", |b| {
|
|
387
|
+
b.iter(|| {
|
|
388
|
+
black_box(db.execute("CREATE (:B {n: 1})", opts()).unwrap());
|
|
389
|
+
db.sync().unwrap();
|
|
390
|
+
});
|
|
391
|
+
});
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
// --- 15. persistent read: WAL group sync -----------------------------
|
|
395
|
+
//
|
|
396
|
+
// Read-heavy workload against a WAL-backed DB. Reads should not touch
|
|
397
|
+
// the recorder, so this should track `scan_1k` (#1) ± noise. A
|
|
398
|
+
// regression here without one in `scan_1k` points at the WAL recorder
|
|
399
|
+
// leaking into the read path (e.g. an extra guard or fence taken on
|
|
400
|
+
// every MATCH).
|
|
401
|
+
{
|
|
402
|
+
let (_dir, db) = open_wal_group("scan-wal");
|
|
403
|
+
db.execute(
|
|
404
|
+
"UNWIND range(1, 1000) AS i CREATE (:Node {id: i, value: i % 100})",
|
|
405
|
+
opts(),
|
|
406
|
+
)
|
|
407
|
+
.unwrap();
|
|
408
|
+
group.bench_function("scan_1k_wal_group", |b| {
|
|
409
|
+
b.iter(|| {
|
|
410
|
+
black_box(db.execute("MATCH (n:Node) RETURN n.id", opts()).unwrap());
|
|
411
|
+
});
|
|
412
|
+
});
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
// --- 16. persistent batched delete: WAL group sync -------------------
|
|
416
|
+
//
|
|
417
|
+
// MATCH + DELETE on 100 nodes against a freshly seeded DB. Exercises
|
|
418
|
+
// the WAL node-tombstone record path, which is distinct from the
|
|
419
|
+
// node-create path that #11/#12 cover. Fresh DB per iteration since
|
|
420
|
+
// each batch consumes the seed.
|
|
421
|
+
group.bench_function("delete_100_wal_group", |b| {
|
|
422
|
+
b.iter_batched(
|
|
423
|
+
|| {
|
|
424
|
+
let (dir, db) = open_wal_group("delete-100");
|
|
425
|
+
db.execute("UNWIND range(1, 100) AS i CREATE (:D {id: i})", opts())
|
|
426
|
+
.unwrap();
|
|
427
|
+
(dir, db)
|
|
428
|
+
},
|
|
429
|
+
|(_dir, db)| {
|
|
430
|
+
black_box(db.execute("MATCH (n:D) DELETE n", opts()).unwrap());
|
|
431
|
+
},
|
|
432
|
+
BatchSize::SmallInput,
|
|
433
|
+
);
|
|
434
|
+
});
|
|
435
|
+
|
|
436
|
+
// --- 17. persistent property update: WAL group sync ------------------
|
|
437
|
+
//
|
|
438
|
+
// MATCH + SET on 100 nodes — exercises the property-mutation WAL
|
|
439
|
+
// record path (distinct from create/delete). DB is shared across
|
|
440
|
+
// iterations: each SET re-stamps the same property and appends one
|
|
441
|
+
// batched commit record, giving a steady-state cost per iteration.
|
|
442
|
+
{
|
|
443
|
+
let (_dir, db) = open_wal_group("update-100");
|
|
444
|
+
db.execute("UNWIND range(1, 100) AS i CREATE (:U {id: i})", opts())
|
|
445
|
+
.unwrap();
|
|
446
|
+
group.bench_function("update_100_wal_group", |b| {
|
|
447
|
+
b.iter(|| {
|
|
448
|
+
black_box(
|
|
449
|
+
db.execute("MATCH (n:U) SET n.touched = true", opts())
|
|
450
|
+
.unwrap(),
|
|
451
|
+
);
|
|
452
|
+
});
|
|
453
|
+
});
|
|
454
|
+
}
|
|
455
|
+
|
|
456
|
+
// --- 18. WAL replay on open ------------------------------------------
|
|
457
|
+
//
|
|
458
|
+
// Open a WAL directory that already has 100 committed records and
|
|
459
|
+
// measure how long the replay-on-open path takes. Bounds startup time
|
|
460
|
+
// on a crash-recovery boot. The WAL is built once outside the iter and
|
|
461
|
+
// its scratch directory is `mem::forget`-ed so the files stay alive
|
|
462
|
+
// across every Criterion iteration (the OS reclaims at process exit).
|
|
463
|
+
{
|
|
464
|
+
let dir = WalScratch::new("replay-100");
|
|
465
|
+
{
|
|
466
|
+
let cfg = WalConfig::Enabled {
|
|
467
|
+
dir: dir.path.clone(),
|
|
468
|
+
sync_mode: SyncMode::GroupSync { interval_ms: 50 },
|
|
469
|
+
segment_target_bytes: 8 * 1024 * 1024,
|
|
470
|
+
};
|
|
471
|
+
let db = Database::open_with_wal(cfg).unwrap();
|
|
472
|
+
for _ in 0..100 {
|
|
473
|
+
db.execute("CREATE (:R {n: 1})", opts()).unwrap();
|
|
474
|
+
}
|
|
475
|
+
drop(db);
|
|
476
|
+
}
|
|
477
|
+
let path = dir.path.clone();
|
|
478
|
+
std::mem::forget(dir);
|
|
479
|
+
group.bench_function("wal_replay_100", |b| {
|
|
480
|
+
b.iter(|| {
|
|
481
|
+
let cfg = WalConfig::Enabled {
|
|
482
|
+
dir: path.clone(),
|
|
483
|
+
sync_mode: SyncMode::GroupSync { interval_ms: 50 },
|
|
484
|
+
segment_target_bytes: 8 * 1024 * 1024,
|
|
485
|
+
};
|
|
486
|
+
let db = Database::open_with_wal(cfg).unwrap();
|
|
487
|
+
black_box(db.node_count());
|
|
488
|
+
});
|
|
489
|
+
});
|
|
490
|
+
}
|
|
491
|
+
|
|
266
492
|
group.finish();
|
|
267
493
|
}
|
|
268
494
|
|