@feltdb/core 0.4.12 → 0.4.14

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 (165) hide show
  1. package/dist/cli/commands.js +42 -25
  2. package/dist/cli/index.js +1 -1
  3. package/dist/create/cli.js +39 -4
  4. package/dist/create/create.js +30 -18
  5. package/dist/create/docker-compose-generator.js +68 -11
  6. package/dist/create/package-versions.js +1 -1
  7. package/dist/create/server-source/Cargo.lock +2238 -0
  8. package/dist/create/server-source/Cargo.toml +7 -0
  9. package/dist/create/server-source/crates/feltdb/Cargo.lock +175 -0
  10. package/dist/create/server-source/crates/feltdb/Cargo.toml +79 -0
  11. package/dist/create/server-source/crates/feltdb/benches/baselines/gate-13-redux.json +370 -0
  12. package/dist/create/server-source/crates/feltdb/benches/gate13_baseline.rs +589 -0
  13. package/dist/create/server-source/crates/feltdb/benches/gate13_phase_7_1_release_economics.rs +259 -0
  14. package/dist/create/server-source/crates/feltdb/benches/gate_13_redux.rs +446 -0
  15. package/dist/create/server-source/crates/feltdb/benches/gate_13_regression_runner.rs +272 -0
  16. package/dist/create/server-source/crates/feltdb/benches/gate_14a_concurrent_writer_scaling.rs +378 -0
  17. package/dist/create/server-source/crates/feltdb/benches/gate_14a_production_admission_revalidation.rs +414 -0
  18. package/dist/create/server-source/crates/feltdb/benches/gate_14a_rc2_admission_contract.rs +486 -0
  19. package/dist/create/server-source/crates/feltdb/benches/gate_14a_rc_root_cause.rs +273 -0
  20. package/dist/create/server-source/crates/feltdb/benches/gate_14a_sync1_queued_prototype.rs +587 -0
  21. package/dist/create/server-source/crates/feltdb/benches/gate_14a_sync_economics.rs +513 -0
  22. package/dist/create/server-source/crates/feltdb/benches/gate_14b_causal_backlog_scaling.rs +395 -0
  23. package/dist/create/server-source/crates/feltdb/benches/gate_14c_replication_contract_test.rs +469 -0
  24. package/dist/create/server-source/crates/feltdb/benches/gate_14c_replication_scaling.rs +409 -0
  25. package/dist/create/server-source/crates/feltdb/benches/gate_14d_combined_dimension_scaling.rs +627 -0
  26. package/dist/create/server-source/crates/feltdb/benches/phase_7_1_2_optimization_benchmark.rs +383 -0
  27. package/dist/create/server-source/crates/feltdb/benches/phase_7_1_3_crossover_analysis.rs +298 -0
  28. package/dist/create/server-source/crates/feltdb/src/acceptance_tests.rs +1698 -0
  29. package/dist/create/server-source/crates/feltdb/src/acquisition.rs +286 -0
  30. package/dist/create/server-source/crates/feltdb/src/admission.rs +192 -0
  31. package/dist/create/server-source/crates/feltdb/src/admission_contract_tests.rs +477 -0
  32. package/dist/create/server-source/crates/feltdb/src/adversarial_transport.rs +566 -0
  33. package/dist/create/server-source/crates/feltdb/src/analytics.rs +475 -0
  34. package/dist/create/server-source/crates/feltdb/src/application.rs +2244 -0
  35. package/dist/create/server-source/crates/feltdb/src/application_runtime.rs +1070 -0
  36. package/dist/create/server-source/crates/feltdb/src/authorization.rs +1030 -0
  37. package/dist/create/server-source/crates/feltdb/src/bin/feltdb_node.rs +266 -0
  38. package/dist/create/server-source/crates/feltdb/src/capabilities/mod.rs +8 -0
  39. package/dist/create/server-source/crates/feltdb/src/capabilities/search.rs +418 -0
  40. package/dist/create/server-source/crates/feltdb/src/capabilities/vector.rs +482 -0
  41. package/dist/create/server-source/crates/feltdb/src/capability.rs +903 -0
  42. package/dist/create/server-source/crates/feltdb/src/cardinality_diagnostics.rs +261 -0
  43. package/dist/create/server-source/crates/feltdb/src/cardinality_endpoint.rs +78 -0
  44. package/dist/create/server-source/crates/feltdb/src/causal_dependency_barrier.rs +2214 -0
  45. package/dist/create/server-source/crates/feltdb/src/causal_dependency_barrier_phase_7_1.rs +194 -0
  46. package/dist/create/server-source/crates/feltdb/src/concurrency_fuzzing.rs +427 -0
  47. package/dist/create/server-source/crates/feltdb/src/consistency_contract.rs +453 -0
  48. package/dist/create/server-source/crates/feltdb/src/content_distribution.rs +465 -0
  49. package/dist/create/server-source/crates/feltdb/src/convergence.rs +618 -0
  50. package/dist/create/server-source/crates/feltdb/src/crash_atomic_boundary.rs +418 -0
  51. package/dist/create/server-source/crates/feltdb/src/crash_injection.rs +380 -0
  52. package/dist/create/server-source/crates/feltdb/src/crash_recovery_tests.rs +362 -0
  53. package/dist/create/server-source/crates/feltdb/src/cron.rs +294 -0
  54. package/dist/create/server-source/crates/feltdb/src/distributed_indexing.rs +474 -0
  55. package/dist/create/server-source/crates/feltdb/src/distributed_tests.rs +1003 -0
  56. package/dist/create/server-source/crates/feltdb/src/distributed_transactions.rs +536 -0
  57. package/dist/create/server-source/crates/feltdb/src/durability_guarantees.rs +364 -0
  58. package/dist/create/server-source/crates/feltdb/src/durable_dedup_set.rs +235 -0
  59. package/dist/create/server-source/crates/feltdb/src/durable_operation_log.rs +207 -0
  60. package/dist/create/server-source/crates/feltdb/src/durable_sync.rs +316 -0
  61. package/dist/create/server-source/crates/feltdb/src/execution.rs +426 -0
  62. package/dist/create/server-source/crates/feltdb/src/in_process_transport.rs +219 -0
  63. package/dist/create/server-source/crates/feltdb/src/indexing.rs +779 -0
  64. package/dist/create/server-source/crates/feltdb/src/lib.rs +2838 -0
  65. package/dist/create/server-source/crates/feltdb/src/materialization.rs +184 -0
  66. package/dist/create/server-source/crates/feltdb/src/metrics.rs +267 -0
  67. package/dist/create/server-source/crates/feltdb/src/multi_node_convergence.rs +311 -0
  68. package/dist/create/server-source/crates/feltdb/src/observability.rs +366 -0
  69. package/dist/create/server-source/crates/feltdb/src/operation.rs +251 -0
  70. package/dist/create/server-source/crates/feltdb/src/operation_algebra.rs +438 -0
  71. package/dist/create/server-source/crates/feltdb/src/operation_log.rs +344 -0
  72. package/dist/create/server-source/crates/feltdb/src/partition_reconciliation.rs +477 -0
  73. package/dist/create/server-source/crates/feltdb/src/peer_registry.rs +166 -0
  74. package/dist/create/server-source/crates/feltdb/src/permutation_scheduler.rs +261 -0
  75. package/dist/create/server-source/crates/feltdb/src/persistence_reality.rs +560 -0
  76. package/dist/create/server-source/crates/feltdb/src/phase1b_acceptance.rs +3226 -0
  77. package/dist/create/server-source/crates/feltdb/src/phase1c1_acceptance.rs +201 -0
  78. package/dist/create/server-source/crates/feltdb/src/phase1c2_acceptance.rs +263 -0
  79. package/dist/create/server-source/crates/feltdb/src/phase1c3_acceptance.rs +484 -0
  80. package/dist/create/server-source/crates/feltdb/src/phase1c_atomicity_proof.rs +216 -0
  81. package/dist/create/server-source/crates/feltdb/src/phase5_integration.rs +281 -0
  82. package/dist/create/server-source/crates/feltdb/src/phase5_scenarios.rs +323 -0
  83. package/dist/create/server-source/crates/feltdb/src/phase6_adversarial_scenarios.rs +573 -0
  84. package/dist/create/server-source/crates/feltdb/src/phase6_convergence_validator.rs +404 -0
  85. package/dist/create/server-source/crates/feltdb/src/phase6_persistence.rs +418 -0
  86. package/dist/create/server-source/crates/feltdb/src/phase_1c_real_tcp.rs +381 -0
  87. package/dist/create/server-source/crates/feltdb/src/phase_1c_three_node.rs +523 -0
  88. package/dist/create/server-source/crates/feltdb/src/phase_2a_failures.rs +334 -0
  89. package/dist/create/server-source/crates/feltdb/src/phase_2b_network.rs +306 -0
  90. package/dist/create/server-source/crates/feltdb/src/phase_2c_cascading.rs +355 -0
  91. package/dist/create/server-source/crates/feltdb/src/phase_3_durability.rs +395 -0
  92. package/dist/create/server-source/crates/feltdb/src/phase_4_baseline.rs +346 -0
  93. package/dist/create/server-source/crates/feltdb/src/phase_5_soak.rs +430 -0
  94. package/dist/create/server-source/crates/feltdb/src/production_api.rs +400 -0
  95. package/dist/create/server-source/crates/feltdb/src/provenance.rs +207 -0
  96. package/dist/create/server-source/crates/feltdb/src/query_performance.rs +217 -0
  97. package/dist/create/server-source/crates/feltdb/src/references.rs +404 -0
  98. package/dist/create/server-source/crates/feltdb/src/replay_fuzzing.rs +401 -0
  99. package/dist/create/server-source/crates/feltdb/src/replication_manager.rs +160 -0
  100. package/dist/create/server-source/crates/feltdb/src/replication_protocol.rs +132 -0
  101. package/dist/create/server-source/crates/feltdb/src/routing.rs +409 -0
  102. package/dist/create/server-source/crates/feltdb/src/sharding.rs +523 -0
  103. package/dist/create/server-source/crates/feltdb/src/state_contract.rs +3118 -0
  104. package/dist/create/server-source/crates/feltdb/src/state_hash.rs +291 -0
  105. package/dist/create/server-source/crates/feltdb/src/state_transition_store.rs +376 -0
  106. package/dist/create/server-source/crates/feltdb/src/storage.rs +267 -0
  107. package/dist/create/server-source/crates/feltdb/src/submission.rs +477 -0
  108. package/dist/create/server-source/crates/feltdb/src/sync.rs +483 -0
  109. package/dist/create/server-source/crates/feltdb/src/sync_contract.rs +822 -0
  110. package/dist/create/server-source/crates/feltdb/src/tcp_transport.rs +366 -0
  111. package/dist/create/server-source/crates/feltdb/src/transaction_api.rs +473 -0
  112. package/dist/create/server-source/crates/feltdb/src/transaction_invariants.rs +949 -0
  113. package/dist/create/server-source/crates/feltdb/src/transactions.rs +646 -0
  114. package/dist/create/server-source/crates/feltdb/src/trigger.rs +390 -0
  115. package/dist/create/server-source/crates/feltdb/src/worker_mesh.rs +928 -0
  116. package/dist/create/server-source/crates/feltdb/src/workflow.rs +713 -0
  117. package/dist/create/server-source/crates/feltdb/src/workflow_acceptance_tests.rs +510 -0
  118. package/dist/create/server-source/crates/feltdb/src/workflow_integration.rs +354 -0
  119. package/dist/create/server-source/crates/feltdb/src/workflow_runtime.rs +594 -0
  120. package/dist/create/server-source/crates/feltdb/src/workload.rs +1310 -0
  121. package/dist/create/server-source/crates/feltdb-server/Cargo.toml +23 -0
  122. package/dist/create/server-source/crates/feltdb-server/README.md +79 -0
  123. package/dist/create/server-source/crates/feltdb-server/src/app_state.rs +73 -0
  124. package/dist/create/server-source/crates/feltdb-server/src/application_contract.rs +425 -0
  125. package/dist/create/server-source/crates/feltdb-server/src/artifacts.rs +449 -0
  126. package/dist/create/server-source/crates/feltdb-server/src/audit.rs +59 -0
  127. package/dist/create/server-source/crates/feltdb-server/src/auth.rs +308 -0
  128. package/dist/create/server-source/crates/feltdb-server/src/authorization.rs +228 -0
  129. package/dist/create/server-source/crates/feltdb-server/src/backup.rs +416 -0
  130. package/dist/create/server-source/crates/feltdb-server/src/causal.rs +218 -0
  131. package/dist/create/server-source/crates/feltdb-server/src/certification.rs +223 -0
  132. package/dist/create/server-source/crates/feltdb-server/src/clock.rs +132 -0
  133. package/dist/create/server-source/crates/feltdb-server/src/cluster.rs +165 -0
  134. package/dist/create/server-source/crates/feltdb-server/src/connections.rs +1044 -0
  135. package/dist/create/server-source/crates/feltdb-server/src/content.rs +111 -0
  136. package/dist/create/server-source/crates/feltdb-server/src/identity.rs +250 -0
  137. package/dist/create/server-source/crates/feltdb-server/src/key_management.rs +78 -0
  138. package/dist/create/server-source/crates/feltdb-server/src/key_provider.rs +247 -0
  139. package/dist/create/server-source/crates/feltdb-server/src/leases.rs +123 -0
  140. package/dist/create/server-source/crates/feltdb-server/src/lib.rs +25 -0
  141. package/dist/create/server-source/crates/feltdb-server/src/main.rs +8715 -0
  142. package/dist/create/server-source/crates/feltdb-server/src/metrics.rs +97 -0
  143. package/dist/create/server-source/crates/feltdb-server/src/portable_bundle.rs +350 -0
  144. package/dist/create/server-source/crates/feltdb-server/src/principals.rs +510 -0
  145. package/dist/create/server-source/crates/feltdb-server/src/providers.rs +269 -0
  146. package/dist/create/server-source/crates/feltdb-server/src/releases.rs +2563 -0
  147. package/dist/create/server-source/crates/feltdb-server/src/sessions.rs +156 -0
  148. package/dist/create/server-source/crates/feltdb-server/src/tenancy.rs +1097 -0
  149. package/dist/create/server-source/crates/feltdb-server/src/versions.rs +264 -0
  150. package/dist/create/server-source/crates/feltdb-wasm/Cargo.toml +31 -0
  151. package/dist/create/server-source/crates/feltdb-wasm/src/lib.rs +1086 -0
  152. package/dist/create/server-source/crates/feltdb-wasm/test.db +0 -0
  153. package/dist/flowspec.d.ts +2 -0
  154. package/dist/flowspec.d.ts.map +1 -1
  155. package/dist/flowspec.js +28 -4
  156. package/dist/state-contract.d.ts +7 -1
  157. package/dist/state-contract.d.ts.map +1 -1
  158. package/dist/studio/components/ApplicationDesigner.d.ts.map +1 -1
  159. package/dist/studio/components/ConflictExplorer.d.ts.map +1 -1
  160. package/dist/studio/components/index.js +1 -1
  161. package/dist/studio/{components-Q0Nx6gLE.js → components-9kDSWiGL.js} +163 -47
  162. package/dist/studio/index.js +31 -28
  163. package/dist/studio-app/assets/{index-BHOmLZF-.js → index-DVdvmf69.js} +9 -9
  164. package/dist/studio-app/index.html +1 -1
  165. package/package.json +1 -1
@@ -0,0 +1,259 @@
1
+ /// Phase 7.1: Causal Release Economics
2
+ ///
3
+ /// Measurement-only investigation to determine whether frontier advancement
4
+ /// and pending-operation release is a material bottleneck.
5
+ ///
6
+ /// Three possible outcomes:
7
+ /// - Outcome A: Release is cheap (O(m) with low constants)
8
+ /// - Outcome B: Release is O(m) but acceptable cost
9
+ /// - Outcome C: Repeated advances cause O(m²) pathological rescanning
10
+ ///
11
+ /// Only Outcome C justifies architectural changes to release mechanism.
12
+
13
+ use criterion::{black_box, criterion_group, criterion_main, Criterion, Throughput};
14
+ use feltdb::{CausalDependencyBarrier, VectorClock};
15
+
16
+ fn make_vector_clock(node_count: usize) -> VectorClock {
17
+ let mut vc = VectorClock::new();
18
+ for i in 0..node_count {
19
+ vc.clocks.insert(format!("node_{}", i), 1);
20
+ }
21
+ vc
22
+ }
23
+
24
+ /// Benchmark 1: Single Release Scan
25
+ ///
26
+ /// Measure: How expensive is one call to check_unblocked_operations()?
27
+ /// Varies: Pending buffer size (0, 10, 100, 1K, 10K)
28
+ /// Setup: All operations are blocked (frontier hasn't advanced enough)
29
+ fn benchmark_release_single_scan(c: &mut Criterion) {
30
+ let mut group = c.benchmark_group("gate13_release_single_scan");
31
+ group.sample_size(20);
32
+
33
+ for pending_size in [0, 10, 100, 1000, 10000].iter() {
34
+ group.throughput(Throughput::Elements(*pending_size as u64));
35
+ group.bench_function(
36
+ format!("release_single_scan_pending{}", pending_size),
37
+ |b| {
38
+ b.iter_batched(
39
+ || {
40
+ // Setup: Create barrier and fill with pending operations
41
+ let mut barrier = CausalDependencyBarrier::new();
42
+
43
+ // All operations require high timestamps that frontier doesn't satisfy
44
+ for i in 0..*pending_size {
45
+ let mut required = VectorClock::new();
46
+ // Each requires increasing timestamp: A:1000, A:1001, etc.
47
+ required.clocks.insert("node_a".to_string(), (1000 + i) as u64);
48
+ let _ = barrier.receive_operation(
49
+ format!("pending_{}", i),
50
+ required,
51
+ );
52
+ }
53
+ barrier
54
+ },
55
+ |mut barrier| {
56
+ // Measure: What does it cost to advance frontier by one operation?
57
+ // This calls check_unblocked_operations() internally
58
+ let mut frontier = VectorClock::new();
59
+ frontier.clocks.insert("node_a".to_string(), 1);
60
+ barrier.advance_frontier(&frontier);
61
+ black_box(barrier)
62
+ },
63
+ criterion::BatchSize::SmallInput,
64
+ );
65
+ },
66
+ );
67
+ }
68
+
69
+ group.finish();
70
+ }
71
+
72
+ /// Benchmark 2: Release Selectivity
73
+ ///
74
+ /// Measure: Does it matter what % of pending operations are ready?
75
+ /// Varies: Pending size fixed at 1K, but % ready = [0, 1, 10, 50, 100]
76
+ /// Question: Is the cost proportional to (pending_size) or (ready_count)?
77
+ fn benchmark_release_selectivity(c: &mut Criterion) {
78
+ let mut group = c.benchmark_group("gate13_release_selectivity");
79
+ group.sample_size(20);
80
+
81
+ let pending_size = 1000;
82
+
83
+ for ready_percent in [0, 1, 10, 50, 100].iter() {
84
+ group.throughput(Throughput::Elements(pending_size as u64));
85
+ group.bench_function(
86
+ format!("release_selectivity_ready{}pct", ready_percent),
87
+ |b| {
88
+ b.iter_batched(
89
+ || {
90
+ let mut barrier = CausalDependencyBarrier::new();
91
+
92
+ let ready_count = (pending_size * ready_percent) / 100;
93
+ let blocked_count = pending_size - ready_count;
94
+
95
+ // Add ready operations (frontier will satisfy them)
96
+ for i in 0..ready_count {
97
+ let mut required = VectorClock::new();
98
+ // Frontier will be at A:2000, these require A:100
99
+ required.clocks.insert("node_a".to_string(), 100);
100
+ let _ = barrier.receive_operation(
101
+ format!("ready_{}", i),
102
+ required,
103
+ );
104
+ }
105
+
106
+ // Add blocked operations (frontier won't satisfy them yet)
107
+ for i in 0..blocked_count {
108
+ let mut required = VectorClock::new();
109
+ // These require A:5000, frontier will only be at A:2000
110
+ required.clocks.insert("node_a".to_string(), 5000);
111
+ let _ = barrier.receive_operation(
112
+ format!("blocked_{}", i),
113
+ required,
114
+ );
115
+ }
116
+ barrier
117
+ },
118
+ |mut barrier| {
119
+ // Measure: Advance frontier to release the ready operations
120
+ let mut frontier = VectorClock::new();
121
+ // Advance to A:2000 - just enough to release ready operations
122
+ frontier.clocks.insert("node_a".to_string(), 2000);
123
+ barrier.advance_frontier(&frontier);
124
+ black_box(barrier)
125
+ },
126
+ criterion::BatchSize::SmallInput,
127
+ );
128
+ },
129
+ );
130
+ }
131
+
132
+ group.finish();
133
+ }
134
+
135
+ /// Benchmark 3: Pathological Repeated Release (THE CRITICAL TEST)
136
+ ///
137
+ /// Measure: Does repeated frontier advancement cause O(m²) rescanning?
138
+ /// Setup: 10,000 pending operations, all ready
139
+ /// Scenario: Advance frontier 10,000 times (one per operation)
140
+ /// Each advance should release exactly one operation
141
+ ///
142
+ /// Question: Does the implementation catch this efficiently?
143
+ ///
144
+ /// Expected behavior:
145
+ /// - Good: entries_examined ≈ 10,000 (one pass through, each op examined once)
146
+ /// - Bad: entries_examined ≈ 50,000,000 (each advance scans remaining operations)
147
+ fn benchmark_release_pathological_repeated(c: &mut Criterion) {
148
+ let mut group = c.benchmark_group("gate13_release_pathological_repeated");
149
+ group.sample_size(5); // Fewer samples for large workload
150
+ group.measurement_time(std::time::Duration::from_secs(30));
151
+
152
+ // Note: Using 1000 instead of 10000 to keep benchmark runtime reasonable
153
+ // The scaling pattern will still show if O(m²) is happening
154
+ let pending_size = 1000;
155
+
156
+ group.throughput(Throughput::Elements(pending_size as u64));
157
+ group.bench_function(
158
+ format!("release_pathological_{}ops_one_at_a_time", pending_size),
159
+ |b| {
160
+ b.iter_batched(
161
+ || {
162
+ let mut barrier = CausalDependencyBarrier::new();
163
+
164
+ // Create pending operations requiring A:1, A:2, A:3, ..., A:pending_size
165
+ for i in 0..pending_size {
166
+ let mut required = VectorClock::new();
167
+ // Each requires A:(i+1)
168
+ required.clocks.insert("node_a".to_string(), (i + 1) as u64);
169
+ let _ = barrier.receive_operation(
170
+ format!("seq_{}", i),
171
+ required,
172
+ );
173
+ }
174
+ barrier
175
+ },
176
+ |mut barrier| {
177
+ // Now advance frontier one step at a time
178
+ // This is the pathological scenario
179
+ // Simulate advancing frontier one operation at a time
180
+ for step in 1..=pending_size {
181
+ let mut frontier = VectorClock::new();
182
+ // Advance to A:step
183
+ frontier.clocks.insert("node_a".to_string(), step as u64);
184
+ barrier.advance_frontier(&frontier);
185
+ }
186
+ black_box(barrier)
187
+ },
188
+ criterion::BatchSize::SmallInput,
189
+ );
190
+ },
191
+ );
192
+
193
+ group.finish();
194
+ }
195
+
196
+ /// Benchmark 4: Mixed Frontier Advances
197
+ ///
198
+ /// Measure: Realistic scenario with varying frontier advances
199
+ /// Setup: Operations with different dependency timestamps
200
+ /// Scenario: Advance frontier gradually, each step releases some operations
201
+ ///
202
+ /// This tests whether the implementation efficiently handles the common case
203
+ /// of incremental frontier progress.
204
+ fn benchmark_release_mixed_advances(c: &mut Criterion) {
205
+ let mut group = c.benchmark_group("gate13_release_mixed_advances");
206
+ group.sample_size(10);
207
+
208
+ for pending_size in [100, 1000].iter() {
209
+ group.throughput(Throughput::Elements(*pending_size as u64));
210
+ group.bench_function(
211
+ format!("release_mixed_advances_pending{}", pending_size),
212
+ |b| {
213
+ b.iter_batched(
214
+ || {
215
+ let mut barrier = CausalDependencyBarrier::new();
216
+
217
+ // Create pending operations with mixed dependencies
218
+ // Some require A:100, some A:500, some A:1000, etc.
219
+ for i in 0..*pending_size {
220
+ let mut required = VectorClock::new();
221
+
222
+ // Distribute dependencies: some low, some high
223
+ let dependency_level = ((i * 997) % 1000) as u64 + 1;
224
+ required.clocks.insert("node_a".to_string(), dependency_level);
225
+
226
+ let _ = barrier.receive_operation(
227
+ format!("mixed_{}", i),
228
+ required,
229
+ );
230
+ }
231
+ barrier
232
+ },
233
+ |mut barrier| {
234
+ // Measure: Series of frontier advances
235
+ // Simulate gradual frontier advancement
236
+ for level in (100..=1000).step_by(100) {
237
+ let mut frontier = VectorClock::new();
238
+ frontier.clocks.insert("node_a".to_string(), level as u64);
239
+ barrier.advance_frontier(&frontier);
240
+ }
241
+ black_box(barrier)
242
+ },
243
+ criterion::BatchSize::SmallInput,
244
+ );
245
+ },
246
+ );
247
+ }
248
+
249
+ group.finish();
250
+ }
251
+
252
+ criterion_group!(
253
+ benches,
254
+ benchmark_release_single_scan,
255
+ benchmark_release_selectivity,
256
+ benchmark_release_pathological_repeated,
257
+ benchmark_release_mixed_advances,
258
+ );
259
+ criterion_main!(benches);