@feltdb/core 0.4.11 → 0.4.13
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.
- package/dist/cli/commands.js +5 -2
- package/dist/cli/index.js +1 -1
- package/dist/create/cli.js +16 -1
- package/dist/create/create.js +30 -16
- package/dist/create/docker-compose-generator.js +48 -9
- package/dist/create/package-versions.js +1 -1
- package/dist/create/server-source/Cargo.lock +2238 -0
- package/dist/create/server-source/Cargo.toml +7 -0
- package/dist/create/server-source/crates/feltdb/Cargo.lock +175 -0
- package/dist/create/server-source/crates/feltdb/Cargo.toml +79 -0
- package/dist/create/server-source/crates/feltdb/benches/baselines/gate-13-redux.json +370 -0
- package/dist/create/server-source/crates/feltdb/benches/gate13_baseline.rs +589 -0
- package/dist/create/server-source/crates/feltdb/benches/gate13_phase_7_1_release_economics.rs +259 -0
- package/dist/create/server-source/crates/feltdb/benches/gate_13_redux.rs +446 -0
- package/dist/create/server-source/crates/feltdb/benches/gate_13_regression_runner.rs +272 -0
- package/dist/create/server-source/crates/feltdb/benches/gate_14a_concurrent_writer_scaling.rs +378 -0
- package/dist/create/server-source/crates/feltdb/benches/gate_14a_production_admission_revalidation.rs +414 -0
- package/dist/create/server-source/crates/feltdb/benches/gate_14a_rc2_admission_contract.rs +486 -0
- package/dist/create/server-source/crates/feltdb/benches/gate_14a_rc_root_cause.rs +273 -0
- package/dist/create/server-source/crates/feltdb/benches/gate_14a_sync1_queued_prototype.rs +587 -0
- package/dist/create/server-source/crates/feltdb/benches/gate_14a_sync_economics.rs +513 -0
- package/dist/create/server-source/crates/feltdb/benches/gate_14b_causal_backlog_scaling.rs +395 -0
- package/dist/create/server-source/crates/feltdb/benches/gate_14c_replication_contract_test.rs +469 -0
- package/dist/create/server-source/crates/feltdb/benches/gate_14c_replication_scaling.rs +409 -0
- package/dist/create/server-source/crates/feltdb/benches/gate_14d_combined_dimension_scaling.rs +627 -0
- package/dist/create/server-source/crates/feltdb/benches/phase_7_1_2_optimization_benchmark.rs +383 -0
- package/dist/create/server-source/crates/feltdb/benches/phase_7_1_3_crossover_analysis.rs +298 -0
- package/dist/create/server-source/crates/feltdb/src/acceptance_tests.rs +1698 -0
- package/dist/create/server-source/crates/feltdb/src/acquisition.rs +286 -0
- package/dist/create/server-source/crates/feltdb/src/admission.rs +192 -0
- package/dist/create/server-source/crates/feltdb/src/admission_contract_tests.rs +477 -0
- package/dist/create/server-source/crates/feltdb/src/adversarial_transport.rs +566 -0
- package/dist/create/server-source/crates/feltdb/src/analytics.rs +475 -0
- package/dist/create/server-source/crates/feltdb/src/application.rs +2244 -0
- package/dist/create/server-source/crates/feltdb/src/application_runtime.rs +1070 -0
- package/dist/create/server-source/crates/feltdb/src/authorization.rs +1030 -0
- package/dist/create/server-source/crates/feltdb/src/bin/feltdb_node.rs +266 -0
- package/dist/create/server-source/crates/feltdb/src/capabilities/mod.rs +8 -0
- package/dist/create/server-source/crates/feltdb/src/capabilities/search.rs +418 -0
- package/dist/create/server-source/crates/feltdb/src/capabilities/vector.rs +482 -0
- package/dist/create/server-source/crates/feltdb/src/capability.rs +903 -0
- package/dist/create/server-source/crates/feltdb/src/cardinality_diagnostics.rs +261 -0
- package/dist/create/server-source/crates/feltdb/src/cardinality_endpoint.rs +78 -0
- package/dist/create/server-source/crates/feltdb/src/causal_dependency_barrier.rs +2214 -0
- package/dist/create/server-source/crates/feltdb/src/causal_dependency_barrier_phase_7_1.rs +194 -0
- package/dist/create/server-source/crates/feltdb/src/concurrency_fuzzing.rs +427 -0
- package/dist/create/server-source/crates/feltdb/src/consistency_contract.rs +453 -0
- package/dist/create/server-source/crates/feltdb/src/content_distribution.rs +465 -0
- package/dist/create/server-source/crates/feltdb/src/convergence.rs +618 -0
- package/dist/create/server-source/crates/feltdb/src/crash_atomic_boundary.rs +418 -0
- package/dist/create/server-source/crates/feltdb/src/crash_injection.rs +380 -0
- package/dist/create/server-source/crates/feltdb/src/crash_recovery_tests.rs +362 -0
- package/dist/create/server-source/crates/feltdb/src/cron.rs +294 -0
- package/dist/create/server-source/crates/feltdb/src/distributed_indexing.rs +474 -0
- package/dist/create/server-source/crates/feltdb/src/distributed_tests.rs +1003 -0
- package/dist/create/server-source/crates/feltdb/src/distributed_transactions.rs +536 -0
- package/dist/create/server-source/crates/feltdb/src/durability_guarantees.rs +364 -0
- package/dist/create/server-source/crates/feltdb/src/durable_dedup_set.rs +235 -0
- package/dist/create/server-source/crates/feltdb/src/durable_operation_log.rs +207 -0
- package/dist/create/server-source/crates/feltdb/src/durable_sync.rs +316 -0
- package/dist/create/server-source/crates/feltdb/src/execution.rs +426 -0
- package/dist/create/server-source/crates/feltdb/src/in_process_transport.rs +219 -0
- package/dist/create/server-source/crates/feltdb/src/indexing.rs +779 -0
- package/dist/create/server-source/crates/feltdb/src/lib.rs +2838 -0
- package/dist/create/server-source/crates/feltdb/src/materialization.rs +184 -0
- package/dist/create/server-source/crates/feltdb/src/metrics.rs +267 -0
- package/dist/create/server-source/crates/feltdb/src/multi_node_convergence.rs +311 -0
- package/dist/create/server-source/crates/feltdb/src/observability.rs +366 -0
- package/dist/create/server-source/crates/feltdb/src/operation.rs +251 -0
- package/dist/create/server-source/crates/feltdb/src/operation_algebra.rs +438 -0
- package/dist/create/server-source/crates/feltdb/src/operation_log.rs +344 -0
- package/dist/create/server-source/crates/feltdb/src/partition_reconciliation.rs +477 -0
- package/dist/create/server-source/crates/feltdb/src/peer_registry.rs +166 -0
- package/dist/create/server-source/crates/feltdb/src/permutation_scheduler.rs +261 -0
- package/dist/create/server-source/crates/feltdb/src/persistence_reality.rs +560 -0
- package/dist/create/server-source/crates/feltdb/src/phase1b_acceptance.rs +3226 -0
- package/dist/create/server-source/crates/feltdb/src/phase1c1_acceptance.rs +201 -0
- package/dist/create/server-source/crates/feltdb/src/phase1c2_acceptance.rs +263 -0
- package/dist/create/server-source/crates/feltdb/src/phase1c3_acceptance.rs +484 -0
- package/dist/create/server-source/crates/feltdb/src/phase1c_atomicity_proof.rs +216 -0
- package/dist/create/server-source/crates/feltdb/src/phase5_integration.rs +281 -0
- package/dist/create/server-source/crates/feltdb/src/phase5_scenarios.rs +323 -0
- package/dist/create/server-source/crates/feltdb/src/phase6_adversarial_scenarios.rs +573 -0
- package/dist/create/server-source/crates/feltdb/src/phase6_convergence_validator.rs +404 -0
- package/dist/create/server-source/crates/feltdb/src/phase6_persistence.rs +418 -0
- package/dist/create/server-source/crates/feltdb/src/phase_1c_real_tcp.rs +381 -0
- package/dist/create/server-source/crates/feltdb/src/phase_1c_three_node.rs +523 -0
- package/dist/create/server-source/crates/feltdb/src/phase_2a_failures.rs +334 -0
- package/dist/create/server-source/crates/feltdb/src/phase_2b_network.rs +306 -0
- package/dist/create/server-source/crates/feltdb/src/phase_2c_cascading.rs +355 -0
- package/dist/create/server-source/crates/feltdb/src/phase_3_durability.rs +395 -0
- package/dist/create/server-source/crates/feltdb/src/phase_4_baseline.rs +346 -0
- package/dist/create/server-source/crates/feltdb/src/phase_5_soak.rs +430 -0
- package/dist/create/server-source/crates/feltdb/src/production_api.rs +400 -0
- package/dist/create/server-source/crates/feltdb/src/provenance.rs +207 -0
- package/dist/create/server-source/crates/feltdb/src/query_performance.rs +217 -0
- package/dist/create/server-source/crates/feltdb/src/references.rs +404 -0
- package/dist/create/server-source/crates/feltdb/src/replay_fuzzing.rs +401 -0
- package/dist/create/server-source/crates/feltdb/src/replication_manager.rs +160 -0
- package/dist/create/server-source/crates/feltdb/src/replication_protocol.rs +132 -0
- package/dist/create/server-source/crates/feltdb/src/routing.rs +409 -0
- package/dist/create/server-source/crates/feltdb/src/sharding.rs +523 -0
- package/dist/create/server-source/crates/feltdb/src/state_contract.rs +3118 -0
- package/dist/create/server-source/crates/feltdb/src/state_hash.rs +291 -0
- package/dist/create/server-source/crates/feltdb/src/state_transition_store.rs +376 -0
- package/dist/create/server-source/crates/feltdb/src/storage.rs +267 -0
- package/dist/create/server-source/crates/feltdb/src/submission.rs +477 -0
- package/dist/create/server-source/crates/feltdb/src/sync.rs +483 -0
- package/dist/create/server-source/crates/feltdb/src/sync_contract.rs +822 -0
- package/dist/create/server-source/crates/feltdb/src/tcp_transport.rs +366 -0
- package/dist/create/server-source/crates/feltdb/src/transaction_api.rs +473 -0
- package/dist/create/server-source/crates/feltdb/src/transaction_invariants.rs +949 -0
- package/dist/create/server-source/crates/feltdb/src/transactions.rs +646 -0
- package/dist/create/server-source/crates/feltdb/src/trigger.rs +390 -0
- package/dist/create/server-source/crates/feltdb/src/worker_mesh.rs +928 -0
- package/dist/create/server-source/crates/feltdb/src/workflow.rs +713 -0
- package/dist/create/server-source/crates/feltdb/src/workflow_acceptance_tests.rs +510 -0
- package/dist/create/server-source/crates/feltdb/src/workflow_integration.rs +354 -0
- package/dist/create/server-source/crates/feltdb/src/workflow_runtime.rs +594 -0
- package/dist/create/server-source/crates/feltdb/src/workload.rs +1310 -0
- package/dist/create/server-source/crates/feltdb-server/Cargo.toml +23 -0
- package/dist/create/server-source/crates/feltdb-server/README.md +79 -0
- package/dist/create/server-source/crates/feltdb-server/src/app_state.rs +73 -0
- package/dist/create/server-source/crates/feltdb-server/src/application_contract.rs +425 -0
- package/dist/create/server-source/crates/feltdb-server/src/artifacts.rs +449 -0
- package/dist/create/server-source/crates/feltdb-server/src/audit.rs +59 -0
- package/dist/create/server-source/crates/feltdb-server/src/auth.rs +308 -0
- package/dist/create/server-source/crates/feltdb-server/src/authorization.rs +228 -0
- package/dist/create/server-source/crates/feltdb-server/src/backup.rs +416 -0
- package/dist/create/server-source/crates/feltdb-server/src/causal.rs +218 -0
- package/dist/create/server-source/crates/feltdb-server/src/certification.rs +223 -0
- package/dist/create/server-source/crates/feltdb-server/src/clock.rs +132 -0
- package/dist/create/server-source/crates/feltdb-server/src/cluster.rs +165 -0
- package/dist/create/server-source/crates/feltdb-server/src/connections.rs +1044 -0
- package/dist/create/server-source/crates/feltdb-server/src/content.rs +111 -0
- package/dist/create/server-source/crates/feltdb-server/src/identity.rs +250 -0
- package/dist/create/server-source/crates/feltdb-server/src/key_management.rs +78 -0
- package/dist/create/server-source/crates/feltdb-server/src/key_provider.rs +247 -0
- package/dist/create/server-source/crates/feltdb-server/src/leases.rs +123 -0
- package/dist/create/server-source/crates/feltdb-server/src/lib.rs +25 -0
- package/dist/create/server-source/crates/feltdb-server/src/main.rs +8715 -0
- package/dist/create/server-source/crates/feltdb-server/src/metrics.rs +97 -0
- package/dist/create/server-source/crates/feltdb-server/src/portable_bundle.rs +350 -0
- package/dist/create/server-source/crates/feltdb-server/src/principals.rs +510 -0
- package/dist/create/server-source/crates/feltdb-server/src/providers.rs +269 -0
- package/dist/create/server-source/crates/feltdb-server/src/releases.rs +2563 -0
- package/dist/create/server-source/crates/feltdb-server/src/sessions.rs +156 -0
- package/dist/create/server-source/crates/feltdb-server/src/tenancy.rs +1097 -0
- package/dist/create/server-source/crates/feltdb-server/src/versions.rs +264 -0
- package/dist/create/server-source/crates/feltdb-wasm/Cargo.toml +31 -0
- package/dist/create/server-source/crates/feltdb-wasm/src/lib.rs +1086 -0
- package/dist/create/server-source/crates/feltdb-wasm/test.db +0 -0
- package/dist/flowspec.d.ts +2 -0
- package/dist/flowspec.d.ts.map +1 -1
- package/dist/flowspec.js +28 -4
- package/dist/state-contract.d.ts +7 -1
- package/dist/state-contract.d.ts.map +1 -1
- package/dist/studio/components/ApplicationDesigner.d.ts.map +1 -1
- package/dist/studio/components/index.js +1 -1
- package/dist/studio/{components-q43NSTTH.js → components-bHTARBin.js} +160 -89
- package/dist/studio/index.js +31 -28
- package/dist/studio-app/assets/{index-DZpBoVMp.js → index-BqKquLuU.js} +8 -8
- package/dist/studio-app/index.html +1 -1
- 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);
|