@feltdb/core 0.4.12 → 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-Q0Nx6gLE.js → components-bHTARBin.js} +156 -46
- package/dist/studio/index.js +31 -28
- package/dist/studio-app/assets/{index-BHOmLZF-.js → index-BqKquLuU.js} +8 -8
- package/dist/studio-app/index.html +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,446 @@
|
|
|
1
|
+
/// Gate 13 Redux: Production-Readiness Frozen Baseline
|
|
2
|
+
///
|
|
3
|
+
/// Establishes authoritative metrics across 16 dimensions for FeltDB with Phase 7.1 optimizations.
|
|
4
|
+
/// This benchmark captures variance through multiple repetitions and serves as the reference
|
|
5
|
+
/// for regression gate thresholds. Production uses indexed release path.
|
|
6
|
+
///
|
|
7
|
+
/// Metrics captured:
|
|
8
|
+
/// 1. transactions/sec
|
|
9
|
+
/// 2. operations/sec
|
|
10
|
+
/// 3. replication ops/sec
|
|
11
|
+
/// 4. p50 / p95 / p99 latency
|
|
12
|
+
/// 5. causal readiness latency
|
|
13
|
+
/// 6. causal release latency
|
|
14
|
+
/// 7. CPU utilization
|
|
15
|
+
/// 8. memory (RSS)
|
|
16
|
+
/// 9. disk I/O
|
|
17
|
+
/// 10. dependency-index memory
|
|
18
|
+
/// 11. index maintenance cost
|
|
19
|
+
/// 12. vector clock cost
|
|
20
|
+
/// 13. deduplication cost
|
|
21
|
+
/// 14. state hashing cost
|
|
22
|
+
/// 15. snapshot cost
|
|
23
|
+
/// 16. recovery cost
|
|
24
|
+
///
|
|
25
|
+
/// This is a FROZEN baseline. No further causal barrier optimization until Gate 14
|
|
26
|
+
/// demonstrates that the causal release path has become a system bottleneck.
|
|
27
|
+
|
|
28
|
+
use criterion::{black_box, criterion_group, criterion_main, Criterion, Throughput, BenchmarkId};
|
|
29
|
+
use feltdb::{CausalDependencyBarrier, VectorClock};
|
|
30
|
+
use std::time::Instant;
|
|
31
|
+
|
|
32
|
+
// ============================================================================
|
|
33
|
+
// BASELINE FIXTURE: Helper functions for consistent workload generation
|
|
34
|
+
// ============================================================================
|
|
35
|
+
|
|
36
|
+
/// Create a vector clock with N nodes at sequential timestamps
|
|
37
|
+
fn create_vector_clock_with_nodes(node_count: usize) -> VectorClock {
|
|
38
|
+
let mut clock = VectorClock::new();
|
|
39
|
+
for i in 0..node_count {
|
|
40
|
+
clock.clocks.insert(format!("node_{}", i), (i + 1) as u64);
|
|
41
|
+
}
|
|
42
|
+
clock
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/// Create N pending operations in the barrier
|
|
46
|
+
fn populate_pending_operations(
|
|
47
|
+
barrier: &mut CausalDependencyBarrier,
|
|
48
|
+
count: usize,
|
|
49
|
+
node_count: usize,
|
|
50
|
+
) {
|
|
51
|
+
for i in 0..count {
|
|
52
|
+
let mut required = create_vector_clock_with_nodes(node_count);
|
|
53
|
+
// Make each operation depend on a node that hasn't been reached yet
|
|
54
|
+
required.clocks.insert(
|
|
55
|
+
format!("node_{}", node_count % 2),
|
|
56
|
+
(node_count * 10) as u64,
|
|
57
|
+
);
|
|
58
|
+
let _ = barrier.receive_operation(format!("op_{}", i), required);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// ============================================================================
|
|
63
|
+
// DIMENSION 1-3: Throughput Metrics (transactions/sec, operations/sec, replication ops/sec)
|
|
64
|
+
// ============================================================================
|
|
65
|
+
|
|
66
|
+
/// Measure transaction throughput: operations through the causal barrier
|
|
67
|
+
fn benchmark_transaction_throughput(c: &mut Criterion) {
|
|
68
|
+
let mut group = c.benchmark_group("gate13_redux_transaction_throughput");
|
|
69
|
+
group.sample_size(50); // Multiple samples to establish variance
|
|
70
|
+
|
|
71
|
+
for pending_count in [100, 1000, 10000].iter() {
|
|
72
|
+
group.throughput(Throughput::Elements(*pending_count as u64));
|
|
73
|
+
group.bench_with_input(
|
|
74
|
+
BenchmarkId::new("pending_ops_released", pending_count),
|
|
75
|
+
pending_count,
|
|
76
|
+
|b, &pending| {
|
|
77
|
+
b.iter_batched(
|
|
78
|
+
|| {
|
|
79
|
+
let mut barrier = CausalDependencyBarrier::new();
|
|
80
|
+
populate_pending_operations(&mut barrier, pending, 4);
|
|
81
|
+
|
|
82
|
+
// Advance frontier to release all operations
|
|
83
|
+
let mut frontier = create_vector_clock_with_nodes(4);
|
|
84
|
+
frontier.clocks.insert("node_0".to_string(), 100);
|
|
85
|
+
barrier.get_frontier_mut().merge(&frontier);
|
|
86
|
+
|
|
87
|
+
barrier
|
|
88
|
+
},
|
|
89
|
+
|mut barrier| {
|
|
90
|
+
let released = barrier.check_unblocked_operations();
|
|
91
|
+
black_box(released.len())
|
|
92
|
+
},
|
|
93
|
+
criterion::BatchSize::LargeInput,
|
|
94
|
+
);
|
|
95
|
+
},
|
|
96
|
+
);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
group.finish();
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
// ============================================================================
|
|
103
|
+
// DIMENSION 4-6: Latency Percentiles (p50, p95, p99)
|
|
104
|
+
// ============================================================================
|
|
105
|
+
|
|
106
|
+
/// Measure causal readiness latency across percentiles
|
|
107
|
+
fn benchmark_causal_readiness_latency(c: &mut Criterion) {
|
|
108
|
+
let mut group = c.benchmark_group("gate13_redux_causal_readiness");
|
|
109
|
+
group.sample_size(100); // High sample count for percentile stability
|
|
110
|
+
|
|
111
|
+
for node_count in [4, 8, 16].iter() {
|
|
112
|
+
group.bench_with_input(
|
|
113
|
+
BenchmarkId::new("readiness_check_nodes", node_count),
|
|
114
|
+
node_count,
|
|
115
|
+
|b, &nodes| {
|
|
116
|
+
let required = create_vector_clock_with_nodes(nodes);
|
|
117
|
+
b.iter(|| {
|
|
118
|
+
let mut barrier = CausalDependencyBarrier::new();
|
|
119
|
+
barrier.advance_frontier(&required);
|
|
120
|
+
let result = barrier.is_ready_frontier(black_box(&required));
|
|
121
|
+
black_box(result)
|
|
122
|
+
});
|
|
123
|
+
},
|
|
124
|
+
);
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
group.finish();
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
// ============================================================================
|
|
131
|
+
// DIMENSION 7-8: Release-Path Latency (causal readiness + release)
|
|
132
|
+
// ============================================================================
|
|
133
|
+
|
|
134
|
+
/// Measure causal release latency: full path from receive to check
|
|
135
|
+
fn benchmark_causal_release_latency(c: &mut Criterion) {
|
|
136
|
+
let mut group = c.benchmark_group("gate13_redux_causal_release");
|
|
137
|
+
group.sample_size(50); // Lower sample count; this test is expensive
|
|
138
|
+
|
|
139
|
+
for buffer_size in [100, 1000].iter() {
|
|
140
|
+
group.bench_with_input(
|
|
141
|
+
BenchmarkId::new("release_latency_buffer", buffer_size),
|
|
142
|
+
buffer_size,
|
|
143
|
+
|b, &size| {
|
|
144
|
+
b.iter_batched(
|
|
145
|
+
|| {
|
|
146
|
+
let mut barrier = CausalDependencyBarrier::new();
|
|
147
|
+
populate_pending_operations(&mut barrier, size, 4);
|
|
148
|
+
barrier
|
|
149
|
+
},
|
|
150
|
+
|mut barrier| {
|
|
151
|
+
// Measure end-to-end: frontier advance + release check
|
|
152
|
+
let mut frontier = create_vector_clock_with_nodes(4);
|
|
153
|
+
frontier.clocks.insert("node_0".to_string(), 100);
|
|
154
|
+
barrier.get_frontier_mut().merge(&frontier);
|
|
155
|
+
|
|
156
|
+
let released = barrier.check_unblocked_operations_indexed();
|
|
157
|
+
black_box(released.len())
|
|
158
|
+
},
|
|
159
|
+
criterion::BatchSize::LargeInput,
|
|
160
|
+
);
|
|
161
|
+
},
|
|
162
|
+
);
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
group.finish();
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
// ============================================================================
|
|
169
|
+
// DIMENSION 9: CPU Utilization (via operation count)
|
|
170
|
+
// ============================================================================
|
|
171
|
+
|
|
172
|
+
/// Measure CPU cost per operation through the indexed release path
|
|
173
|
+
fn benchmark_cpu_per_operation(c: &mut Criterion) {
|
|
174
|
+
let mut group = c.benchmark_group("gate13_redux_cpu_cost");
|
|
175
|
+
group.sample_size(100);
|
|
176
|
+
|
|
177
|
+
for op_count in [10, 100, 1000].iter() {
|
|
178
|
+
group.throughput(Throughput::Elements(*op_count as u64));
|
|
179
|
+
group.bench_with_input(
|
|
180
|
+
BenchmarkId::new("cpu_per_indexed_release", op_count),
|
|
181
|
+
op_count,
|
|
182
|
+
|b, &count| {
|
|
183
|
+
b.iter(|| {
|
|
184
|
+
let mut barrier = CausalDependencyBarrier::new();
|
|
185
|
+
for i in 0..count {
|
|
186
|
+
let mut required = VectorClock::new();
|
|
187
|
+
required.increment("node_0");
|
|
188
|
+
let _ = barrier.receive_operation(format!("op_{}", i), required);
|
|
189
|
+
}
|
|
190
|
+
let mut frontier = VectorClock::new();
|
|
191
|
+
frontier.increment("node_0");
|
|
192
|
+
barrier.get_frontier_mut().merge(&frontier);
|
|
193
|
+
|
|
194
|
+
black_box(barrier.check_unblocked_operations_indexed())
|
|
195
|
+
});
|
|
196
|
+
},
|
|
197
|
+
);
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
group.finish();
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
// ============================================================================
|
|
204
|
+
// DIMENSION 10: Dependency-Index Memory Overhead
|
|
205
|
+
// ============================================================================
|
|
206
|
+
|
|
207
|
+
/// Measure dependency index size as a function of pending operations
|
|
208
|
+
fn benchmark_index_memory_overhead(c: &mut Criterion) {
|
|
209
|
+
let mut group = c.benchmark_group("gate13_redux_index_memory");
|
|
210
|
+
group.sample_size(10); // Low sample; this measures steady-state
|
|
211
|
+
|
|
212
|
+
for pending_count in [100, 1000, 10000].iter() {
|
|
213
|
+
group.bench_with_input(
|
|
214
|
+
BenchmarkId::new("index_entries", pending_count),
|
|
215
|
+
pending_count,
|
|
216
|
+
|b, &count| {
|
|
217
|
+
b.iter(|| {
|
|
218
|
+
let mut barrier = CausalDependencyBarrier::new();
|
|
219
|
+
populate_pending_operations(&mut barrier, count, 4);
|
|
220
|
+
|
|
221
|
+
let index_entries = barrier.get_dependency_index().entry_count();
|
|
222
|
+
black_box(index_entries)
|
|
223
|
+
});
|
|
224
|
+
},
|
|
225
|
+
);
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
group.finish();
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
// ============================================================================
|
|
232
|
+
// DIMENSION 11: Index Maintenance Cost
|
|
233
|
+
// ============================================================================
|
|
234
|
+
|
|
235
|
+
/// Measure cost of maintaining the dependency index during operations
|
|
236
|
+
fn benchmark_index_maintenance_cost(c: &mut Criterion) {
|
|
237
|
+
let mut group = c.benchmark_group("gate13_redux_index_maintenance");
|
|
238
|
+
group.sample_size(100);
|
|
239
|
+
|
|
240
|
+
for node_count in [2, 4, 8].iter() {
|
|
241
|
+
group.throughput(Throughput::Elements(1));
|
|
242
|
+
group.bench_with_input(
|
|
243
|
+
BenchmarkId::new("receive_and_index", node_count),
|
|
244
|
+
node_count,
|
|
245
|
+
|b, &nodes| {
|
|
246
|
+
let required = create_vector_clock_with_nodes(nodes);
|
|
247
|
+
b.iter(|| {
|
|
248
|
+
let mut barrier = CausalDependencyBarrier::new();
|
|
249
|
+
let _ = barrier.receive_operation(
|
|
250
|
+
"op_test".to_string(),
|
|
251
|
+
black_box(required.clone()),
|
|
252
|
+
);
|
|
253
|
+
black_box(barrier.get_dependency_index().entry_count())
|
|
254
|
+
});
|
|
255
|
+
},
|
|
256
|
+
);
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
group.finish();
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
// ============================================================================
|
|
263
|
+
// DIMENSION 12: Vector Clock Cost
|
|
264
|
+
// ============================================================================
|
|
265
|
+
|
|
266
|
+
/// Measure vector clock operations (comparison, increment, merge)
|
|
267
|
+
fn benchmark_vector_clock_cost(c: &mut Criterion) {
|
|
268
|
+
let mut group = c.benchmark_group("gate13_redux_vector_clock");
|
|
269
|
+
group.sample_size(100);
|
|
270
|
+
|
|
271
|
+
for node_count in [1, 4, 8, 16].iter() {
|
|
272
|
+
// Increment cost
|
|
273
|
+
group.throughput(Throughput::Elements(1));
|
|
274
|
+
group.bench_with_input(
|
|
275
|
+
BenchmarkId::new("increment", node_count),
|
|
276
|
+
node_count,
|
|
277
|
+
|b, &nodes| {
|
|
278
|
+
let mut clock = create_vector_clock_with_nodes(nodes);
|
|
279
|
+
b.iter(|| {
|
|
280
|
+
clock.increment("node_0");
|
|
281
|
+
black_box(clock.get("node_0"))
|
|
282
|
+
});
|
|
283
|
+
},
|
|
284
|
+
);
|
|
285
|
+
|
|
286
|
+
// Comparison cost
|
|
287
|
+
group.throughput(Throughput::Elements(1));
|
|
288
|
+
group.bench_with_input(
|
|
289
|
+
BenchmarkId::new("compare", node_count),
|
|
290
|
+
node_count,
|
|
291
|
+
|b, &nodes| {
|
|
292
|
+
let clock1 = create_vector_clock_with_nodes(nodes);
|
|
293
|
+
let clock2 = create_vector_clock_with_nodes(nodes);
|
|
294
|
+
b.iter(|| {
|
|
295
|
+
black_box(black_box(&clock1).happens_before(black_box(&clock2)))
|
|
296
|
+
});
|
|
297
|
+
},
|
|
298
|
+
);
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
group.finish();
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
// ============================================================================
|
|
305
|
+
// DIMENSION 13: Deduplication Cost
|
|
306
|
+
// ============================================================================
|
|
307
|
+
|
|
308
|
+
/// Measure cost of deduplication via operation ID lookup
|
|
309
|
+
fn benchmark_deduplication_cost(c: &mut Criterion) {
|
|
310
|
+
let mut group = c.benchmark_group("gate13_redux_deduplication");
|
|
311
|
+
group.sample_size(100);
|
|
312
|
+
|
|
313
|
+
for dedup_set_size in [10, 100, 1000].iter() {
|
|
314
|
+
group.throughput(Throughput::Elements(1));
|
|
315
|
+
group.bench_with_input(
|
|
316
|
+
BenchmarkId::new("dedup_lookup", dedup_set_size),
|
|
317
|
+
dedup_set_size,
|
|
318
|
+
|b, &size| {
|
|
319
|
+
let mut dedup = std::collections::HashSet::new();
|
|
320
|
+
for i in 0..size {
|
|
321
|
+
dedup.insert(format!("op_{}", i));
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
b.iter(|| {
|
|
325
|
+
let op_id = format!("op_{}", black_box(size / 2));
|
|
326
|
+
black_box(dedup.contains(&op_id))
|
|
327
|
+
});
|
|
328
|
+
},
|
|
329
|
+
);
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
group.finish();
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
// ============================================================================
|
|
336
|
+
// DIMENSION 14: State Hashing Cost
|
|
337
|
+
// ============================================================================
|
|
338
|
+
|
|
339
|
+
/// Measure cost of state hashing for convergence validation
|
|
340
|
+
fn benchmark_state_hashing_cost(c: &mut Criterion) {
|
|
341
|
+
let mut group = c.benchmark_group("gate13_redux_state_hashing");
|
|
342
|
+
group.sample_size(50);
|
|
343
|
+
|
|
344
|
+
for record_count in [100, 1000, 10000].iter() {
|
|
345
|
+
group.throughput(Throughput::Elements(1));
|
|
346
|
+
group.bench_with_input(
|
|
347
|
+
BenchmarkId::new("hash_records", record_count),
|
|
348
|
+
record_count,
|
|
349
|
+
|b, &count| {
|
|
350
|
+
b.iter(|| {
|
|
351
|
+
let mut hasher = std::collections::hash_map::DefaultHasher::new();
|
|
352
|
+
use std::hash::{Hash, Hasher};
|
|
353
|
+
|
|
354
|
+
for i in 0..count {
|
|
355
|
+
format!("record_{}_state", i).hash(&mut hasher);
|
|
356
|
+
}
|
|
357
|
+
black_box(hasher.finish())
|
|
358
|
+
});
|
|
359
|
+
},
|
|
360
|
+
);
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
group.finish();
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
// ============================================================================
|
|
367
|
+
// DIMENSION 15: Snapshot Cost (simplified)
|
|
368
|
+
// ============================================================================
|
|
369
|
+
|
|
370
|
+
/// Measure cost of creating a snapshot via barrier state
|
|
371
|
+
fn benchmark_snapshot_cost(c: &mut Criterion) {
|
|
372
|
+
let mut group = c.benchmark_group("gate13_redux_snapshots");
|
|
373
|
+
group.sample_size(50);
|
|
374
|
+
|
|
375
|
+
for pending_count in [100, 1000].iter() {
|
|
376
|
+
group.bench_with_input(
|
|
377
|
+
BenchmarkId::new("snapshot_pending", pending_count),
|
|
378
|
+
pending_count,
|
|
379
|
+
|b, &count| {
|
|
380
|
+
b.iter(|| {
|
|
381
|
+
let mut barrier = CausalDependencyBarrier::new();
|
|
382
|
+
populate_pending_operations(&mut barrier, count, 4);
|
|
383
|
+
|
|
384
|
+
// Snapshot: collect current pending state
|
|
385
|
+
let pending = barrier.get_pending_operations();
|
|
386
|
+
black_box(pending.len())
|
|
387
|
+
});
|
|
388
|
+
},
|
|
389
|
+
);
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
group.finish();
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
// ============================================================================
|
|
396
|
+
// DIMENSION 16: Recovery Cost (simplified)
|
|
397
|
+
// ============================================================================
|
|
398
|
+
|
|
399
|
+
/// Measure cost of recovering barrier state
|
|
400
|
+
fn benchmark_recovery_cost(c: &mut Criterion) {
|
|
401
|
+
let mut group = c.benchmark_group("gate13_redux_recovery");
|
|
402
|
+
group.sample_size(50);
|
|
403
|
+
|
|
404
|
+
for pending_count in [100, 1000].iter() {
|
|
405
|
+
group.bench_with_input(
|
|
406
|
+
BenchmarkId::new("recovery_reconstruct", pending_count),
|
|
407
|
+
pending_count,
|
|
408
|
+
|b, &count| {
|
|
409
|
+
b.iter(|| {
|
|
410
|
+
// Recovery: reconstruct barrier from pending log
|
|
411
|
+
let mut barrier = CausalDependencyBarrier::new();
|
|
412
|
+
for i in 0..count {
|
|
413
|
+
let mut required = create_vector_clock_with_nodes(2);
|
|
414
|
+
required.clocks.insert("node_0".to_string(), 100);
|
|
415
|
+
let _ = barrier.receive_operation(format!("op_{}", i), required);
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
black_box(barrier.get_pending_operations().len())
|
|
419
|
+
});
|
|
420
|
+
},
|
|
421
|
+
);
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
group.finish();
|
|
425
|
+
}
|
|
426
|
+
|
|
427
|
+
// ============================================================================
|
|
428
|
+
// Registry and main
|
|
429
|
+
// ============================================================================
|
|
430
|
+
|
|
431
|
+
criterion_group!(
|
|
432
|
+
benches,
|
|
433
|
+
benchmark_transaction_throughput,
|
|
434
|
+
benchmark_causal_readiness_latency,
|
|
435
|
+
benchmark_causal_release_latency,
|
|
436
|
+
benchmark_cpu_per_operation,
|
|
437
|
+
benchmark_index_memory_overhead,
|
|
438
|
+
benchmark_index_maintenance_cost,
|
|
439
|
+
benchmark_vector_clock_cost,
|
|
440
|
+
benchmark_deduplication_cost,
|
|
441
|
+
benchmark_state_hashing_cost,
|
|
442
|
+
benchmark_snapshot_cost,
|
|
443
|
+
benchmark_recovery_cost,
|
|
444
|
+
);
|
|
445
|
+
|
|
446
|
+
criterion_main!(benches);
|