@feltdb/core 0.13.0 → 0.16.0
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/agent-runtime.d.ts +64 -2
- package/dist/agent-runtime.d.ts.map +1 -1
- package/dist/agent-runtime.js +121 -11
- package/dist/agent-state.d.ts +68 -0
- package/dist/agent-state.d.ts.map +1 -1
- package/dist/agent-state.js +210 -12
- package/dist/agent.d.ts +10 -1
- package/dist/agent.d.ts.map +1 -1
- package/dist/agent.js +10 -1
- package/dist/build-identity.json +12 -4
- package/dist/cli/commands.js +214 -10
- package/dist/cli/publish-engine.js +116 -16
- package/dist/collection.d.ts +3 -1
- package/dist/collection.d.ts.map +1 -1
- package/dist/collection.js +33 -8
- package/dist/create/build-identity.json +12 -4
- package/dist/create/cli.js +1 -1
- package/dist/create/create.js +4 -6
- package/dist/create/managed-account.js +93 -35
- package/dist/create/package-versions.js +1 -1
- package/dist/create/server-source/Cargo.lock +8 -511
- package/dist/create/server-source/Cargo.toml +2 -13
- package/dist/create/server-source/crates/feltdb-client/Cargo.toml +1 -1
- package/dist/create/server-source/crates/feltdb-server/Cargo.toml +1 -1
- package/dist/create/server-source/crates/feltdb-server/README.md +6 -1
- package/dist/create/server-source/crates/feltdb-server/src/app_state.rs +9 -1
- package/dist/create/server-source/crates/feltdb-server/src/auth.rs +85 -25
- package/dist/create/server-source/crates/feltdb-server/src/backup.rs +4 -0
- package/dist/create/server-source/crates/feltdb-server/src/console_accounts.rs +1009 -0
- package/dist/create/server-source/crates/feltdb-server/src/control_authorization.rs +441 -0
- package/dist/create/server-source/crates/feltdb-server/src/identity.rs +68 -6
- package/dist/create/server-source/crates/feltdb-server/src/key_management.rs +355 -23
- package/dist/create/server-source/crates/feltdb-server/src/lib.rs +3 -0
- package/dist/create/server-source/crates/feltdb-server/src/main.rs +1134 -96
- package/dist/create/server-source/crates/feltdb-server/src/redaction.rs +208 -0
- package/dist/create/server-source/crates/feltdb-server/src/tenancy.rs +198 -19
- package/dist/create/server-source/crates/feltdb-server/tests/transaction_precondition_contract.rs +403 -0
- package/dist/create/server-source/crates/feltdb-wasm/Cargo.toml +1 -1
- package/dist/db.d.ts +75 -10
- package/dist/db.d.ts.map +1 -1
- package/dist/db.js +168 -29
- package/dist/deployment.d.ts +19 -0
- package/dist/deployment.d.ts.map +1 -1
- package/dist/deployment.js +38 -2
- package/dist/embedded-query.d.ts.map +1 -1
- package/dist/embedded-query.js +5 -4
- package/dist/embedded-transaction.d.ts +8 -4
- package/dist/embedded-transaction.d.ts.map +1 -1
- package/dist/embedded-transaction.js +55 -19
- package/dist/error-codes.d.ts +36 -2
- package/dist/error-codes.d.ts.map +1 -1
- package/dist/error-codes.js +50 -3
- package/dist/feltdb.d.ts +7 -0
- package/dist/feltdb.d.ts.map +1 -1
- package/dist/file-db.d.ts +27 -0
- package/dist/file-db.d.ts.map +1 -1
- package/dist/file-db.js +145 -7
- package/dist/http-client.d.ts +11 -3
- package/dist/http-client.d.ts.map +1 -1
- package/dist/http-client.js +27 -14
- package/dist/http-db.d.ts +43 -1
- package/dist/http-db.d.ts.map +1 -1
- package/dist/http-db.js +287 -59
- package/dist/index.js +1 -1
- package/dist/local-state-lock.d.ts +34 -0
- package/dist/local-state-lock.d.ts.map +1 -0
- package/dist/local-state-lock.js +225 -0
- package/dist/managed-recovery.d.ts +6 -0
- package/dist/managed-recovery.d.ts.map +1 -1
- package/dist/managed-recovery.js +9 -0
- package/dist/reactive-graph.d.ts +0 -3
- package/dist/reactive-graph.d.ts.map +1 -1
- package/dist/reactive-graph.js +11 -1
- package/dist/runtime-registry.d.ts +7 -2
- package/dist/runtime-registry.d.ts.map +1 -1
- package/dist/runtime-registry.js +2 -2
- package/dist/studio/components/index.js +1 -1
- package/dist/studio/{components-BSGmHfif.js → components-CJmzntBi.js} +2 -1
- package/dist/studio/index.js +1 -1
- package/dist/studio-app/assets/{feltdb_wasm-3hDngl1h.js → feltdb_wasm-DtybUY0q.js} +1 -1
- package/dist/studio-app/assets/feltdb_wasm_bg-DsgIUwaB.wasm +0 -0
- package/dist/studio-app/assets/index-C4OffsZl.js +37 -0
- package/dist/studio-app/index.html +1 -1
- package/dist/transaction.d.ts +27 -11
- package/dist/transaction.d.ts.map +1 -1
- package/dist/transaction.js +20 -14
- package/dist/wasm/feltdb_wasm_bg.wasm +0 -0
- package/dist/wasm/package.json +1 -1
- package/dist/workload.d.ts +86 -6
- package/dist/workload.d.ts.map +1 -1
- package/dist/workload.js +51 -3
- package/dist/workspace/workspace-connection.d.ts.map +1 -1
- package/dist/workspace/workspace-connection.js +14 -3
- package/package.json +1 -1
- package/dist/create/server-source/crates/feltdb/Cargo.lock +0 -175
- package/dist/create/server-source/crates/feltdb/Cargo.toml +0 -102
- package/dist/create/server-source/crates/feltdb/LICENSE +0 -21
- package/dist/create/server-source/crates/feltdb/README.md +0 -75
- package/dist/create/server-source/crates/feltdb/benches/baselines/gate-13-redux.json +0 -370
- package/dist/create/server-source/crates/feltdb/benches/gate13_baseline.rs +0 -589
- package/dist/create/server-source/crates/feltdb/benches/gate13_phase_7_1_release_economics.rs +0 -247
- package/dist/create/server-source/crates/feltdb/benches/gate_13_redux.rs +0 -440
- package/dist/create/server-source/crates/feltdb/benches/gate_13_regression_runner.rs +0 -275
- package/dist/create/server-source/crates/feltdb/benches/gate_14a_concurrent_writer_scaling.rs +0 -381
- package/dist/create/server-source/crates/feltdb/benches/gate_14a_production_admission_revalidation.rs +0 -467
- package/dist/create/server-source/crates/feltdb/benches/gate_14a_rc2_admission_contract.rs +0 -489
- package/dist/create/server-source/crates/feltdb/benches/gate_14a_rc_root_cause.rs +0 -281
- package/dist/create/server-source/crates/feltdb/benches/gate_14a_sync1_queued_prototype.rs +0 -606
- package/dist/create/server-source/crates/feltdb/benches/gate_14a_sync_economics.rs +0 -531
- package/dist/create/server-source/crates/feltdb/benches/gate_14b_causal_backlog_scaling.rs +0 -462
- package/dist/create/server-source/crates/feltdb/benches/gate_14c_replication_contract_test.rs +0 -505
- package/dist/create/server-source/crates/feltdb/benches/gate_14c_replication_scaling.rs +0 -484
- package/dist/create/server-source/crates/feltdb/benches/gate_14d_combined_dimension_scaling.rs +0 -758
- package/dist/create/server-source/crates/feltdb/benches/phase_7_1_2_optimization_benchmark.rs +0 -421
- package/dist/create/server-source/crates/feltdb/benches/phase_7_1_3_crossover_analysis.rs +0 -329
- package/dist/create/server-source/crates/feltdb/src/acceptance_tests.rs +0 -1705
- package/dist/create/server-source/crates/feltdb/src/acquisition.rs +0 -286
- package/dist/create/server-source/crates/feltdb/src/admission.rs +0 -185
- package/dist/create/server-source/crates/feltdb/src/admission_contract_tests.rs +0 -507
- package/dist/create/server-source/crates/feltdb/src/adversarial_transport.rs +0 -539
- package/dist/create/server-source/crates/feltdb/src/agent_state.rs +0 -320
- package/dist/create/server-source/crates/feltdb/src/agent_transition_contract.rs +0 -1545
- package/dist/create/server-source/crates/feltdb/src/analytics.rs +0 -521
- package/dist/create/server-source/crates/feltdb/src/application.rs +0 -2674
- package/dist/create/server-source/crates/feltdb/src/application_runtime.rs +0 -1070
- package/dist/create/server-source/crates/feltdb/src/authority.rs +0 -479
- package/dist/create/server-source/crates/feltdb/src/authority_failover.rs +0 -847
- package/dist/create/server-source/crates/feltdb/src/authorization.rs +0 -1030
- package/dist/create/server-source/crates/feltdb/src/authorization_security_tests.rs +0 -1122
- package/dist/create/server-source/crates/feltdb/src/bin/feltdb-authority-client.rs +0 -32
- package/dist/create/server-source/crates/feltdb/src/bin/feltdb-authority.rs +0 -19
- package/dist/create/server-source/crates/feltdb/src/bin/feltdb_node.rs +0 -1474
- package/dist/create/server-source/crates/feltdb/src/capabilities/mod.rs +0 -8
- package/dist/create/server-source/crates/feltdb/src/capabilities/search.rs +0 -418
- package/dist/create/server-source/crates/feltdb/src/capabilities/vector.rs +0 -482
- package/dist/create/server-source/crates/feltdb/src/capability.rs +0 -903
- package/dist/create/server-source/crates/feltdb/src/cardinality_diagnostics.rs +0 -263
- package/dist/create/server-source/crates/feltdb/src/cardinality_endpoint.rs +0 -77
- package/dist/create/server-source/crates/feltdb/src/causal_backlog_bound.rs +0 -496
- package/dist/create/server-source/crates/feltdb/src/causal_dependency_barrier.rs +0 -2574
- package/dist/create/server-source/crates/feltdb/src/causal_dependency_barrier_phase_7_1.rs +0 -212
- package/dist/create/server-source/crates/feltdb/src/concurrency_fuzzing.rs +0 -422
- package/dist/create/server-source/crates/feltdb/src/consistency_contract.rs +0 -445
- package/dist/create/server-source/crates/feltdb/src/content_distribution.rs +0 -465
- package/dist/create/server-source/crates/feltdb/src/convergence.rs +0 -634
- package/dist/create/server-source/crates/feltdb/src/crash_atomic_boundary.rs +0 -427
- package/dist/create/server-source/crates/feltdb/src/crash_injection.rs +0 -376
- package/dist/create/server-source/crates/feltdb/src/crash_recovery_tests.rs +0 -365
- package/dist/create/server-source/crates/feltdb/src/cron.rs +0 -294
- package/dist/create/server-source/crates/feltdb/src/dedup_bound_investigation.rs +0 -483
- package/dist/create/server-source/crates/feltdb/src/distributed_indexing.rs +0 -477
- package/dist/create/server-source/crates/feltdb/src/distributed_tests.rs +0 -1003
- package/dist/create/server-source/crates/feltdb/src/distributed_transactions.rs +0 -1334
- package/dist/create/server-source/crates/feltdb/src/durability_guarantees.rs +0 -368
- package/dist/create/server-source/crates/feltdb/src/durable_dedup_set.rs +0 -231
- package/dist/create/server-source/crates/feltdb/src/durable_operation_identity.rs +0 -482
- package/dist/create/server-source/crates/feltdb/src/durable_operation_log.rs +0 -203
- package/dist/create/server-source/crates/feltdb/src/durable_sync.rs +0 -317
- package/dist/create/server-source/crates/feltdb/src/equality_index.rs +0 -595
- package/dist/create/server-source/crates/feltdb/src/execution.rs +0 -426
- package/dist/create/server-source/crates/feltdb/src/in_process_transport.rs +0 -214
- package/dist/create/server-source/crates/feltdb/src/indexing.rs +0 -776
- package/dist/create/server-source/crates/feltdb/src/lib.rs +0 -7274
- package/dist/create/server-source/crates/feltdb/src/managed_cas_tests.rs +0 -234
- package/dist/create/server-source/crates/feltdb/src/materialization.rs +0 -184
- package/dist/create/server-source/crates/feltdb/src/metrics.rs +0 -266
- package/dist/create/server-source/crates/feltdb/src/multi_node_convergence.rs +0 -310
- package/dist/create/server-source/crates/feltdb/src/multi_operation_transaction.rs +0 -736
- package/dist/create/server-source/crates/feltdb/src/observability.rs +0 -379
- package/dist/create/server-source/crates/feltdb/src/operation.rs +0 -290
- package/dist/create/server-source/crates/feltdb/src/operation_algebra.rs +0 -439
- package/dist/create/server-source/crates/feltdb/src/operation_log.rs +0 -349
- package/dist/create/server-source/crates/feltdb/src/p1_application_atomicity.rs +0 -332
- package/dist/create/server-source/crates/feltdb/src/p1_atomicity_acceptance.rs +0 -718
- package/dist/create/server-source/crates/feltdb/src/partition_reconciliation.rs +0 -487
- package/dist/create/server-source/crates/feltdb/src/peer_registry.rs +0 -166
- package/dist/create/server-source/crates/feltdb/src/permutation_scheduler.rs +0 -289
- package/dist/create/server-source/crates/feltdb/src/persistence_reality.rs +0 -566
- package/dist/create/server-source/crates/feltdb/src/phase1b_acceptance.rs +0 -3391
- package/dist/create/server-source/crates/feltdb/src/phase1c1_acceptance.rs +0 -203
- package/dist/create/server-source/crates/feltdb/src/phase1c2_acceptance.rs +0 -261
- package/dist/create/server-source/crates/feltdb/src/phase1c3_acceptance.rs +0 -502
- package/dist/create/server-source/crates/feltdb/src/phase1c_atomicity_proof.rs +0 -216
- package/dist/create/server-source/crates/feltdb/src/phase5_integration.rs +0 -303
- package/dist/create/server-source/crates/feltdb/src/phase5_scenarios.rs +0 -323
- package/dist/create/server-source/crates/feltdb/src/phase6_adversarial_scenarios.rs +0 -531
- package/dist/create/server-source/crates/feltdb/src/phase6_convergence_validator.rs +0 -406
- package/dist/create/server-source/crates/feltdb/src/phase6_persistence.rs +0 -436
- package/dist/create/server-source/crates/feltdb/src/phase_1c_real_tcp.rs +0 -387
- package/dist/create/server-source/crates/feltdb/src/phase_2a_failures.rs +0 -378
- package/dist/create/server-source/crates/feltdb/src/phase_2b_network.rs +0 -359
- package/dist/create/server-source/crates/feltdb/src/phase_2c_cascading.rs +0 -372
- package/dist/create/server-source/crates/feltdb/src/phase_3_durability.rs +0 -404
- package/dist/create/server-source/crates/feltdb/src/phase_4_baseline.rs +0 -376
- package/dist/create/server-source/crates/feltdb/src/phase_5_soak.rs +0 -461
- package/dist/create/server-source/crates/feltdb/src/policy_evaluation.rs +0 -2125
- package/dist/create/server-source/crates/feltdb/src/production_api.rs +0 -418
- package/dist/create/server-source/crates/feltdb/src/provenance.rs +0 -207
- package/dist/create/server-source/crates/feltdb/src/query_execution_diagnostics.rs +0 -126
- package/dist/create/server-source/crates/feltdb/src/query_performance.rs +0 -218
- package/dist/create/server-source/crates/feltdb/src/read_basis.rs +0 -257
- package/dist/create/server-source/crates/feltdb/src/references.rs +0 -404
- package/dist/create/server-source/crates/feltdb/src/replay_fuzzing.rs +0 -401
- package/dist/create/server-source/crates/feltdb/src/replica_acknowledgements.rs +0 -501
- package/dist/create/server-source/crates/feltdb/src/replica_membership.rs +0 -680
- package/dist/create/server-source/crates/feltdb/src/replication_manager.rs +0 -163
- package/dist/create/server-source/crates/feltdb/src/replication_protocol.rs +0 -133
- package/dist/create/server-source/crates/feltdb/src/routing.rs +0 -409
- package/dist/create/server-source/crates/feltdb/src/semantic_decision.rs +0 -2029
- package/dist/create/server-source/crates/feltdb/src/semantic_query.rs +0 -599
- package/dist/create/server-source/crates/feltdb/src/sharding.rs +0 -549
- package/dist/create/server-source/crates/feltdb/src/state_conflict_contract.rs +0 -516
- package/dist/create/server-source/crates/feltdb/src/state_contract.rs +0 -5894
- package/dist/create/server-source/crates/feltdb/src/state_diff_contract.rs +0 -222
- package/dist/create/server-source/crates/feltdb/src/state_facade.rs +0 -320
- package/dist/create/server-source/crates/feltdb/src/state_hash.rs +0 -291
- package/dist/create/server-source/crates/feltdb/src/state_model.rs +0 -4158
- package/dist/create/server-source/crates/feltdb/src/state_transition_store.rs +0 -379
- package/dist/create/server-source/crates/feltdb/src/state_trigger.rs +0 -673
- package/dist/create/server-source/crates/feltdb/src/storage.rs +0 -273
- package/dist/create/server-source/crates/feltdb/src/submission.rs +0 -471
- package/dist/create/server-source/crates/feltdb/src/sync.rs +0 -495
- package/dist/create/server-source/crates/feltdb/src/sync_contract.rs +0 -822
- package/dist/create/server-source/crates/feltdb/src/tcp_transport.rs +0 -433
- package/dist/create/server-source/crates/feltdb/src/transaction_api.rs +0 -462
- package/dist/create/server-source/crates/feltdb/src/transaction_invariants.rs +0 -965
- package/dist/create/server-source/crates/feltdb/src/transaction_preconditions.rs +0 -1120
- package/dist/create/server-source/crates/feltdb/src/transactions.rs +0 -643
- package/dist/create/server-source/crates/feltdb/src/trigger.rs +0 -390
- package/dist/create/server-source/crates/feltdb/src/trigger_contract.rs +0 -749
- package/dist/create/server-source/crates/feltdb/src/versioned_object_substrate.rs +0 -708
- package/dist/create/server-source/crates/feltdb/src/worker_mesh.rs +0 -1133
- package/dist/create/server-source/crates/feltdb/src/workflow.rs +0 -713
- package/dist/create/server-source/crates/feltdb/src/workflow_acceptance_tests.rs +0 -510
- package/dist/create/server-source/crates/feltdb/src/workflow_integration.rs +0 -354
- package/dist/create/server-source/crates/feltdb/src/workflow_runtime.rs +0 -594
- package/dist/create/server-source/crates/feltdb/src/workload.rs +0 -2886
- package/dist/create/server-source/crates/feltdb/src/workload_diagnostics.rs +0 -456
- package/dist/create/server-source/crates/feltdb/tests/agent_state_native.rs +0 -1188
- package/dist/create/server-source/crates/feltdb/tests/agent_transition_contract_conformance.rs +0 -2884
- package/dist/create/server-source/crates/feltdb/tests/authority_process.rs +0 -297
- package/dist/create/server-source/crates/feltdb/tests/authority_transaction_identity.rs +0 -534
- package/dist/create/server-source/crates/feltdb/tests/bounded_read_contract.rs +0 -132
- package/dist/create/server-source/crates/feltdb/tests/branching_evidence.rs +0 -299
- package/dist/create/server-source/crates/feltdb/tests/common/mod.rs +0 -96
- package/dist/create/server-source/crates/feltdb/tests/compaction_stall_contract.rs +0 -272
- package/dist/create/server-source/crates/feltdb/tests/crash_durability_contract.rs +0 -467
- package/dist/create/server-source/crates/feltdb/tests/current_revision_authority_evidence.rs +0 -309
- package/dist/create/server-source/crates/feltdb/tests/durable_backup_contract.rs +0 -445
- package/dist/create/server-source/crates/feltdb/tests/durable_corruption_contract.rs +0 -518
- package/dist/create/server-source/crates/feltdb/tests/durable_format_compatibility.rs +0 -392
- package/dist/create/server-source/crates/feltdb/tests/feltdb_state_boundary_tests.rs +0 -850
- package/dist/create/server-source/crates/feltdb/tests/fixtures/agent_transition_corpus.json +0 -23340
- package/dist/create/server-source/crates/feltdb/tests/fixtures/state_conflict_contract_corpus.json +0 -1916
- package/dist/create/server-source/crates/feltdb/tests/fixtures/state_diff_contract_corpus.json +0 -1878
- package/dist/create/server-source/crates/feltdb/tests/fixtures/trigger_contract_corpus.json +0 -1862
- package/dist/create/server-source/crates/feltdb/tests/generalized_version_control_evidence.rs +0 -123
- package/dist/create/server-source/crates/feltdb/tests/generalized_version_control_substrate_completion.rs +0 -299
- package/dist/create/server-source/crates/feltdb/tests/local_process_ownership.rs +0 -69
- package/dist/create/server-source/crates/feltdb/tests/managed_incident_regression.rs +0 -191
- package/dist/create/server-source/crates/feltdb/tests/operational_health_contract.rs +0 -278
- package/dist/create/server-source/crates/feltdb/tests/pr34_query_collection.rs +0 -234
- package/dist/create/server-source/crates/feltdb/tests/pr35_equality_index.rs +0 -947
- package/dist/create/server-source/crates/feltdb/tests/pr7_self_authorization_proof.rs +0 -404
- package/dist/create/server-source/crates/feltdb/tests/pr8_vocabulary_assessment.rs +0 -916
- package/dist/create/server-source/crates/feltdb/tests/pr9_phase2_boundary_tests.rs +0 -1045
- package/dist/create/server-source/crates/feltdb/tests/pr9_phase3a_path_a_tests.rs +0 -347
- package/dist/create/server-source/crates/feltdb/tests/pr9_phase3c_authorized_mutations.rs +0 -361
- package/dist/create/server-source/crates/feltdb/tests/pr9_phase3c_role_based_authorization.rs +0 -330
- package/dist/create/server-source/crates/feltdb/tests/pr9_phase3c_simple_auth_delete.rs +0 -93
- package/dist/create/server-source/crates/feltdb/tests/pr9_phase3c_team_delete_role_authorization.rs +0 -622
- package/dist/create/server-source/crates/feltdb/tests/pr9_teams_role_based_access.rs +0 -517
- package/dist/create/server-source/crates/feltdb/tests/production_certification.rs +0 -1153
- package/dist/create/server-source/crates/feltdb/tests/production_contract.rs +0 -771
- package/dist/create/server-source/crates/feltdb/tests/production_readiness_contract.rs +0 -1383
- package/dist/create/server-source/crates/feltdb/tests/reconciliation_application.rs +0 -868
- package/dist/create/server-source/crates/feltdb/tests/reconciliation_wire_format_evidence.rs +0 -221
- package/dist/create/server-source/crates/feltdb/tests/replicated_history_contract.rs +0 -417
- package/dist/create/server-source/crates/feltdb/tests/resource_scoped_revisions.rs +0 -338
- package/dist/create/server-source/crates/feltdb/tests/revision_identity_contract.rs +0 -1039
- package/dist/create/server-source/crates/feltdb/tests/revision_model_decision.rs +0 -739
- package/dist/create/server-source/crates/feltdb/tests/revision_retention_boundary_evidence.rs +0 -452
- package/dist/create/server-source/crates/feltdb/tests/saas_authorization_integration.rs +0 -81
- package/dist/create/server-source/crates/feltdb/tests/saas_invitation_lifecycle.rs +0 -438
- package/dist/create/server-source/crates/feltdb/tests/semantic_decision.rs +0 -1165
- package/dist/create/server-source/crates/feltdb/tests/semantic_query.rs +0 -767
- package/dist/create/server-source/crates/feltdb/tests/semantic_query_contract.rs +0 -363
- package/dist/create/server-source/crates/feltdb/tests/state_conflict_contract_conformance.rs +0 -1799
- package/dist/create/server-source/crates/feltdb/tests/state_diff_contract_conformance.rs +0 -1316
- package/dist/create/server-source/crates/feltdb/tests/state_model_integration.rs +0 -358
- package/dist/create/server-source/crates/feltdb/tests/state_persistence_integration.rs +0 -365
- package/dist/create/server-source/crates/feltdb/tests/state_ref_authority.rs +0 -918
- package/dist/create/server-source/crates/feltdb/tests/state_store_boundary_evidence.rs +0 -299
- package/dist/create/server-source/crates/feltdb/tests/storage_independent_versioned_object_substrate.rs +0 -328
- package/dist/create/server-source/crates/feltdb/tests/sync_divergence_evidence.rs +0 -255
- package/dist/create/server-source/crates/feltdb/tests/three_way_input_boundary_evidence.rs +0 -249
- package/dist/create/server-source/crates/feltdb/tests/trigger_contract_conformance.rs +0 -994
- package/dist/create/server-source/crates/feltdb/tests/workload_envelope_contract.rs +0 -484
- package/dist/studio-app/assets/feltdb_wasm_bg-CFQT4gCy.wasm +0 -0
- package/dist/studio-app/assets/index-Dql1hS5m.js +0 -30
package/dist/create/server-source/crates/feltdb/benches/gate13_phase_7_1_release_economics.rs
DELETED
|
@@ -1,247 +0,0 @@
|
|
|
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
|
-
use criterion::{black_box, criterion_group, criterion_main, Criterion, Throughput};
|
|
13
|
-
use feltdb::{CausalDependencyBarrier, VectorClock};
|
|
14
|
-
|
|
15
|
-
fn make_vector_clock(node_count: usize) -> VectorClock {
|
|
16
|
-
let mut vc = VectorClock::new();
|
|
17
|
-
for i in 0..node_count {
|
|
18
|
-
vc.clocks.insert(format!("node_{}", i), 1);
|
|
19
|
-
}
|
|
20
|
-
vc
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
/// Benchmark 1: Single Release Scan
|
|
24
|
-
///
|
|
25
|
-
/// Measure: How expensive is one call to check_unblocked_operations()?
|
|
26
|
-
/// Varies: Pending buffer size (0, 10, 100, 1K, 10K)
|
|
27
|
-
/// Setup: All operations are blocked (frontier hasn't advanced enough)
|
|
28
|
-
fn benchmark_release_single_scan(c: &mut Criterion) {
|
|
29
|
-
let mut group = c.benchmark_group("gate13_release_single_scan");
|
|
30
|
-
group.sample_size(20);
|
|
31
|
-
|
|
32
|
-
for pending_size in [0, 10, 100, 1000, 10000].iter() {
|
|
33
|
-
group.throughput(Throughput::Elements(*pending_size as u64));
|
|
34
|
-
group.bench_function(
|
|
35
|
-
format!("release_single_scan_pending{}", pending_size),
|
|
36
|
-
|b| {
|
|
37
|
-
b.iter_batched(
|
|
38
|
-
|| {
|
|
39
|
-
// Setup: Create barrier and fill with pending operations
|
|
40
|
-
let mut barrier = CausalDependencyBarrier::new();
|
|
41
|
-
|
|
42
|
-
// All operations require high timestamps that frontier doesn't satisfy
|
|
43
|
-
for i in 0..*pending_size {
|
|
44
|
-
let mut required = VectorClock::new();
|
|
45
|
-
// Each requires increasing timestamp: A:1000, A:1001, etc.
|
|
46
|
-
required
|
|
47
|
-
.clocks
|
|
48
|
-
.insert("node_a".to_string(), (1000 + i) as u64);
|
|
49
|
-
let _ = barrier.receive_operation(format!("pending_{}", i), required);
|
|
50
|
-
}
|
|
51
|
-
barrier
|
|
52
|
-
},
|
|
53
|
-
|mut barrier| {
|
|
54
|
-
// Measure: What does it cost to advance frontier by one operation?
|
|
55
|
-
// This calls check_unblocked_operations() internally
|
|
56
|
-
let mut frontier = VectorClock::new();
|
|
57
|
-
frontier.clocks.insert("node_a".to_string(), 1);
|
|
58
|
-
barrier.advance_frontier(&frontier);
|
|
59
|
-
black_box(barrier)
|
|
60
|
-
},
|
|
61
|
-
criterion::BatchSize::SmallInput,
|
|
62
|
-
);
|
|
63
|
-
},
|
|
64
|
-
);
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
group.finish();
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
/// Benchmark 2: Release Selectivity
|
|
71
|
-
///
|
|
72
|
-
/// Measure: Does it matter what % of pending operations are ready?
|
|
73
|
-
/// Varies: Pending size fixed at 1K, but % ready = [0, 1, 10, 50, 100]
|
|
74
|
-
/// Question: Is the cost proportional to (pending_size) or (ready_count)?
|
|
75
|
-
fn benchmark_release_selectivity(c: &mut Criterion) {
|
|
76
|
-
let mut group = c.benchmark_group("gate13_release_selectivity");
|
|
77
|
-
group.sample_size(20);
|
|
78
|
-
|
|
79
|
-
let pending_size = 1000;
|
|
80
|
-
|
|
81
|
-
for ready_percent in [0, 1, 10, 50, 100].iter() {
|
|
82
|
-
group.throughput(Throughput::Elements(pending_size as u64));
|
|
83
|
-
group.bench_function(
|
|
84
|
-
format!("release_selectivity_ready{}pct", ready_percent),
|
|
85
|
-
|b| {
|
|
86
|
-
b.iter_batched(
|
|
87
|
-
|| {
|
|
88
|
-
let mut barrier = CausalDependencyBarrier::new();
|
|
89
|
-
|
|
90
|
-
let ready_count = (pending_size * ready_percent) / 100;
|
|
91
|
-
let blocked_count = pending_size - ready_count;
|
|
92
|
-
|
|
93
|
-
// Add ready operations (frontier will satisfy them)
|
|
94
|
-
for i in 0..ready_count {
|
|
95
|
-
let mut required = VectorClock::new();
|
|
96
|
-
// Frontier will be at A:2000, these require A:100
|
|
97
|
-
required.clocks.insert("node_a".to_string(), 100);
|
|
98
|
-
let _ = barrier.receive_operation(format!("ready_{}", i), required);
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
// Add blocked operations (frontier won't satisfy them yet)
|
|
102
|
-
for i in 0..blocked_count {
|
|
103
|
-
let mut required = VectorClock::new();
|
|
104
|
-
// These require A:5000, frontier will only be at A:2000
|
|
105
|
-
required.clocks.insert("node_a".to_string(), 5000);
|
|
106
|
-
let _ = barrier.receive_operation(format!("blocked_{}", i), required);
|
|
107
|
-
}
|
|
108
|
-
barrier
|
|
109
|
-
},
|
|
110
|
-
|mut barrier| {
|
|
111
|
-
// Measure: Advance frontier to release the ready operations
|
|
112
|
-
let mut frontier = VectorClock::new();
|
|
113
|
-
// Advance to A:2000 - just enough to release ready operations
|
|
114
|
-
frontier.clocks.insert("node_a".to_string(), 2000);
|
|
115
|
-
barrier.advance_frontier(&frontier);
|
|
116
|
-
black_box(barrier)
|
|
117
|
-
},
|
|
118
|
-
criterion::BatchSize::SmallInput,
|
|
119
|
-
);
|
|
120
|
-
},
|
|
121
|
-
);
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
group.finish();
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
/// Benchmark 3: Pathological Repeated Release (THE CRITICAL TEST)
|
|
128
|
-
///
|
|
129
|
-
/// Measure: Does repeated frontier advancement cause O(m²) rescanning?
|
|
130
|
-
/// Setup: 10,000 pending operations, all ready
|
|
131
|
-
/// Scenario: Advance frontier 10,000 times (one per operation)
|
|
132
|
-
/// Each advance should release exactly one operation
|
|
133
|
-
///
|
|
134
|
-
/// Question: Does the implementation catch this efficiently?
|
|
135
|
-
///
|
|
136
|
-
/// Expected behavior:
|
|
137
|
-
/// - Good: entries_examined ≈ 10,000 (one pass through, each op examined once)
|
|
138
|
-
/// - Bad: entries_examined ≈ 50,000,000 (each advance scans remaining operations)
|
|
139
|
-
fn benchmark_release_pathological_repeated(c: &mut Criterion) {
|
|
140
|
-
let mut group = c.benchmark_group("gate13_release_pathological_repeated");
|
|
141
|
-
group.sample_size(5); // Fewer samples for large workload
|
|
142
|
-
group.measurement_time(std::time::Duration::from_secs(30));
|
|
143
|
-
|
|
144
|
-
// Note: Using 1000 instead of 10000 to keep benchmark runtime reasonable
|
|
145
|
-
// The scaling pattern will still show if O(m²) is happening
|
|
146
|
-
let pending_size = 1000;
|
|
147
|
-
|
|
148
|
-
group.throughput(Throughput::Elements(pending_size as u64));
|
|
149
|
-
group.bench_function(
|
|
150
|
-
format!("release_pathological_{}ops_one_at_a_time", pending_size),
|
|
151
|
-
|b| {
|
|
152
|
-
b.iter_batched(
|
|
153
|
-
|| {
|
|
154
|
-
let mut barrier = CausalDependencyBarrier::new();
|
|
155
|
-
|
|
156
|
-
// Create pending operations requiring A:1, A:2, A:3, ..., A:pending_size
|
|
157
|
-
for i in 0..pending_size {
|
|
158
|
-
let mut required = VectorClock::new();
|
|
159
|
-
// Each requires A:(i+1)
|
|
160
|
-
required.clocks.insert("node_a".to_string(), (i + 1) as u64);
|
|
161
|
-
let _ = barrier.receive_operation(format!("seq_{}", i), required);
|
|
162
|
-
}
|
|
163
|
-
barrier
|
|
164
|
-
},
|
|
165
|
-
|mut barrier| {
|
|
166
|
-
// Now advance frontier one step at a time
|
|
167
|
-
// This is the pathological scenario
|
|
168
|
-
// Simulate advancing frontier one operation at a time
|
|
169
|
-
for step in 1..=pending_size {
|
|
170
|
-
let mut frontier = VectorClock::new();
|
|
171
|
-
// Advance to A:step
|
|
172
|
-
frontier.clocks.insert("node_a".to_string(), step as u64);
|
|
173
|
-
barrier.advance_frontier(&frontier);
|
|
174
|
-
}
|
|
175
|
-
black_box(barrier)
|
|
176
|
-
},
|
|
177
|
-
criterion::BatchSize::SmallInput,
|
|
178
|
-
);
|
|
179
|
-
},
|
|
180
|
-
);
|
|
181
|
-
|
|
182
|
-
group.finish();
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
/// Benchmark 4: Mixed Frontier Advances
|
|
186
|
-
///
|
|
187
|
-
/// Measure: Realistic scenario with varying frontier advances
|
|
188
|
-
/// Setup: Operations with different dependency timestamps
|
|
189
|
-
/// Scenario: Advance frontier gradually, each step releases some operations
|
|
190
|
-
///
|
|
191
|
-
/// This tests whether the implementation efficiently handles the common case
|
|
192
|
-
/// of incremental frontier progress.
|
|
193
|
-
fn benchmark_release_mixed_advances(c: &mut Criterion) {
|
|
194
|
-
let mut group = c.benchmark_group("gate13_release_mixed_advances");
|
|
195
|
-
group.sample_size(10);
|
|
196
|
-
|
|
197
|
-
for pending_size in [100, 1000].iter() {
|
|
198
|
-
group.throughput(Throughput::Elements(*pending_size as u64));
|
|
199
|
-
group.bench_function(
|
|
200
|
-
format!("release_mixed_advances_pending{}", pending_size),
|
|
201
|
-
|b| {
|
|
202
|
-
b.iter_batched(
|
|
203
|
-
|| {
|
|
204
|
-
let mut barrier = CausalDependencyBarrier::new();
|
|
205
|
-
|
|
206
|
-
// Create pending operations with mixed dependencies
|
|
207
|
-
// Some require A:100, some A:500, some A:1000, etc.
|
|
208
|
-
for i in 0..*pending_size {
|
|
209
|
-
let mut required = VectorClock::new();
|
|
210
|
-
|
|
211
|
-
// Distribute dependencies: some low, some high
|
|
212
|
-
let dependency_level = ((i * 997) % 1000) as u64 + 1;
|
|
213
|
-
required
|
|
214
|
-
.clocks
|
|
215
|
-
.insert("node_a".to_string(), dependency_level);
|
|
216
|
-
|
|
217
|
-
let _ = barrier.receive_operation(format!("mixed_{}", i), required);
|
|
218
|
-
}
|
|
219
|
-
barrier
|
|
220
|
-
},
|
|
221
|
-
|mut barrier| {
|
|
222
|
-
// Measure: Series of frontier advances
|
|
223
|
-
// Simulate gradual frontier advancement
|
|
224
|
-
for level in (100..=1000).step_by(100) {
|
|
225
|
-
let mut frontier = VectorClock::new();
|
|
226
|
-
frontier.clocks.insert("node_a".to_string(), level as u64);
|
|
227
|
-
barrier.advance_frontier(&frontier);
|
|
228
|
-
}
|
|
229
|
-
black_box(barrier)
|
|
230
|
-
},
|
|
231
|
-
criterion::BatchSize::SmallInput,
|
|
232
|
-
);
|
|
233
|
-
},
|
|
234
|
-
);
|
|
235
|
-
}
|
|
236
|
-
|
|
237
|
-
group.finish();
|
|
238
|
-
}
|
|
239
|
-
|
|
240
|
-
criterion_group!(
|
|
241
|
-
benches,
|
|
242
|
-
benchmark_release_single_scan,
|
|
243
|
-
benchmark_release_selectivity,
|
|
244
|
-
benchmark_release_pathological_repeated,
|
|
245
|
-
benchmark_release_mixed_advances,
|
|
246
|
-
);
|
|
247
|
-
criterion_main!(benches);
|
|
@@ -1,440 +0,0 @@
|
|
|
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
|
-
use criterion::{black_box, criterion_group, criterion_main, BenchmarkId, Criterion, Throughput};
|
|
28
|
-
use feltdb::{CausalDependencyBarrier, VectorClock};
|
|
29
|
-
use std::time::Instant;
|
|
30
|
-
|
|
31
|
-
// ============================================================================
|
|
32
|
-
// BASELINE FIXTURE: Helper functions for consistent workload generation
|
|
33
|
-
// ============================================================================
|
|
34
|
-
|
|
35
|
-
/// Create a vector clock with N nodes at sequential timestamps
|
|
36
|
-
fn create_vector_clock_with_nodes(node_count: usize) -> VectorClock {
|
|
37
|
-
let mut clock = VectorClock::new();
|
|
38
|
-
for i in 0..node_count {
|
|
39
|
-
clock.clocks.insert(format!("node_{}", i), (i + 1) as u64);
|
|
40
|
-
}
|
|
41
|
-
clock
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
/// Create N pending operations in the barrier
|
|
45
|
-
fn populate_pending_operations(
|
|
46
|
-
barrier: &mut CausalDependencyBarrier,
|
|
47
|
-
count: usize,
|
|
48
|
-
node_count: usize,
|
|
49
|
-
) {
|
|
50
|
-
for i in 0..count {
|
|
51
|
-
let mut required = create_vector_clock_with_nodes(node_count);
|
|
52
|
-
// Make each operation depend on a node that hasn't been reached yet
|
|
53
|
-
required
|
|
54
|
-
.clocks
|
|
55
|
-
.insert(format!("node_{}", node_count % 2), (node_count * 10) as u64);
|
|
56
|
-
let _ = barrier.receive_operation(format!("op_{}", i), required);
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
// ============================================================================
|
|
61
|
-
// DIMENSION 1-3: Throughput Metrics (transactions/sec, operations/sec, replication ops/sec)
|
|
62
|
-
// ============================================================================
|
|
63
|
-
|
|
64
|
-
/// Measure transaction throughput: operations through the causal barrier
|
|
65
|
-
fn benchmark_transaction_throughput(c: &mut Criterion) {
|
|
66
|
-
let mut group = c.benchmark_group("gate13_redux_transaction_throughput");
|
|
67
|
-
group.sample_size(50); // Multiple samples to establish variance
|
|
68
|
-
|
|
69
|
-
for pending_count in [100, 1000, 10000].iter() {
|
|
70
|
-
group.throughput(Throughput::Elements(*pending_count as u64));
|
|
71
|
-
group.bench_with_input(
|
|
72
|
-
BenchmarkId::new("pending_ops_released", pending_count),
|
|
73
|
-
pending_count,
|
|
74
|
-
|b, &pending| {
|
|
75
|
-
b.iter_batched(
|
|
76
|
-
|| {
|
|
77
|
-
let mut barrier = CausalDependencyBarrier::new();
|
|
78
|
-
populate_pending_operations(&mut barrier, pending, 4);
|
|
79
|
-
|
|
80
|
-
// Advance frontier to release all operations
|
|
81
|
-
let mut frontier = create_vector_clock_with_nodes(4);
|
|
82
|
-
frontier.clocks.insert("node_0".to_string(), 100);
|
|
83
|
-
barrier.get_frontier_mut().merge(&frontier);
|
|
84
|
-
|
|
85
|
-
barrier
|
|
86
|
-
},
|
|
87
|
-
|mut barrier| {
|
|
88
|
-
let released = barrier.check_unblocked_operations();
|
|
89
|
-
black_box(released.len())
|
|
90
|
-
},
|
|
91
|
-
criterion::BatchSize::LargeInput,
|
|
92
|
-
);
|
|
93
|
-
},
|
|
94
|
-
);
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
group.finish();
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
// ============================================================================
|
|
101
|
-
// DIMENSION 4-6: Latency Percentiles (p50, p95, p99)
|
|
102
|
-
// ============================================================================
|
|
103
|
-
|
|
104
|
-
/// Measure causal readiness latency across percentiles
|
|
105
|
-
fn benchmark_causal_readiness_latency(c: &mut Criterion) {
|
|
106
|
-
let mut group = c.benchmark_group("gate13_redux_causal_readiness");
|
|
107
|
-
group.sample_size(100); // High sample count for percentile stability
|
|
108
|
-
|
|
109
|
-
for node_count in [4, 8, 16].iter() {
|
|
110
|
-
group.bench_with_input(
|
|
111
|
-
BenchmarkId::new("readiness_check_nodes", node_count),
|
|
112
|
-
node_count,
|
|
113
|
-
|b, &nodes| {
|
|
114
|
-
let required = create_vector_clock_with_nodes(nodes);
|
|
115
|
-
b.iter(|| {
|
|
116
|
-
let mut barrier = CausalDependencyBarrier::new();
|
|
117
|
-
barrier.advance_frontier(&required);
|
|
118
|
-
let result = barrier.is_ready_frontier(black_box(&required));
|
|
119
|
-
black_box(result)
|
|
120
|
-
});
|
|
121
|
-
},
|
|
122
|
-
);
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
group.finish();
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
// ============================================================================
|
|
129
|
-
// DIMENSION 7-8: Release-Path Latency (causal readiness + release)
|
|
130
|
-
// ============================================================================
|
|
131
|
-
|
|
132
|
-
/// Measure causal release latency: full path from receive to check
|
|
133
|
-
fn benchmark_causal_release_latency(c: &mut Criterion) {
|
|
134
|
-
let mut group = c.benchmark_group("gate13_redux_causal_release");
|
|
135
|
-
group.sample_size(50); // Lower sample count; this test is expensive
|
|
136
|
-
|
|
137
|
-
for buffer_size in [100, 1000].iter() {
|
|
138
|
-
group.bench_with_input(
|
|
139
|
-
BenchmarkId::new("release_latency_buffer", buffer_size),
|
|
140
|
-
buffer_size,
|
|
141
|
-
|b, &size| {
|
|
142
|
-
b.iter_batched(
|
|
143
|
-
|| {
|
|
144
|
-
let mut barrier = CausalDependencyBarrier::new();
|
|
145
|
-
populate_pending_operations(&mut barrier, size, 4);
|
|
146
|
-
barrier
|
|
147
|
-
},
|
|
148
|
-
|mut barrier| {
|
|
149
|
-
// Measure end-to-end: frontier advance + release check
|
|
150
|
-
let mut frontier = create_vector_clock_with_nodes(4);
|
|
151
|
-
frontier.clocks.insert("node_0".to_string(), 100);
|
|
152
|
-
barrier.get_frontier_mut().merge(&frontier);
|
|
153
|
-
|
|
154
|
-
let released = barrier.check_unblocked_operations_indexed();
|
|
155
|
-
black_box(released.len())
|
|
156
|
-
},
|
|
157
|
-
criterion::BatchSize::LargeInput,
|
|
158
|
-
);
|
|
159
|
-
},
|
|
160
|
-
);
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
group.finish();
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
// ============================================================================
|
|
167
|
-
// DIMENSION 9: CPU Utilization (via operation count)
|
|
168
|
-
// ============================================================================
|
|
169
|
-
|
|
170
|
-
/// Measure CPU cost per operation through the indexed release path
|
|
171
|
-
fn benchmark_cpu_per_operation(c: &mut Criterion) {
|
|
172
|
-
let mut group = c.benchmark_group("gate13_redux_cpu_cost");
|
|
173
|
-
group.sample_size(100);
|
|
174
|
-
|
|
175
|
-
for op_count in [10, 100, 1000].iter() {
|
|
176
|
-
group.throughput(Throughput::Elements(*op_count as u64));
|
|
177
|
-
group.bench_with_input(
|
|
178
|
-
BenchmarkId::new("cpu_per_indexed_release", op_count),
|
|
179
|
-
op_count,
|
|
180
|
-
|b, &count| {
|
|
181
|
-
b.iter(|| {
|
|
182
|
-
let mut barrier = CausalDependencyBarrier::new();
|
|
183
|
-
for i in 0..count {
|
|
184
|
-
let mut required = VectorClock::new();
|
|
185
|
-
required.increment("node_0");
|
|
186
|
-
let _ = barrier.receive_operation(format!("op_{}", i), required);
|
|
187
|
-
}
|
|
188
|
-
let mut frontier = VectorClock::new();
|
|
189
|
-
frontier.increment("node_0");
|
|
190
|
-
barrier.get_frontier_mut().merge(&frontier);
|
|
191
|
-
|
|
192
|
-
black_box(barrier.check_unblocked_operations_indexed())
|
|
193
|
-
});
|
|
194
|
-
},
|
|
195
|
-
);
|
|
196
|
-
}
|
|
197
|
-
|
|
198
|
-
group.finish();
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
// ============================================================================
|
|
202
|
-
// DIMENSION 10: Dependency-Index Memory Overhead
|
|
203
|
-
// ============================================================================
|
|
204
|
-
|
|
205
|
-
/// Measure dependency index size as a function of pending operations
|
|
206
|
-
fn benchmark_index_memory_overhead(c: &mut Criterion) {
|
|
207
|
-
let mut group = c.benchmark_group("gate13_redux_index_memory");
|
|
208
|
-
group.sample_size(10); // Low sample; this measures steady-state
|
|
209
|
-
|
|
210
|
-
for pending_count in [100, 1000, 10000].iter() {
|
|
211
|
-
group.bench_with_input(
|
|
212
|
-
BenchmarkId::new("index_entries", pending_count),
|
|
213
|
-
pending_count,
|
|
214
|
-
|b, &count| {
|
|
215
|
-
b.iter(|| {
|
|
216
|
-
let mut barrier = CausalDependencyBarrier::new();
|
|
217
|
-
populate_pending_operations(&mut barrier, count, 4);
|
|
218
|
-
|
|
219
|
-
let index_entries = barrier.get_dependency_index().entry_count();
|
|
220
|
-
black_box(index_entries)
|
|
221
|
-
});
|
|
222
|
-
},
|
|
223
|
-
);
|
|
224
|
-
}
|
|
225
|
-
|
|
226
|
-
group.finish();
|
|
227
|
-
}
|
|
228
|
-
|
|
229
|
-
// ============================================================================
|
|
230
|
-
// DIMENSION 11: Index Maintenance Cost
|
|
231
|
-
// ============================================================================
|
|
232
|
-
|
|
233
|
-
/// Measure cost of maintaining the dependency index during operations
|
|
234
|
-
fn benchmark_index_maintenance_cost(c: &mut Criterion) {
|
|
235
|
-
let mut group = c.benchmark_group("gate13_redux_index_maintenance");
|
|
236
|
-
group.sample_size(100);
|
|
237
|
-
|
|
238
|
-
for node_count in [2, 4, 8].iter() {
|
|
239
|
-
group.throughput(Throughput::Elements(1));
|
|
240
|
-
group.bench_with_input(
|
|
241
|
-
BenchmarkId::new("receive_and_index", node_count),
|
|
242
|
-
node_count,
|
|
243
|
-
|b, &nodes| {
|
|
244
|
-
let required = create_vector_clock_with_nodes(nodes);
|
|
245
|
-
b.iter(|| {
|
|
246
|
-
let mut barrier = CausalDependencyBarrier::new();
|
|
247
|
-
let _ = barrier
|
|
248
|
-
.receive_operation("op_test".to_string(), black_box(required.clone()));
|
|
249
|
-
black_box(barrier.get_dependency_index().entry_count())
|
|
250
|
-
});
|
|
251
|
-
},
|
|
252
|
-
);
|
|
253
|
-
}
|
|
254
|
-
|
|
255
|
-
group.finish();
|
|
256
|
-
}
|
|
257
|
-
|
|
258
|
-
// ============================================================================
|
|
259
|
-
// DIMENSION 12: Vector Clock Cost
|
|
260
|
-
// ============================================================================
|
|
261
|
-
|
|
262
|
-
/// Measure vector clock operations (comparison, increment, merge)
|
|
263
|
-
fn benchmark_vector_clock_cost(c: &mut Criterion) {
|
|
264
|
-
let mut group = c.benchmark_group("gate13_redux_vector_clock");
|
|
265
|
-
group.sample_size(100);
|
|
266
|
-
|
|
267
|
-
for node_count in [1, 4, 8, 16].iter() {
|
|
268
|
-
// Increment cost
|
|
269
|
-
group.throughput(Throughput::Elements(1));
|
|
270
|
-
group.bench_with_input(
|
|
271
|
-
BenchmarkId::new("increment", node_count),
|
|
272
|
-
node_count,
|
|
273
|
-
|b, &nodes| {
|
|
274
|
-
let mut clock = create_vector_clock_with_nodes(nodes);
|
|
275
|
-
b.iter(|| {
|
|
276
|
-
clock.increment("node_0");
|
|
277
|
-
black_box(clock.get("node_0"))
|
|
278
|
-
});
|
|
279
|
-
},
|
|
280
|
-
);
|
|
281
|
-
|
|
282
|
-
// Comparison cost
|
|
283
|
-
group.throughput(Throughput::Elements(1));
|
|
284
|
-
group.bench_with_input(
|
|
285
|
-
BenchmarkId::new("compare", node_count),
|
|
286
|
-
node_count,
|
|
287
|
-
|b, &nodes| {
|
|
288
|
-
let clock1 = create_vector_clock_with_nodes(nodes);
|
|
289
|
-
let clock2 = create_vector_clock_with_nodes(nodes);
|
|
290
|
-
b.iter(|| black_box(black_box(&clock1).happens_before(black_box(&clock2))));
|
|
291
|
-
},
|
|
292
|
-
);
|
|
293
|
-
}
|
|
294
|
-
|
|
295
|
-
group.finish();
|
|
296
|
-
}
|
|
297
|
-
|
|
298
|
-
// ============================================================================
|
|
299
|
-
// DIMENSION 13: Deduplication Cost
|
|
300
|
-
// ============================================================================
|
|
301
|
-
|
|
302
|
-
/// Measure cost of deduplication via operation ID lookup
|
|
303
|
-
fn benchmark_deduplication_cost(c: &mut Criterion) {
|
|
304
|
-
let mut group = c.benchmark_group("gate13_redux_deduplication");
|
|
305
|
-
group.sample_size(100);
|
|
306
|
-
|
|
307
|
-
for dedup_set_size in [10, 100, 1000].iter() {
|
|
308
|
-
group.throughput(Throughput::Elements(1));
|
|
309
|
-
group.bench_with_input(
|
|
310
|
-
BenchmarkId::new("dedup_lookup", dedup_set_size),
|
|
311
|
-
dedup_set_size,
|
|
312
|
-
|b, &size| {
|
|
313
|
-
let mut dedup = std::collections::HashSet::new();
|
|
314
|
-
for i in 0..size {
|
|
315
|
-
dedup.insert(format!("op_{}", i));
|
|
316
|
-
}
|
|
317
|
-
|
|
318
|
-
b.iter(|| {
|
|
319
|
-
let op_id = format!("op_{}", black_box(size / 2));
|
|
320
|
-
black_box(dedup.contains(&op_id))
|
|
321
|
-
});
|
|
322
|
-
},
|
|
323
|
-
);
|
|
324
|
-
}
|
|
325
|
-
|
|
326
|
-
group.finish();
|
|
327
|
-
}
|
|
328
|
-
|
|
329
|
-
// ============================================================================
|
|
330
|
-
// DIMENSION 14: State Hashing Cost
|
|
331
|
-
// ============================================================================
|
|
332
|
-
|
|
333
|
-
/// Measure cost of state hashing for convergence validation
|
|
334
|
-
fn benchmark_state_hashing_cost(c: &mut Criterion) {
|
|
335
|
-
let mut group = c.benchmark_group("gate13_redux_state_hashing");
|
|
336
|
-
group.sample_size(50);
|
|
337
|
-
|
|
338
|
-
for record_count in [100, 1000, 10000].iter() {
|
|
339
|
-
group.throughput(Throughput::Elements(1));
|
|
340
|
-
group.bench_with_input(
|
|
341
|
-
BenchmarkId::new("hash_records", record_count),
|
|
342
|
-
record_count,
|
|
343
|
-
|b, &count| {
|
|
344
|
-
b.iter(|| {
|
|
345
|
-
let mut hasher = std::collections::hash_map::DefaultHasher::new();
|
|
346
|
-
use std::hash::{Hash, Hasher};
|
|
347
|
-
|
|
348
|
-
for i in 0..count {
|
|
349
|
-
format!("record_{}_state", i).hash(&mut hasher);
|
|
350
|
-
}
|
|
351
|
-
black_box(hasher.finish())
|
|
352
|
-
});
|
|
353
|
-
},
|
|
354
|
-
);
|
|
355
|
-
}
|
|
356
|
-
|
|
357
|
-
group.finish();
|
|
358
|
-
}
|
|
359
|
-
|
|
360
|
-
// ============================================================================
|
|
361
|
-
// DIMENSION 15: Snapshot Cost (simplified)
|
|
362
|
-
// ============================================================================
|
|
363
|
-
|
|
364
|
-
/// Measure cost of creating a snapshot via barrier state
|
|
365
|
-
fn benchmark_snapshot_cost(c: &mut Criterion) {
|
|
366
|
-
let mut group = c.benchmark_group("gate13_redux_snapshots");
|
|
367
|
-
group.sample_size(50);
|
|
368
|
-
|
|
369
|
-
for pending_count in [100, 1000].iter() {
|
|
370
|
-
group.bench_with_input(
|
|
371
|
-
BenchmarkId::new("snapshot_pending", pending_count),
|
|
372
|
-
pending_count,
|
|
373
|
-
|b, &count| {
|
|
374
|
-
b.iter(|| {
|
|
375
|
-
let mut barrier = CausalDependencyBarrier::new();
|
|
376
|
-
populate_pending_operations(&mut barrier, count, 4);
|
|
377
|
-
|
|
378
|
-
// Snapshot: collect current pending state
|
|
379
|
-
let pending = barrier.get_pending_operations();
|
|
380
|
-
black_box(pending.len())
|
|
381
|
-
});
|
|
382
|
-
},
|
|
383
|
-
);
|
|
384
|
-
}
|
|
385
|
-
|
|
386
|
-
group.finish();
|
|
387
|
-
}
|
|
388
|
-
|
|
389
|
-
// ============================================================================
|
|
390
|
-
// DIMENSION 16: Recovery Cost (simplified)
|
|
391
|
-
// ============================================================================
|
|
392
|
-
|
|
393
|
-
/// Measure cost of recovering barrier state
|
|
394
|
-
fn benchmark_recovery_cost(c: &mut Criterion) {
|
|
395
|
-
let mut group = c.benchmark_group("gate13_redux_recovery");
|
|
396
|
-
group.sample_size(50);
|
|
397
|
-
|
|
398
|
-
for pending_count in [100, 1000].iter() {
|
|
399
|
-
group.bench_with_input(
|
|
400
|
-
BenchmarkId::new("recovery_reconstruct", pending_count),
|
|
401
|
-
pending_count,
|
|
402
|
-
|b, &count| {
|
|
403
|
-
b.iter(|| {
|
|
404
|
-
// Recovery: reconstruct barrier from pending log
|
|
405
|
-
let mut barrier = CausalDependencyBarrier::new();
|
|
406
|
-
for i in 0..count {
|
|
407
|
-
let mut required = create_vector_clock_with_nodes(2);
|
|
408
|
-
required.clocks.insert("node_0".to_string(), 100);
|
|
409
|
-
let _ = barrier.receive_operation(format!("op_{}", i), required);
|
|
410
|
-
}
|
|
411
|
-
|
|
412
|
-
black_box(barrier.get_pending_operations().len())
|
|
413
|
-
});
|
|
414
|
-
},
|
|
415
|
-
);
|
|
416
|
-
}
|
|
417
|
-
|
|
418
|
-
group.finish();
|
|
419
|
-
}
|
|
420
|
-
|
|
421
|
-
// ============================================================================
|
|
422
|
-
// Registry and main
|
|
423
|
-
// ============================================================================
|
|
424
|
-
|
|
425
|
-
criterion_group!(
|
|
426
|
-
benches,
|
|
427
|
-
benchmark_transaction_throughput,
|
|
428
|
-
benchmark_causal_readiness_latency,
|
|
429
|
-
benchmark_causal_release_latency,
|
|
430
|
-
benchmark_cpu_per_operation,
|
|
431
|
-
benchmark_index_memory_overhead,
|
|
432
|
-
benchmark_index_maintenance_cost,
|
|
433
|
-
benchmark_vector_clock_cost,
|
|
434
|
-
benchmark_deduplication_cost,
|
|
435
|
-
benchmark_state_hashing_cost,
|
|
436
|
-
benchmark_snapshot_cost,
|
|
437
|
-
benchmark_recovery_cost,
|
|
438
|
-
);
|
|
439
|
-
|
|
440
|
-
criterion_main!(benches);
|