@feltdb/core 0.8.4 → 0.8.6
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/create/package-versions.js +1 -1
- package/dist/create/server-source/Cargo.lock +165 -0
- package/dist/create/server-source/Cargo.toml +9 -0
- package/dist/create/server-source/crates/feltdb/Cargo.toml +3 -0
- package/dist/create/server-source/crates/feltdb/benches/gate13_baseline.rs +44 -44
- package/dist/create/server-source/crates/feltdb/benches/gate13_phase_7_1_release_economics.rs +12 -24
- package/dist/create/server-source/crates/feltdb/benches/gate_13_redux.rs +7 -13
- package/dist/create/server-source/crates/feltdb/benches/gate_13_regression_runner.rs +13 -10
- package/dist/create/server-source/crates/feltdb/benches/gate_14a_concurrent_writer_scaling.rs +12 -9
- package/dist/create/server-source/crates/feltdb/benches/gate_14a_production_admission_revalidation.rs +78 -25
- package/dist/create/server-source/crates/feltdb/benches/gate_14a_rc2_admission_contract.rs +16 -13
- package/dist/create/server-source/crates/feltdb/benches/gate_14a_rc_root_cause.rs +13 -5
- package/dist/create/server-source/crates/feltdb/benches/gate_14a_sync1_queued_prototype.rs +41 -22
- package/dist/create/server-source/crates/feltdb/benches/gate_14a_sync_economics.rs +33 -15
- package/dist/create/server-source/crates/feltdb/benches/gate_14b_causal_backlog_scaling.rs +100 -33
- package/dist/create/server-source/crates/feltdb/benches/gate_14c_replication_contract_test.rs +56 -20
- package/dist/create/server-source/crates/feltdb/benches/gate_14c_replication_scaling.rs +116 -41
- package/dist/create/server-source/crates/feltdb/benches/gate_14d_combined_dimension_scaling.rs +186 -55
- package/dist/create/server-source/crates/feltdb/benches/phase_7_1_2_optimization_benchmark.rs +64 -26
- package/dist/create/server-source/crates/feltdb/benches/phase_7_1_3_crossover_analysis.rs +46 -15
- package/dist/create/server-source/crates/feltdb/src/admission.rs +8 -15
- package/dist/create/server-source/crates/feltdb/src/admission_contract_tests.rs +43 -13
- package/dist/create/server-source/crates/feltdb/src/adversarial_transport.rs +15 -42
- package/dist/create/server-source/crates/feltdb/src/analytics.rs +65 -19
- package/dist/create/server-source/crates/feltdb/src/application.rs +113 -30
- package/dist/create/server-source/crates/feltdb/src/authorization_security_tests.rs +475 -140
- package/dist/create/server-source/crates/feltdb/src/cardinality_diagnostics.rs +17 -15
- package/dist/create/server-source/crates/feltdb/src/cardinality_endpoint.rs +0 -1
- package/dist/create/server-source/crates/feltdb/src/causal_backlog_bound.rs +59 -15
- package/dist/create/server-source/crates/feltdb/src/causal_dependency_barrier.rs +266 -114
- package/dist/create/server-source/crates/feltdb/src/causal_dependency_barrier_phase_7_1.rs +25 -7
- package/dist/create/server-source/crates/feltdb/src/concurrency_fuzzing.rs +10 -15
- package/dist/create/server-source/crates/feltdb/src/consistency_contract.rs +3 -11
- package/dist/create/server-source/crates/feltdb/src/crash_atomic_boundary.rs +14 -5
- package/dist/create/server-source/crates/feltdb/src/crash_injection.rs +21 -25
- package/dist/create/server-source/crates/feltdb/src/crash_recovery_tests.rs +14 -11
- package/dist/create/server-source/crates/feltdb/src/dedup_bound_investigation.rs +103 -22
- package/dist/create/server-source/crates/feltdb/src/distributed_indexing.rs +18 -15
- package/dist/create/server-source/crates/feltdb/src/durability_guarantees.rs +12 -8
- package/dist/create/server-source/crates/feltdb/src/durable_dedup_set.rs +1 -5
- package/dist/create/server-source/crates/feltdb/src/durable_operation_identity.rs +87 -23
- package/dist/create/server-source/crates/feltdb/src/durable_operation_log.rs +3 -7
- package/dist/create/server-source/crates/feltdb/src/durable_sync.rs +10 -9
- package/dist/create/server-source/crates/feltdb/src/in_process_transport.rs +1 -6
- package/dist/create/server-source/crates/feltdb/src/indexing.rs +35 -38
- package/dist/create/server-source/crates/feltdb/src/lib.rs +1648 -46
- package/dist/create/server-source/crates/feltdb/src/managed_cas_tests.rs +4 -1
- package/dist/create/server-source/crates/feltdb/src/metrics.rs +0 -1
- package/dist/create/server-source/crates/feltdb/src/multi_node_convergence.rs +1 -2
- package/dist/create/server-source/crates/feltdb/src/multi_operation_transaction.rs +107 -30
- package/dist/create/server-source/crates/feltdb/src/observability.rs +19 -6
- package/dist/create/server-source/crates/feltdb/src/operation.rs +39 -0
- package/dist/create/server-source/crates/feltdb/src/operation_algebra.rs +12 -11
- package/dist/create/server-source/crates/feltdb/src/operation_log.rs +9 -4
- package/dist/create/server-source/crates/feltdb/src/p1_application_atomicity.rs +65 -18
- package/dist/create/server-source/crates/feltdb/src/p1_atomicity_acceptance.rs +193 -57
- package/dist/create/server-source/crates/feltdb/src/partition_reconciliation.rs +37 -27
- package/dist/create/server-source/crates/feltdb/src/permutation_scheduler.rs +38 -10
- package/dist/create/server-source/crates/feltdb/src/persistence_reality.rs +20 -14
- package/dist/create/server-source/crates/feltdb/src/phase1b_acceptance.rs +394 -229
- package/dist/create/server-source/crates/feltdb/src/phase1c1_acceptance.rs +8 -6
- package/dist/create/server-source/crates/feltdb/src/phase1c2_acceptance.rs +11 -13
- package/dist/create/server-source/crates/feltdb/src/phase1c3_acceptance.rs +79 -70
- package/dist/create/server-source/crates/feltdb/src/phase1c_atomicity_proof.rs +3 -3
- package/dist/create/server-source/crates/feltdb/src/phase5_integration.rs +33 -11
- package/dist/create/server-source/crates/feltdb/src/phase5_scenarios.rs +6 -6
- package/dist/create/server-source/crates/feltdb/src/phase6_adversarial_scenarios.rs +14 -56
- package/dist/create/server-source/crates/feltdb/src/phase6_convergence_validator.rs +29 -27
- package/dist/create/server-source/crates/feltdb/src/phase6_persistence.rs +35 -17
- package/dist/create/server-source/crates/feltdb/src/phase_1c_real_tcp.rs +8 -2
- package/dist/create/server-source/crates/feltdb/src/phase_2a_failures.rs +59 -15
- package/dist/create/server-source/crates/feltdb/src/phase_2b_network.rs +70 -17
- package/dist/create/server-source/crates/feltdb/src/phase_2c_cascading.rs +23 -6
- package/dist/create/server-source/crates/feltdb/src/phase_3_durability.rs +12 -3
- package/dist/create/server-source/crates/feltdb/src/phase_4_baseline.rs +41 -11
- package/dist/create/server-source/crates/feltdb/src/phase_5_soak.rs +56 -25
- package/dist/create/server-source/crates/feltdb/src/policy_evaluation.rs +701 -245
- package/dist/create/server-source/crates/feltdb/src/production_api.rs +31 -13
- package/dist/create/server-source/crates/feltdb/src/query_performance.rs +6 -8
- package/dist/create/server-source/crates/feltdb/src/replay_fuzzing.rs +5 -5
- package/dist/create/server-source/crates/feltdb/src/replica_acknowledgements.rs +48 -18
- package/dist/create/server-source/crates/feltdb/src/replica_membership.rs +30 -11
- package/dist/create/server-source/crates/feltdb/src/replication_manager.rs +6 -3
- package/dist/create/server-source/crates/feltdb/src/replication_protocol.rs +4 -3
- package/dist/create/server-source/crates/feltdb/src/sharding.rs +36 -10
- package/dist/create/server-source/crates/feltdb/src/state_conflict_contract.rs +516 -0
- package/dist/create/server-source/crates/feltdb/src/state_contract.rs +13 -4
- package/dist/create/server-source/crates/feltdb/src/state_diff_contract.rs +222 -0
- package/dist/create/server-source/crates/feltdb/src/state_facade.rs +82 -54
- package/dist/create/server-source/crates/feltdb/src/state_hash.rs +2 -2
- package/dist/create/server-source/crates/feltdb/src/state_model.rs +1565 -536
- package/dist/create/server-source/crates/feltdb/src/state_transition_store.rs +6 -3
- package/dist/create/server-source/crates/feltdb/src/state_trigger.rs +672 -0
- package/dist/create/server-source/crates/feltdb/src/storage.rs +9 -3
- package/dist/create/server-source/crates/feltdb/src/submission.rs +5 -11
- package/dist/create/server-source/crates/feltdb/src/tcp_transport.rs +6 -8
- package/dist/create/server-source/crates/feltdb/src/transaction_api.rs +24 -35
- package/dist/create/server-source/crates/feltdb/src/transaction_invariants.rs +24 -8
- package/dist/create/server-source/crates/feltdb/src/transaction_preconditions.rs +248 -59
- package/dist/create/server-source/crates/feltdb/src/transactions.rs +17 -20
- package/dist/create/server-source/crates/feltdb/src/trigger_contract.rs +749 -0
- package/dist/create/server-source/crates/feltdb/src/worker_mesh.rs +1 -0
- package/dist/create/server-source/crates/feltdb/src/workload.rs +512 -4
- package/dist/create/server-source/crates/feltdb/src/workload_diagnostics.rs +3 -4
- package/dist/create/server-source/crates/feltdb/tests/bounded_read_contract.rs +132 -0
- package/dist/create/server-source/crates/feltdb/tests/branching_evidence.rs +299 -0
- package/dist/create/server-source/crates/feltdb/tests/compaction_stall_contract.rs +272 -0
- package/dist/create/server-source/crates/feltdb/tests/crash_durability_contract.rs +467 -0
- package/dist/create/server-source/crates/feltdb/tests/current_revision_authority_evidence.rs +309 -0
- package/dist/create/server-source/crates/feltdb/tests/durable_backup_contract.rs +445 -0
- package/dist/create/server-source/crates/feltdb/tests/durable_corruption_contract.rs +518 -0
- package/dist/create/server-source/crates/feltdb/tests/durable_format_compatibility.rs +392 -0
- package/dist/create/server-source/crates/feltdb/tests/feltdb_state_boundary_tests.rs +436 -220
- package/dist/create/server-source/crates/feltdb/tests/fixtures/state_conflict_contract_corpus.json +1916 -0
- package/dist/create/server-source/crates/feltdb/tests/fixtures/state_diff_contract_corpus.json +1878 -0
- package/dist/create/server-source/crates/feltdb/tests/fixtures/trigger_contract_corpus.json +1862 -0
- package/dist/create/server-source/crates/feltdb/tests/operational_health_contract.rs +278 -0
- package/dist/create/server-source/crates/feltdb/tests/pr34_query_collection.rs +2 -1
- package/dist/create/server-source/crates/feltdb/tests/pr35_equality_index.rs +80 -25
- package/dist/create/server-source/crates/feltdb/tests/pr7_self_authorization_proof.rs +5 -8
- package/dist/create/server-source/crates/feltdb/tests/pr8_vocabulary_assessment.rs +52 -44
- package/dist/create/server-source/crates/feltdb/tests/pr9_phase2_boundary_tests.rs +33 -16
- package/dist/create/server-source/crates/feltdb/tests/pr9_phase3a_path_a_tests.rs +22 -7
- package/dist/create/server-source/crates/feltdb/tests/pr9_phase3c_authorized_mutations.rs +41 -22
- package/dist/create/server-source/crates/feltdb/tests/pr9_phase3c_role_based_authorization.rs +25 -8
- package/dist/create/server-source/crates/feltdb/tests/pr9_phase3c_simple_auth_delete.rs +9 -6
- package/dist/create/server-source/crates/feltdb/tests/pr9_phase3c_team_delete_role_authorization.rs +120 -69
- package/dist/create/server-source/crates/feltdb/tests/pr9_teams_role_based_access.rs +21 -10
- package/dist/create/server-source/crates/feltdb/tests/production_readiness_contract.rs +1365 -0
- package/dist/create/server-source/crates/feltdb/tests/reconciliation_application.rs +868 -0
- package/dist/create/server-source/crates/feltdb/tests/reconciliation_wire_format_evidence.rs +221 -0
- package/dist/create/server-source/crates/feltdb/tests/replicated_history_contract.rs +417 -0
- package/dist/create/server-source/crates/feltdb/tests/resource_scoped_revisions.rs +338 -0
- package/dist/create/server-source/crates/feltdb/tests/revision_identity_contract.rs +1039 -0
- package/dist/create/server-source/crates/feltdb/tests/revision_model_decision.rs +739 -0
- package/dist/create/server-source/crates/feltdb/tests/revision_retention_boundary_evidence.rs +427 -0
- package/dist/create/server-source/crates/feltdb/tests/saas_authorization_integration.rs +3 -3
- package/dist/create/server-source/crates/feltdb/tests/saas_invitation_lifecycle.rs +25 -22
- package/dist/create/server-source/crates/feltdb/tests/state_conflict_contract_conformance.rs +1799 -0
- package/dist/create/server-source/crates/feltdb/tests/state_diff_contract_conformance.rs +1316 -0
- package/dist/create/server-source/crates/feltdb/tests/state_model_integration.rs +53 -61
- package/dist/create/server-source/crates/feltdb/tests/state_persistence_integration.rs +156 -61
- package/dist/create/server-source/crates/feltdb/tests/state_store_boundary_evidence.rs +299 -0
- package/dist/create/server-source/crates/feltdb/tests/sync_divergence_evidence.rs +255 -0
- package/dist/create/server-source/crates/feltdb/tests/three_way_input_boundary_evidence.rs +249 -0
- package/dist/create/server-source/crates/feltdb/tests/trigger_contract_conformance.rs +994 -0
- package/dist/create/server-source/crates/feltdb/tests/workload_envelope_contract.rs +442 -0
- package/dist/create/server-source/crates/feltdb-server/src/app_state.rs +16 -1
- package/dist/create/server-source/crates/feltdb-server/src/auth.rs +164 -13
- package/dist/create/server-source/crates/feltdb-server/src/main.rs +695 -47
- package/dist/create/server-source/crates/feltdb-server/src/metrics.rs +21 -0
- package/dist/studio-app/assets/{feltdb_wasm-CVQWgXO-.js → feltdb_wasm-C1VhI-U5.js} +1 -1
- package/dist/studio-app/assets/feltdb_wasm_bg-C8HXbAXb.wasm +0 -0
- package/dist/studio-app/assets/{index-DwgNAIIX.js → index-Bbos1m2U.js} +1 -1
- package/dist/studio-app/index.html +1 -1
- package/dist/wasm/feltdb_wasm_bg.wasm +0 -0
- package/dist/workload.d.ts +2 -1
- package/dist/workload.d.ts.map +1 -1
- package/package.json +1 -1
- package/dist/studio-app/assets/feltdb_wasm_bg-CNVpvaZV.wasm +0 -0
|
@@ -24,7 +24,9 @@ mod tests {
|
|
|
24
24
|
};
|
|
25
25
|
use crate::metrics::ClusterMetrics;
|
|
26
26
|
use crate::state_hash::StateHash;
|
|
27
|
-
use crate::transactions::{
|
|
27
|
+
use crate::transactions::{
|
|
28
|
+
ConsistencyContract, Operation, OperationCommand, OperationId, StateVersion,
|
|
29
|
+
};
|
|
28
30
|
use serde_json::json;
|
|
29
31
|
use std::collections::HashMap;
|
|
30
32
|
use std::sync::Arc;
|
|
@@ -241,14 +243,24 @@ mod tests {
|
|
|
241
243
|
let mut report = String::new();
|
|
242
244
|
report.push_str("=== Baseline Workload Report ===\n\n");
|
|
243
245
|
report.push_str(&format!("Uptime: {} seconds\n", snapshot.uptime_secs));
|
|
244
|
-
report.push_str(&format!(
|
|
246
|
+
report.push_str(&format!(
|
|
247
|
+
"Total Operations: {}\n",
|
|
248
|
+
snapshot.total_operations_applied
|
|
249
|
+
));
|
|
245
250
|
report.push_str(&format!("Total Crashes: {}\n", snapshot.total_crashes));
|
|
246
|
-
report.push_str(&format!(
|
|
247
|
-
|
|
251
|
+
report.push_str(&format!(
|
|
252
|
+
"Divergence Events: {}\n",
|
|
253
|
+
snapshot.divergence_events
|
|
254
|
+
));
|
|
255
|
+
report.push_str(&format!(
|
|
256
|
+
"Data Loss Events: {}\n",
|
|
257
|
+
snapshot.data_loss_events
|
|
258
|
+
));
|
|
248
259
|
report.push_str("\nNode Metrics:\n");
|
|
249
260
|
|
|
250
261
|
for node in &snapshot.node_snapshots {
|
|
251
|
-
report.push_str(&format!(
|
|
262
|
+
report.push_str(&format!(
|
|
263
|
+
" {}: {} ops applied, {} acked, {} committed\n",
|
|
252
264
|
node.node_id,
|
|
253
265
|
node.operations_applied,
|
|
254
266
|
node.operations_acknowledged,
|
|
@@ -280,7 +292,10 @@ mod tests {
|
|
|
280
292
|
println!("Baseline result: {:?}", result);
|
|
281
293
|
println!("{}", workload.export_baseline_report());
|
|
282
294
|
|
|
283
|
-
assert!(
|
|
295
|
+
assert!(
|
|
296
|
+
result.total_operations > 0,
|
|
297
|
+
"Should have processed operations"
|
|
298
|
+
);
|
|
284
299
|
assert!(result.all_converged, "All nodes should converge");
|
|
285
300
|
assert_eq!(result.divergences, 0, "Zero divergences during clean run");
|
|
286
301
|
|
|
@@ -295,7 +310,10 @@ mod tests {
|
|
|
295
310
|
|
|
296
311
|
println!("Medium baseline result: {:?}", result);
|
|
297
312
|
|
|
298
|
-
assert!(
|
|
313
|
+
assert!(
|
|
314
|
+
result.total_operations > 100,
|
|
315
|
+
"Should process 100+ operations"
|
|
316
|
+
);
|
|
299
317
|
assert!(result.all_converged, "All nodes should converge");
|
|
300
318
|
assert_eq!(result.divergences, 0, "Zero divergences");
|
|
301
319
|
|
|
@@ -311,7 +329,10 @@ mod tests {
|
|
|
311
329
|
assert!(workload.verify_convergence(), "Final convergence check");
|
|
312
330
|
assert_eq!(result.divergences, 0, "No divergences during baseline");
|
|
313
331
|
|
|
314
|
-
println!(
|
|
332
|
+
println!(
|
|
333
|
+
"✓ Convergence consistency verified over {} ops",
|
|
334
|
+
result.total_operations
|
|
335
|
+
);
|
|
315
336
|
}
|
|
316
337
|
|
|
317
338
|
// Test 4: High-throughput baseline
|
|
@@ -320,9 +341,15 @@ mod tests {
|
|
|
320
341
|
let workload = BaselineWorkload::new(2);
|
|
321
342
|
let result = workload.run_clean_workload(20, 50);
|
|
322
343
|
|
|
323
|
-
println!(
|
|
344
|
+
println!(
|
|
345
|
+
"High-throughput baseline: {} ops/sec",
|
|
346
|
+
result.throughput_ops_sec
|
|
347
|
+
);
|
|
324
348
|
|
|
325
|
-
assert!(
|
|
349
|
+
assert!(
|
|
350
|
+
result.throughput_ops_sec > 0,
|
|
351
|
+
"Should measure positive throughput"
|
|
352
|
+
);
|
|
326
353
|
assert_eq!(result.divergences, 0, "Zero divergences");
|
|
327
354
|
|
|
328
355
|
println!("✓ High-throughput: {} ops/sec", result.throughput_ops_sec);
|
|
@@ -339,7 +366,10 @@ mod tests {
|
|
|
339
366
|
let json = metrics.export_json();
|
|
340
367
|
|
|
341
368
|
assert!(csv.contains("leader"), "CSV should contain leader metrics");
|
|
342
|
-
assert!(
|
|
369
|
+
assert!(
|
|
370
|
+
json.contains("total_operations_applied"),
|
|
371
|
+
"JSON should contain operations"
|
|
372
|
+
);
|
|
343
373
|
|
|
344
374
|
println!("✓ Metrics export validated");
|
|
345
375
|
}
|
|
@@ -29,7 +29,9 @@ mod tests {
|
|
|
29
29
|
};
|
|
30
30
|
use crate::metrics::ClusterMetrics;
|
|
31
31
|
use crate::state_hash::StateHash;
|
|
32
|
-
use crate::transactions::{
|
|
32
|
+
use crate::transactions::{
|
|
33
|
+
ConsistencyContract, Operation, OperationCommand, OperationId, StateVersion,
|
|
34
|
+
};
|
|
33
35
|
use serde_json::json;
|
|
34
36
|
use std::collections::HashMap;
|
|
35
37
|
use std::sync::atomic::{AtomicBool, Ordering};
|
|
@@ -48,19 +50,19 @@ mod tests {
|
|
|
48
50
|
impl FailureInjectionConfig {
|
|
49
51
|
fn default() -> Self {
|
|
50
52
|
Self {
|
|
51
|
-
node_crash_interval_secs: 45,
|
|
52
|
-
partition_interval_secs: 180,
|
|
53
|
-
restart_interval_secs: 600,
|
|
54
|
-
compaction_interval_secs: 900,
|
|
53
|
+
node_crash_interval_secs: 45, // Every 45 seconds
|
|
54
|
+
partition_interval_secs: 180, // Every 3 minutes
|
|
55
|
+
restart_interval_secs: 600, // Every 10 minutes
|
|
56
|
+
compaction_interval_secs: 900, // Every 15 minutes
|
|
55
57
|
}
|
|
56
58
|
}
|
|
57
59
|
|
|
58
60
|
fn test_mode() -> Self {
|
|
59
61
|
Self {
|
|
60
|
-
node_crash_interval_secs: 5,
|
|
61
|
-
partition_interval_secs: 15,
|
|
62
|
-
restart_interval_secs: 30,
|
|
63
|
-
compaction_interval_secs: 60,
|
|
62
|
+
node_crash_interval_secs: 5, // Every 5 seconds (for testing)
|
|
63
|
+
partition_interval_secs: 15, // Every 15 seconds
|
|
64
|
+
restart_interval_secs: 30, // Every 30 seconds
|
|
65
|
+
compaction_interval_secs: 60, // Every 60 seconds
|
|
64
66
|
}
|
|
65
67
|
}
|
|
66
68
|
}
|
|
@@ -131,7 +133,9 @@ mod tests {
|
|
|
131
133
|
}
|
|
132
134
|
|
|
133
135
|
fn apply_replicated_operation(&self, message: ReplicationMessage) -> Result<(), String> {
|
|
134
|
-
if self.is_crashed.load(Ordering::Relaxed)
|
|
136
|
+
if self.is_crashed.load(Ordering::Relaxed)
|
|
137
|
+
|| self.is_partitioned.load(Ordering::Relaxed)
|
|
138
|
+
{
|
|
135
139
|
return Err("Node unavailable".to_string());
|
|
136
140
|
}
|
|
137
141
|
|
|
@@ -263,7 +267,9 @@ mod tests {
|
|
|
263
267
|
}
|
|
264
268
|
|
|
265
269
|
// Inject crashes periodically
|
|
266
|
-
if last_crash_time.elapsed().as_secs()
|
|
270
|
+
if last_crash_time.elapsed().as_secs()
|
|
271
|
+
>= self.failure_config.node_crash_interval_secs
|
|
272
|
+
{
|
|
267
273
|
if let Some(follower) = self.followers.first() {
|
|
268
274
|
follower.crash();
|
|
269
275
|
failures_injected += 1;
|
|
@@ -277,7 +283,9 @@ mod tests {
|
|
|
277
283
|
}
|
|
278
284
|
|
|
279
285
|
// Inject partitions periodically
|
|
280
|
-
if last_partition_time.elapsed().as_secs()
|
|
286
|
+
if last_partition_time.elapsed().as_secs()
|
|
287
|
+
>= self.failure_config.partition_interval_secs
|
|
288
|
+
{
|
|
281
289
|
if let Some(follower) = self.followers.get(1) {
|
|
282
290
|
follower.partition();
|
|
283
291
|
failures_injected += 1;
|
|
@@ -358,8 +366,10 @@ mod tests {
|
|
|
358
366
|
assert_eq!(result.divergences, 0, "Zero divergences under failures");
|
|
359
367
|
assert!(result.final_hash_match, "Final convergence achieved");
|
|
360
368
|
|
|
361
|
-
println!(
|
|
362
|
-
|
|
369
|
+
println!(
|
|
370
|
+
"✓ Short soak: {} ops, {} failures, {} divergences",
|
|
371
|
+
result.total_operations, result.failures_injected, result.divergences
|
|
372
|
+
);
|
|
363
373
|
}
|
|
364
374
|
|
|
365
375
|
// Test 2: Medium soak (60 seconds)
|
|
@@ -371,13 +381,21 @@ mod tests {
|
|
|
371
381
|
|
|
372
382
|
println!("Medium soak result: {:?}", result);
|
|
373
383
|
|
|
374
|
-
assert!(
|
|
375
|
-
|
|
384
|
+
assert!(
|
|
385
|
+
result.total_operations > 1000,
|
|
386
|
+
"Should process 1000+ operations"
|
|
387
|
+
);
|
|
388
|
+
assert!(
|
|
389
|
+
result.failures_injected > 5,
|
|
390
|
+
"Should inject multiple failures"
|
|
391
|
+
);
|
|
376
392
|
assert_eq!(result.divergences, 0, "Zero divergences");
|
|
377
393
|
assert!(result.all_stable, "System remains stable");
|
|
378
394
|
|
|
379
|
-
println!(
|
|
380
|
-
|
|
395
|
+
println!(
|
|
396
|
+
"✓ Medium soak: {} ops, {} failures injected",
|
|
397
|
+
result.total_operations, result.failures_injected
|
|
398
|
+
);
|
|
381
399
|
}
|
|
382
400
|
|
|
383
401
|
// Test 3: Verify recovery consistency
|
|
@@ -390,7 +408,10 @@ mod tests {
|
|
|
390
408
|
assert!(result.convergence_checks > 0, "Should check convergence");
|
|
391
409
|
assert_eq!(result.divergences, 0, "Recovery is consistent");
|
|
392
410
|
|
|
393
|
-
println!(
|
|
411
|
+
println!(
|
|
412
|
+
"✓ Recovery consistency over {} checks",
|
|
413
|
+
result.convergence_checks
|
|
414
|
+
);
|
|
394
415
|
}
|
|
395
416
|
|
|
396
417
|
// Test 4: Long soak with stable operation
|
|
@@ -402,13 +423,21 @@ mod tests {
|
|
|
402
423
|
|
|
403
424
|
println!("Long soak result: {:?}", result);
|
|
404
425
|
|
|
405
|
-
assert!(
|
|
406
|
-
|
|
426
|
+
assert!(
|
|
427
|
+
result.total_operations > 2000,
|
|
428
|
+
"Should process 2000+ operations"
|
|
429
|
+
);
|
|
430
|
+
assert!(
|
|
431
|
+
result.all_stable,
|
|
432
|
+
"System remains stable under sustained load"
|
|
433
|
+
);
|
|
407
434
|
assert_eq!(result.divergences, 0, "No divergences over extended period");
|
|
408
435
|
assert!(result.final_hash_match, "Final state converges");
|
|
409
436
|
|
|
410
|
-
println!(
|
|
411
|
-
|
|
437
|
+
println!(
|
|
438
|
+
"✓ Long soak: {} ops under {} failures",
|
|
439
|
+
result.total_operations, result.failures_injected
|
|
440
|
+
);
|
|
412
441
|
}
|
|
413
442
|
|
|
414
443
|
// Test 5: Metrics validation during soak
|
|
@@ -424,7 +453,9 @@ mod tests {
|
|
|
424
453
|
assert!(snapshot.divergence_events >= 0, "Metrics track divergences");
|
|
425
454
|
assert_eq!(snapshot.data_loss_events, 0, "No data loss detected");
|
|
426
455
|
|
|
427
|
-
println!(
|
|
428
|
-
|
|
456
|
+
println!(
|
|
457
|
+
"✓ Metrics: {} divergence events, {} data loss events",
|
|
458
|
+
snapshot.divergence_events, snapshot.data_loss_events
|
|
459
|
+
);
|
|
429
460
|
}
|
|
430
461
|
}
|