lora-python 0.8.4__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.
Files changed (254) hide show
  1. {lora_python-0.8.4 → lora_python-0.8.5}/Cargo.lock +16 -16
  2. {lora_python-0.8.4 → lora_python-0.8.5}/Cargo.toml +11 -11
  3. {lora_python-0.8.4 → lora_python-0.8.5}/PKG-INFO +1 -1
  4. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-database/benches/concurrency_guard_benchmarks.rs +10 -7
  5. lora_python-0.8.5/crates/lora-database/benches/perf_smoke_baseline.json +89 -0
  6. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-database/benches/perf_smoke_benchmarks.rs +119 -2
  7. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-database/benches/wal_benchmarks.rs +160 -196
  8. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-database/src/named.rs +1 -1
  9. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-database/tests/managed_snapshots.rs +3 -1
  10. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-database/tests/wal.rs +33 -12
  11. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-executor/src/executor/immutable.rs +16 -0
  12. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-executor/src/pull/mod.rs +3 -1
  13. lora_python-0.8.5/crates/lora-wal/src/config.rs +51 -0
  14. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-wal/src/recorder/recorder.rs +4 -5
  15. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-wal/src/recorder/tests.rs +36 -7
  16. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-wal/src/replay.rs +10 -1
  17. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-wal/src/segment.rs +38 -8
  18. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-wal/src/wal/group_flusher.rs +31 -24
  19. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-wal/src/wal/mod.rs +2 -2
  20. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-wal/src/wal/tests.rs +84 -15
  21. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-wal/src/wal/wal.rs +29 -60
  22. {lora_python-0.8.4 → lora_python-0.8.5}/pyproject.toml +1 -1
  23. lora_python-0.8.4/crates/lora-database/benches/perf_smoke_baseline.json +0 -60
  24. lora_python-0.8.4/crates/lora-wal/src/config.rs +0 -65
  25. {lora_python-0.8.4 → lora_python-0.8.5}/LICENSE +0 -0
  26. {lora_python-0.8.4 → lora_python-0.8.5}/README.md +0 -0
  27. {lora_python-0.8.4 → lora_python-0.8.5}/crates/bindings/lora-python/.gitignore +0 -0
  28. {lora_python-0.8.4 → lora_python-0.8.5}/crates/bindings/lora-python/Cargo.toml +0 -0
  29. {lora_python-0.8.4 → lora_python-0.8.5}/crates/bindings/lora-python/LICENSE +0 -0
  30. {lora_python-0.8.4 → lora_python-0.8.5}/crates/bindings/lora-python/README.md +0 -0
  31. {lora_python-0.8.4 → lora_python-0.8.5}/crates/bindings/lora-python/build.rs +0 -0
  32. {lora_python-0.8.4 → lora_python-0.8.5}/crates/bindings/lora-python/examples/async_demo.py +0 -0
  33. {lora_python-0.8.4 → lora_python-0.8.5}/crates/bindings/lora-python/examples/basic.py +0 -0
  34. {lora_python-0.8.4 → lora_python-0.8.5}/crates/bindings/lora-python/src/errors.rs +0 -0
  35. {lora_python-0.8.4 → lora_python-0.8.5}/crates/bindings/lora-python/src/from_python.rs +0 -0
  36. {lora_python-0.8.4 → lora_python-0.8.5}/crates/bindings/lora-python/src/lib.rs +0 -0
  37. {lora_python-0.8.4 → lora_python-0.8.5}/crates/bindings/lora-python/src/to_python.rs +0 -0
  38. {lora_python-0.8.4 → lora_python-0.8.5}/crates/bindings/lora-python/tests/test_async.py +0 -0
  39. {lora_python-0.8.4 → lora_python-0.8.5}/crates/bindings/lora-python/tests/test_explain_profile.py +0 -0
  40. {lora_python-0.8.4 → lora_python-0.8.5}/crates/bindings/lora-python/tests/test_sync.py +0 -0
  41. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-analyzer/Cargo.toml +0 -0
  42. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-analyzer/src/analyzer/clauses.rs +0 -0
  43. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-analyzer/src/analyzer/expressions.rs +0 -0
  44. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-analyzer/src/analyzer/mod.rs +0 -0
  45. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-analyzer/src/analyzer/patterns.rs +0 -0
  46. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-analyzer/src/analyzer/state.rs +0 -0
  47. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-analyzer/src/analyzer/tests.rs +0 -0
  48. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-analyzer/src/errors.rs +0 -0
  49. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-analyzer/src/lib.rs +0 -0
  50. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-analyzer/src/resolved.rs +0 -0
  51. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-analyzer/src/scope.rs +0 -0
  52. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-analyzer/src/symbols.rs +0 -0
  53. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-analyzer/tests/error_messages.rs +0 -0
  54. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-ast/Cargo.toml +0 -0
  55. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-ast/src/ast.rs +0 -0
  56. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-ast/src/lib.rs +0 -0
  57. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-compiler/Cargo.toml +0 -0
  58. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-compiler/src/lib.rs +0 -0
  59. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-compiler/src/logical.rs +0 -0
  60. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-compiler/src/optimizer.rs +0 -0
  61. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-compiler/src/pattern.rs +0 -0
  62. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-compiler/src/physical.rs +0 -0
  63. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-compiler/src/plan_tree.rs +0 -0
  64. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-compiler/src/planner.rs +0 -0
  65. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-database/Cargo.toml +0 -0
  66. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-database/benches/advanced_benchmarks.rs +0 -0
  67. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-database/benches/concurrent_benchmarks.rs +0 -0
  68. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-database/benches/engine_benchmarks.rs +0 -0
  69. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-database/benches/fixtures.rs +0 -0
  70. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-database/benches/scale_benchmarks.rs +0 -0
  71. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-database/benches/temporal_spatial_benchmarks.rs +0 -0
  72. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-database/src/database/builder.rs +0 -0
  73. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-database/src/database/compile.rs +0 -0
  74. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-database/src/database/execute.rs +0 -0
  75. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-database/src/database/explain.rs +0 -0
  76. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-database/src/database/graph_api.rs +0 -0
  77. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-database/src/database/mod.rs +0 -0
  78. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-database/src/database/occ.rs +0 -0
  79. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-database/src/database/profile.rs +0 -0
  80. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-database/src/database/pull_mode.rs +0 -0
  81. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-database/src/database/replay.rs +0 -0
  82. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-database/src/database/stream.rs +0 -0
  83. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-database/src/database/write_guard.rs +0 -0
  84. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-database/src/durable_io.rs +0 -0
  85. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-database/src/error.rs +0 -0
  86. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-database/src/explain.rs +0 -0
  87. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-database/src/lib.rs +0 -0
  88. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-database/src/live_store.rs +0 -0
  89. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-database/src/plan_cache.rs +0 -0
  90. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-database/src/snapshot/json.rs +0 -0
  91. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-database/src/snapshot/mod.rs +0 -0
  92. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-database/src/snapshot/store.rs +0 -0
  93. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-database/src/stream.rs +0 -0
  94. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-database/src/transaction.rs +0 -0
  95. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-database/src/wal/admin.rs +0 -0
  96. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-database/src/wal/archive/format.rs +0 -0
  97. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-database/src/wal/archive/lock.rs +0 -0
  98. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-database/src/wal/archive/platform.rs +0 -0
  99. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-database/src/wal/archive/worker.rs +0 -0
  100. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-database/src/wal/archive/workspace.rs +0 -0
  101. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-database/src/wal/archive.rs +0 -0
  102. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-database/src/wal/mod.rs +0 -0
  103. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-database/src/wal/write_scope.rs +0 -0
  104. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-database/tests/advanced_queries.rs +0 -0
  105. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-database/tests/aggregation.rs +0 -0
  106. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-database/tests/backend_stub.rs +0 -0
  107. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-database/tests/binary.rs +0 -0
  108. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-database/tests/create.rs +0 -0
  109. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-database/tests/error_messages.rs +0 -0
  110. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-database/tests/errors.rs +0 -0
  111. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-database/tests/explain_profile.rs +0 -0
  112. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-database/tests/expressions.rs +0 -0
  113. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-database/tests/functions_extended.rs +0 -0
  114. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-database/tests/invariants.rs +0 -0
  115. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-database/tests/match.rs +0 -0
  116. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-database/tests/merge.rs +0 -0
  117. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-database/tests/ordering.rs +0 -0
  118. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-database/tests/parameters.rs +0 -0
  119. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-database/tests/parser.rs +0 -0
  120. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-database/tests/paths.rs +0 -0
  121. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-database/tests/projection.rs +0 -0
  122. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-database/tests/scale.rs +0 -0
  123. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-database/tests/seeds.rs +0 -0
  124. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-database/tests/snapshot.rs +0 -0
  125. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-database/tests/spatial.rs +0 -0
  126. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-database/tests/temporal.rs +0 -0
  127. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-database/tests/test_helpers.rs +0 -0
  128. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-database/tests/transactions.rs +0 -0
  129. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-database/tests/types_advanced.rs +0 -0
  130. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-database/tests/union.rs +0 -0
  131. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-database/tests/update.rs +0 -0
  132. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-database/tests/vectors.rs +0 -0
  133. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-database/tests/where_clause.rs +0 -0
  134. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-database/tests/with.rs +0 -0
  135. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-executor/Cargo.toml +0 -0
  136. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-executor/src/errors.rs +0 -0
  137. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-executor/src/eval/binops.rs +0 -0
  138. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-executor/src/eval/errors.rs +0 -0
  139. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-executor/src/eval/expr.rs +0 -0
  140. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-executor/src/eval/functions.rs +0 -0
  141. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-executor/src/eval/mod.rs +0 -0
  142. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-executor/src/eval/point.rs +0 -0
  143. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-executor/src/eval/vector.rs +0 -0
  144. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-executor/src/executor/helpers.rs +0 -0
  145. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-executor/src/executor/mod.rs +0 -0
  146. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-executor/src/executor/mutable.rs +0 -0
  147. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-executor/src/lib.rs +0 -0
  148. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-executor/src/profile.rs +0 -0
  149. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-executor/src/pull/aggregate.rs +0 -0
  150. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-executor/src/pull/columns.rs +0 -0
  151. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-executor/src/pull/context.rs +0 -0
  152. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-executor/src/pull/expand.rs +0 -0
  153. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-executor/src/pull/filter.rs +0 -0
  154. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-executor/src/pull/hydration.rs +0 -0
  155. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-executor/src/pull/mutable.rs +0 -0
  156. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-executor/src/pull/optional.rs +0 -0
  157. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-executor/src/pull/path.rs +0 -0
  158. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-executor/src/pull/projection.rs +0 -0
  159. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-executor/src/pull/scan.rs +0 -0
  160. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-executor/src/pull/shape.rs +0 -0
  161. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-executor/src/pull/sort.rs +0 -0
  162. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-executor/src/pull/source.rs +0 -0
  163. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-executor/src/pull/tests.rs +0 -0
  164. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-executor/src/pull/traits.rs +0 -0
  165. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-executor/src/pull/union.rs +0 -0
  166. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-executor/src/value.rs +0 -0
  167. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-executor/tests/error_messages.rs +0 -0
  168. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-parser/Cargo.toml +0 -0
  169. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-parser/src/cypher.pest +0 -0
  170. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-parser/src/errors.rs +0 -0
  171. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-parser/src/lib.rs +0 -0
  172. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-parser/src/parser/clauses.rs +0 -0
  173. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-parser/src/parser/expressions.rs +0 -0
  174. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-parser/src/parser/literals.rs +0 -0
  175. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-parser/src/parser/mod.rs +0 -0
  176. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-parser/src/parser/patterns.rs +0 -0
  177. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-parser/src/parser/query.rs +0 -0
  178. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-parser/src/parser/tests.rs +0 -0
  179. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-parser/src/parser/util.rs +0 -0
  180. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-parser/tests/error_messages.rs +0 -0
  181. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-snapshot/Cargo.toml +0 -0
  182. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-snapshot/src/body.rs +0 -0
  183. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-snapshot/src/codec.rs +0 -0
  184. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-snapshot/src/columnar.rs +0 -0
  185. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-snapshot/src/envelope.rs +0 -0
  186. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-snapshot/src/errors.rs +0 -0
  187. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-snapshot/src/format.rs +0 -0
  188. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-snapshot/src/lib.rs +0 -0
  189. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-snapshot/src/options.rs +0 -0
  190. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-snapshot/src/tests.rs +0 -0
  191. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-snapshot/src/transform.rs +0 -0
  192. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-snapshot/src/view.rs +0 -0
  193. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-snapshot/tests/error_messages.rs +0 -0
  194. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-store/Cargo.toml +0 -0
  195. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-store/src/lib.rs +0 -0
  196. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-store/src/lock_table.rs +0 -0
  197. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-store/src/memory/graph.rs +0 -0
  198. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-store/src/memory/impls.rs +0 -0
  199. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-store/src/memory/mod.rs +0 -0
  200. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-store/src/memory/property_index.rs +0 -0
  201. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-store/src/memory/snapshot.rs +0 -0
  202. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-store/src/memory/tests.rs +0 -0
  203. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-store/src/mutation.rs +0 -0
  204. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-store/src/snapshot.rs +0 -0
  205. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-store/src/traits.rs +0 -0
  206. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-store/src/types/binary/mod.rs +0 -0
  207. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-store/src/types/binary/tests.rs +0 -0
  208. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-store/src/types/binary/traits.rs +0 -0
  209. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-store/src/types/binary/types.rs +0 -0
  210. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-store/src/types/graph.rs +0 -0
  211. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-store/src/types/mod.rs +0 -0
  212. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-store/src/types/property_value.rs +0 -0
  213. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-store/src/types/spatial/distance.rs +0 -0
  214. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-store/src/types/spatial/mod.rs +0 -0
  215. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-store/src/types/spatial/point.rs +0 -0
  216. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-store/src/types/spatial/srid.rs +0 -0
  217. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-store/src/types/spatial/tests.rs +0 -0
  218. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-store/src/types/temporal/calendar.rs +0 -0
  219. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-store/src/types/temporal/date.rs +0 -0
  220. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-store/src/types/temporal/datetime.rs +0 -0
  221. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-store/src/types/temporal/duration.rs +0 -0
  222. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-store/src/types/temporal/format.rs +0 -0
  223. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-store/src/types/temporal/mod.rs +0 -0
  224. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-store/src/types/temporal/parsing.rs +0 -0
  225. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-store/src/types/temporal/time.rs +0 -0
  226. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-store/src/types/vector/build.rs +0 -0
  227. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-store/src/types/vector/mod.rs +0 -0
  228. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-store/src/types/vector/similarity.rs +0 -0
  229. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-store/src/types/vector/tests.rs +0 -0
  230. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-store/src/types/vector/types.rs +0 -0
  231. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-store/tests/error_messages.rs +0 -0
  232. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-wal/Cargo.toml +0 -0
  233. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-wal/src/codec/decode.rs +0 -0
  234. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-wal/src/codec/encode.rs +0 -0
  235. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-wal/src/codec/format.rs +0 -0
  236. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-wal/src/codec/mod.rs +0 -0
  237. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-wal/src/codec/tests.rs +0 -0
  238. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-wal/src/dir.rs +0 -0
  239. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-wal/src/errors.rs +0 -0
  240. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-wal/src/io.rs +0 -0
  241. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-wal/src/lib.rs +0 -0
  242. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-wal/src/lock.rs +0 -0
  243. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-wal/src/lsn.rs +0 -0
  244. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-wal/src/record.rs +0 -0
  245. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-wal/src/recorder/errors.rs +0 -0
  246. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-wal/src/recorder/mirror.rs +0 -0
  247. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-wal/src/recorder/mod.rs +0 -0
  248. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-wal/src/testing.rs +0 -0
  249. {lora_python-0.8.4 → lora_python-0.8.5}/crates/lora-wal/tests/error_messages.rs +0 -0
  250. {lora_python-0.8.4 → lora_python-0.8.5}/python/lora_python/__init__.py +0 -0
  251. {lora_python-0.8.4 → lora_python-0.8.5}/python/lora_python/_async.py +0 -0
  252. {lora_python-0.8.4 → lora_python-0.8.5}/python/lora_python/_native.pyi +0 -0
  253. {lora_python-0.8.4 → lora_python-0.8.5}/python/lora_python/py.typed +0 -0
  254. {lora_python-0.8.4 → 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.4"
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.4"
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.4"
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.4"
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.4"
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.4"
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.4"
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.4"
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.4"
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.4"
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.4"
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.4"
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.4"
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.4"
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.4"
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.4"
987
+ version = "0.8.5"
988
988
  dependencies = [
989
989
  "anyhow",
990
990
  "lora-database",
@@ -4,7 +4,7 @@ resolver = "2"
4
4
 
5
5
  [workspace.package]
6
6
  edition = "2021"
7
- version = "0.8.4"
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.4" }
19
- lora-parser = { path = "crates/lora-parser", version = "=0.8.4" }
20
- lora-analyzer = { path = "crates/lora-analyzer", version = "=0.8.4" }
21
- lora-compiler = { path = "crates/lora-compiler", version = "=0.8.4" }
22
- lora-store = { path = "crates/lora-store", version = "=0.8.4" }
23
- lora-snapshot = { path = "crates/lora-snapshot", version = "=0.8.4", default-features = false }
24
- lora-wal = { path = "crates/lora-wal", version = "=0.8.4" }
25
- lora-executor = { path = "crates/lora-executor", version = "=0.8.4" }
26
- lora-database = { path = "crates/lora-database", version = "=0.8.4" }
27
- lora-binding-buffer = { path = "crates/bindings/lora-binding-buffer", version = "=0.8.4" }
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"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: lora-python
3
- Version: 0.8.4
3
+ Version: 0.8.5
4
4
  Classifier: Programming Language :: Rust
5
5
  Classifier: Programming Language :: Python :: 3
6
6
  Classifier: Programming Language :: Python :: 3.8
@@ -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
- // `None` isolates WAL encoding/flush-buffer overhead; cooperative Group
251
- // isolates the path that future concurrent fsync coordination will touch.
250
+ // GroupSync isolates WAL encoding/flush-buffer overhead plus background
251
+ // fsync coordination.
252
252
  {
253
- let dir = ScratchDir::new("wal-none");
254
- let db = Database::<InMemoryGraph>::open_with_wal(wal_config(&dir.path, SyncMode::None))
255
- .unwrap();
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("wal_none_create_delete_one", |b| {
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::Group { interval_ms: 50 },
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
+ }
@@ -64,7 +64,7 @@ impl Drop for WalScratch {
64
64
  }
65
65
  }
66
66
 
67
- /// Open a WAL-backed database with `SyncMode::Group`. Group sync matches
67
+ /// Open a WAL-backed database with `SyncMode::GroupSync`. Group sync matches
68
68
  /// the durability profile most embedded callers reach for — write-only
69
69
  /// on commit, background flusher fsyncs on a 50 ms interval — and keeps
70
70
  /// the bench dominated by engine + WAL append cost rather than fsync
@@ -73,7 +73,7 @@ fn open_wal_group(tag: &str) -> (WalScratch, Database<InMemoryGraph>) {
73
73
  let dir = WalScratch::new(tag);
74
74
  let cfg = WalConfig::Enabled {
75
75
  dir: dir.path.clone(),
76
- sync_mode: SyncMode::Group { interval_ms: 50 },
76
+ sync_mode: SyncMode::GroupSync { interval_ms: 50 },
77
77
  segment_target_bytes: 8 * 1024 * 1024,
78
78
  };
79
79
  let db = Database::open_with_wal(cfg).unwrap();
@@ -372,6 +372,123 @@ fn bench_perf_smoke(c: &mut Criterion) {
372
372
  });
373
373
  }
374
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
+
375
492
  group.finish();
376
493
  }
377
494