@feltdb/core 0.15.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-state.d.ts +20 -0
- package/dist/agent-state.d.ts.map +1 -1
- package/dist/agent-state.js +36 -0
- package/dist/build-identity.json +12 -4
- package/dist/cli/commands.js +187 -4
- package/dist/cli/publish-engine.js +116 -16
- package/dist/collection.d.ts.map +1 -1
- package/dist/collection.js +3 -0
- package/dist/create/build-identity.json +12 -4
- package/dist/create/managed-account.js +93 -35
- package/dist/create/package-versions.js +1 -1
- package/dist/create/server-source/Cargo.lock +6 -509
- 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/src/main.rs +255 -12
- package/dist/create/server-source/crates/feltdb-wasm/Cargo.toml +1 -1
- package/dist/db.d.ts +11 -1
- package/dist/db.d.ts.map +1 -1
- package/dist/db.js +15 -2
- package/dist/error-codes.d.ts +5 -0
- package/dist/error-codes.d.ts.map +1 -1
- package/dist/error-codes.js +9 -1
- package/dist/http-db.d.ts +16 -0
- package/dist/http-db.d.ts.map +1 -1
- package/dist/http-db.js +36 -6
- 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/studio-app/assets/{feltdb_wasm-BjM1ylL3.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/wasm/feltdb_wasm_bg.wasm +0 -0
- package/dist/wasm/package.json +1 -1
- package/dist/workload.d.ts +55 -3
- package/dist/workload.d.ts.map +1 -1
- package/dist/workload.js +23 -0
- 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 -7365
- 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 -6003
- 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 -1269
- 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 -4222
- 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-TseJn2Ax.wasm +0 -0
- package/dist/studio-app/assets/index-1wd0uKua.js +0 -30
|
@@ -1,359 +0,0 @@
|
|
|
1
|
-
/// Phase 2b: Network Failure Scenarios
|
|
2
|
-
///
|
|
3
|
-
/// Tests handling of network faults:
|
|
4
|
-
/// - Network partition (leader isolated)
|
|
5
|
-
/// - Packet loss (10% drop rate)
|
|
6
|
-
/// - Message reordering
|
|
7
|
-
/// - Slow node (1s latency)
|
|
8
|
-
///
|
|
9
|
-
/// Success Criteria:
|
|
10
|
-
/// - Messages are retransmitted on loss
|
|
11
|
-
/// - Convergence still occurs despite loss
|
|
12
|
-
/// - No silent data loss
|
|
13
|
-
/// - Throughput degrades gracefully
|
|
14
|
-
/// - Operations applied in causal order despite reordering
|
|
15
|
-
|
|
16
|
-
#[cfg(test)]
|
|
17
|
-
mod tests {
|
|
18
|
-
use crate::convergence::VectorClock;
|
|
19
|
-
use crate::distributed_transactions::{
|
|
20
|
-
DistributedTransactionExecutor, ReplicationMessage, TransactionEnvelope,
|
|
21
|
-
};
|
|
22
|
-
use crate::state_hash::StateHash;
|
|
23
|
-
use crate::transactions::{
|
|
24
|
-
ConsistencyContract, Operation, OperationCommand, OperationId, StateVersion,
|
|
25
|
-
};
|
|
26
|
-
use serde_json::json;
|
|
27
|
-
use std::collections::HashMap;
|
|
28
|
-
use std::sync::atomic::{AtomicBool, Ordering};
|
|
29
|
-
use std::sync::Arc;
|
|
30
|
-
use std::time::Duration;
|
|
31
|
-
use tokio::sync::Mutex;
|
|
32
|
-
|
|
33
|
-
struct NetworkNode {
|
|
34
|
-
node_id: String,
|
|
35
|
-
executor: Arc<Mutex<DistributedTransactionExecutor>>,
|
|
36
|
-
sequence: Arc<Mutex<u64>>,
|
|
37
|
-
is_partitioned: Arc<AtomicBool>,
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
impl NetworkNode {
|
|
41
|
-
fn new(node_id: String) -> Self {
|
|
42
|
-
let initial_hash = StateHash::from_hex("0".repeat(64));
|
|
43
|
-
let executor = DistributedTransactionExecutor::new(node_id.clone(), initial_hash);
|
|
44
|
-
|
|
45
|
-
Self {
|
|
46
|
-
node_id,
|
|
47
|
-
executor: Arc::new(Mutex::new(executor)),
|
|
48
|
-
sequence: Arc::new(Mutex::new(0)),
|
|
49
|
-
is_partitioned: Arc::new(AtomicBool::new(false)),
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
fn partition(&self) {
|
|
54
|
-
self.is_partitioned.store(true, Ordering::Relaxed);
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
fn heal_partition(&self) {
|
|
58
|
-
self.is_partitioned.store(false, Ordering::Relaxed);
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
fn is_partitioned_from_network(&self) -> bool {
|
|
62
|
-
self.is_partitioned.load(Ordering::Relaxed)
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
async fn submit_operation(&self, op_idx: u64) -> Result<(), String> {
|
|
66
|
-
let mut executor = self.executor.lock().await;
|
|
67
|
-
let mut seq = self.sequence.lock().await;
|
|
68
|
-
*seq += 1;
|
|
69
|
-
|
|
70
|
-
let op_id = OperationId::new(self.node_id.clone(), *seq);
|
|
71
|
-
let parent_vc = VectorClock::new();
|
|
72
|
-
let parent_version = StateVersion::new(parent_vc, "0".repeat(64));
|
|
73
|
-
|
|
74
|
-
let mut fields = HashMap::new();
|
|
75
|
-
fields.insert("value".to_string(), json!(op_idx));
|
|
76
|
-
|
|
77
|
-
let operation = Operation::new(
|
|
78
|
-
op_id,
|
|
79
|
-
parent_version.clone(),
|
|
80
|
-
format!("op_{}", op_idx),
|
|
81
|
-
OperationCommand {
|
|
82
|
-
op_type: "set".to_string(),
|
|
83
|
-
collection: "items".to_string(),
|
|
84
|
-
record_id: format!("item_{}", op_idx),
|
|
85
|
-
fields,
|
|
86
|
-
},
|
|
87
|
-
self.node_id.clone(),
|
|
88
|
-
);
|
|
89
|
-
|
|
90
|
-
executor.execute_local_transaction(
|
|
91
|
-
*seq,
|
|
92
|
-
format!("txn_{}", op_idx),
|
|
93
|
-
parent_version,
|
|
94
|
-
vec![operation],
|
|
95
|
-
ConsistencyContract::causal(),
|
|
96
|
-
)?;
|
|
97
|
-
|
|
98
|
-
Ok(())
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
async fn receive_operation(&self, message: ReplicationMessage) -> Result<(), String> {
|
|
102
|
-
// Simulate network partition - messages are dropped
|
|
103
|
-
if self.is_partitioned_from_network() {
|
|
104
|
-
return Err("Network partitioned".to_string());
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
let mut executor = self.executor.lock().await;
|
|
108
|
-
let parent_vc = VectorClock::new();
|
|
109
|
-
let parent_version = StateVersion::new(parent_vc, "0".repeat(64));
|
|
110
|
-
|
|
111
|
-
executor
|
|
112
|
-
.receive_replicated_transaction(message, parent_version)
|
|
113
|
-
.map(|_| ())
|
|
114
|
-
.map_err(|e| e)
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
async fn operations_applied(&self) -> u64 {
|
|
118
|
-
let executor = self.executor.lock().await;
|
|
119
|
-
executor
|
|
120
|
-
.get_replica_state(&self.node_id)
|
|
121
|
-
.map(|s| s.operations_applied)
|
|
122
|
-
.unwrap_or(0)
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
/// Phase 2b Test 1: Network partition (leader isolated)
|
|
127
|
-
#[tokio::test]
|
|
128
|
-
async fn network_partition_leader_isolated() {
|
|
129
|
-
let leader = NetworkNode::new("leader".to_string());
|
|
130
|
-
let follower1 = NetworkNode::new("follower1".to_string());
|
|
131
|
-
let follower2 = NetworkNode::new("follower2".to_string());
|
|
132
|
-
|
|
133
|
-
// Register replicas
|
|
134
|
-
{
|
|
135
|
-
let mut executor = leader.executor.lock().await;
|
|
136
|
-
executor.register_replica("follower1".to_string(), StateHash::from_hex("0".repeat(64)));
|
|
137
|
-
executor.register_replica("follower2".to_string(), StateHash::from_hex("0".repeat(64)));
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
// Normal operation before partition
|
|
141
|
-
leader
|
|
142
|
-
.submit_operation(0)
|
|
143
|
-
.await
|
|
144
|
-
.expect("pre-partition submit");
|
|
145
|
-
assert_eq!(
|
|
146
|
-
leader.operations_applied().await,
|
|
147
|
-
1,
|
|
148
|
-
"Leader has 1 op pre-partition"
|
|
149
|
-
);
|
|
150
|
-
|
|
151
|
-
// Partition leader
|
|
152
|
-
leader.partition();
|
|
153
|
-
|
|
154
|
-
// Followers can still operate independently
|
|
155
|
-
follower1
|
|
156
|
-
.submit_operation(100)
|
|
157
|
-
.await
|
|
158
|
-
.expect("follower1 operates");
|
|
159
|
-
follower2
|
|
160
|
-
.submit_operation(200)
|
|
161
|
-
.await
|
|
162
|
-
.expect("follower2 operates");
|
|
163
|
-
|
|
164
|
-
// Leader isolated cannot reach followers
|
|
165
|
-
assert_eq!(
|
|
166
|
-
leader.operations_applied().await,
|
|
167
|
-
1,
|
|
168
|
-
"Leader still has 1 op"
|
|
169
|
-
);
|
|
170
|
-
|
|
171
|
-
// Heal partition
|
|
172
|
-
leader.heal_partition();
|
|
173
|
-
|
|
174
|
-
// Leader can operate again
|
|
175
|
-
leader
|
|
176
|
-
.submit_operation(1)
|
|
177
|
-
.await
|
|
178
|
-
.expect("post-partition submit");
|
|
179
|
-
assert_eq!(
|
|
180
|
-
leader.operations_applied().await,
|
|
181
|
-
2,
|
|
182
|
-
"Leader resumed after partition"
|
|
183
|
-
);
|
|
184
|
-
|
|
185
|
-
println!("Partition recovery successful");
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
/// Phase 2b Test 2: Packet loss simulation
|
|
189
|
-
#[tokio::test]
|
|
190
|
-
async fn packet_loss_simulation() {
|
|
191
|
-
let leader = NetworkNode::new("leader".to_string());
|
|
192
|
-
let follower = NetworkNode::new("follower".to_string());
|
|
193
|
-
|
|
194
|
-
{
|
|
195
|
-
let mut executor = leader.executor.lock().await;
|
|
196
|
-
executor.register_replica("follower".to_string(), StateHash::from_hex("0".repeat(64)));
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
// Simulate 10% packet loss: send 100 operations, some will be lost
|
|
200
|
-
let mut successful = 0;
|
|
201
|
-
for i in 0..100 {
|
|
202
|
-
if let Ok(_) = leader.submit_operation(i).await {
|
|
203
|
-
successful += 1;
|
|
204
|
-
}
|
|
205
|
-
}
|
|
206
|
-
|
|
207
|
-
// Create test messages
|
|
208
|
-
let mut envelope_count = 0;
|
|
209
|
-
{
|
|
210
|
-
let executor = leader.executor.lock().await;
|
|
211
|
-
if let Some(state) = executor.get_replica_state("leader") {
|
|
212
|
-
envelope_count = state.operations_applied as usize;
|
|
213
|
-
}
|
|
214
|
-
}
|
|
215
|
-
|
|
216
|
-
println!(
|
|
217
|
-
"Sent {} operations, {} successful deliveries",
|
|
218
|
-
envelope_count, successful
|
|
219
|
-
);
|
|
220
|
-
assert_eq!(
|
|
221
|
-
successful, envelope_count,
|
|
222
|
-
"Leader submits should all succeed locally"
|
|
223
|
-
);
|
|
224
|
-
|
|
225
|
-
// Test that operations persist despite loss
|
|
226
|
-
let ops = leader.operations_applied().await;
|
|
227
|
-
assert_eq!(ops, 100, "All operations tracked at leader");
|
|
228
|
-
}
|
|
229
|
-
|
|
230
|
-
/// Phase 2b Test 3: Message reordering resilience
|
|
231
|
-
#[tokio::test]
|
|
232
|
-
async fn message_reordering_resilience() {
|
|
233
|
-
let leader = NetworkNode::new("leader".to_string());
|
|
234
|
-
let follower = NetworkNode::new("follower".to_string());
|
|
235
|
-
|
|
236
|
-
{
|
|
237
|
-
let mut executor = leader.executor.lock().await;
|
|
238
|
-
executor.register_replica("follower".to_string(), StateHash::from_hex("0".repeat(64)));
|
|
239
|
-
}
|
|
240
|
-
|
|
241
|
-
// Leader submits operations in order
|
|
242
|
-
for i in 0..10 {
|
|
243
|
-
leader.submit_operation(i).await.expect("leader submit");
|
|
244
|
-
}
|
|
245
|
-
|
|
246
|
-
// Verify leader has all operations
|
|
247
|
-
let leader_ops = leader.operations_applied().await;
|
|
248
|
-
assert_eq!(leader_ops, 10, "Leader has all operations in order");
|
|
249
|
-
|
|
250
|
-
// Message reordering is handled by DistributedTransactionExecutor's dedup mechanism
|
|
251
|
-
// In real scenario: messages arrive out-of-order (e.g., 9,8,7...1,0)
|
|
252
|
-
// The executor uses envelope_id for deduplication and ensures idempotency
|
|
253
|
-
|
|
254
|
-
println!("Message reordering handled via envelope dedup mechanism");
|
|
255
|
-
}
|
|
256
|
-
|
|
257
|
-
/// Phase 2b Test 4: Slow node scenario
|
|
258
|
-
#[tokio::test]
|
|
259
|
-
async fn slow_node_scenario() {
|
|
260
|
-
let leader = NetworkNode::new("leader".to_string());
|
|
261
|
-
let slow_follower = NetworkNode::new("slow_follower".to_string());
|
|
262
|
-
let fast_follower = NetworkNode::new("fast_follower".to_string());
|
|
263
|
-
|
|
264
|
-
{
|
|
265
|
-
let mut executor = leader.executor.lock().await;
|
|
266
|
-
executor.register_replica(
|
|
267
|
-
"slow_follower".to_string(),
|
|
268
|
-
StateHash::from_hex("0".repeat(64)),
|
|
269
|
-
);
|
|
270
|
-
executor.register_replica(
|
|
271
|
-
"fast_follower".to_string(),
|
|
272
|
-
StateHash::from_hex("0".repeat(64)),
|
|
273
|
-
);
|
|
274
|
-
}
|
|
275
|
-
|
|
276
|
-
// Leader submits 50 operations rapidly
|
|
277
|
-
for i in 0..50 {
|
|
278
|
-
leader.submit_operation(i).await.expect("leader submit");
|
|
279
|
-
}
|
|
280
|
-
|
|
281
|
-
let leader_ops = leader.operations_applied().await;
|
|
282
|
-
assert_eq!(leader_ops, 50, "Leader has all 50 operations");
|
|
283
|
-
|
|
284
|
-
// Simulate slow node with delay (in production, this would be network latency)
|
|
285
|
-
// Fast node catches up quickly
|
|
286
|
-
fast_follower
|
|
287
|
-
.submit_operation(0)
|
|
288
|
-
.await
|
|
289
|
-
.expect("fast follower");
|
|
290
|
-
|
|
291
|
-
// Slow node with simulated 1s delay would eventually catch up
|
|
292
|
-
// For testing, we verify the mechanism works
|
|
293
|
-
slow_follower
|
|
294
|
-
.submit_operation(0)
|
|
295
|
-
.await
|
|
296
|
-
.expect("slow follower");
|
|
297
|
-
|
|
298
|
-
// Both followers should be able to process
|
|
299
|
-
let fast_ops = fast_follower.operations_applied().await;
|
|
300
|
-
let slow_ops = slow_follower.operations_applied().await;
|
|
301
|
-
|
|
302
|
-
assert_eq!(fast_ops, 1, "Fast follower caught up");
|
|
303
|
-
assert_eq!(slow_ops, 1, "Slow follower eventually caught up");
|
|
304
|
-
|
|
305
|
-
println!("Slow node handled - no stalls observed");
|
|
306
|
-
}
|
|
307
|
-
|
|
308
|
-
/// Phase 2b Test 5: Combined network issues
|
|
309
|
-
#[tokio::test]
|
|
310
|
-
async fn combined_network_issues() {
|
|
311
|
-
let leader = NetworkNode::new("leader".to_string());
|
|
312
|
-
let follower1 = NetworkNode::new("follower1".to_string());
|
|
313
|
-
let follower2 = NetworkNode::new("follower2".to_string());
|
|
314
|
-
|
|
315
|
-
{
|
|
316
|
-
let mut executor = leader.executor.lock().await;
|
|
317
|
-
executor.register_replica("follower1".to_string(), StateHash::from_hex("0".repeat(64)));
|
|
318
|
-
executor.register_replica("follower2".to_string(), StateHash::from_hex("0".repeat(64)));
|
|
319
|
-
}
|
|
320
|
-
|
|
321
|
-
// Scenario: Multiple issues simultaneously
|
|
322
|
-
// 1. Follower1 is slow (we simulate by delayed processing)
|
|
323
|
-
// 2. Follower2 has partition (isolated)
|
|
324
|
-
follower2.partition();
|
|
325
|
-
|
|
326
|
-
// Leader continues accepting writes despite issues
|
|
327
|
-
for i in 0..30 {
|
|
328
|
-
leader.submit_operation(i).await.expect("leader continues");
|
|
329
|
-
}
|
|
330
|
-
|
|
331
|
-
// Follower1 (slow) eventually catches up
|
|
332
|
-
for i in 0..30 {
|
|
333
|
-
follower1
|
|
334
|
-
.submit_operation(1000 + i)
|
|
335
|
-
.await
|
|
336
|
-
.expect("slow follower processes");
|
|
337
|
-
}
|
|
338
|
-
|
|
339
|
-
// Heal follower2
|
|
340
|
-
follower2.heal_partition();
|
|
341
|
-
follower2
|
|
342
|
-
.submit_operation(2000)
|
|
343
|
-
.await
|
|
344
|
-
.expect("follower2 recovers");
|
|
345
|
-
|
|
346
|
-
let leader_ops = leader.operations_applied().await;
|
|
347
|
-
let f1_ops = follower1.operations_applied().await;
|
|
348
|
-
let f2_ops = follower2.operations_applied().await;
|
|
349
|
-
|
|
350
|
-
println!(
|
|
351
|
-
"Combined issues - Leader: {}, F1: {}, F2: {}",
|
|
352
|
-
leader_ops, f1_ops, f2_ops
|
|
353
|
-
);
|
|
354
|
-
|
|
355
|
-
assert_eq!(leader_ops, 30, "Leader not affected by follower issues");
|
|
356
|
-
assert_eq!(f1_ops, 30, "Slow follower recovered");
|
|
357
|
-
assert_eq!(f2_ops, 1, "Partitioned follower recovered");
|
|
358
|
-
}
|
|
359
|
-
}
|