@feltdb/core 0.8.3 → 0.8.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli/commands.js +4 -1
- package/dist/cli/provisioning-neutrality.js +79 -0
- package/dist/collection.d.ts +43 -1
- package/dist/collection.d.ts.map +1 -1
- package/dist/collection.js +192 -22
- package/dist/create/create.js +25 -21
- package/dist/create/managed-account.js +11 -0
- 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/equality_index.rs +595 -0
- 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 +1050 -117
- 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_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 +90 -72
- 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_execution_diagnostics.rs +126 -0
- 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 +305 -6
- 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 +1514 -537
- 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/submission.rs +5 -11
- package/dist/create/server-source/crates/feltdb/src/sync.rs +12 -0
- 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 +442 -0
- package/dist/create/server-source/crates/feltdb/tests/branching_evidence.rs +299 -0
- package/dist/create/server-source/crates/feltdb/tests/current_revision_authority_evidence.rs +288 -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/pr34_query_collection.rs +234 -0
- package/dist/create/server-source/crates/feltdb/tests/pr35_equality_index.rs +947 -0
- 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 +1032 -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/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-server/src/app_state.rs +2 -1
- package/dist/create/server-source/crates/feltdb-server/src/audit.rs +1137 -29
- package/dist/create/server-source/crates/feltdb-server/src/auth.rs +164 -13
- package/dist/create/server-source/crates/feltdb-server/src/main.rs +800 -34
- package/dist/db.d.ts +33 -34
- package/dist/db.d.ts.map +1 -1
- package/dist/db.js +74 -20
- package/dist/deployment.d.ts +30 -0
- package/dist/deployment.d.ts.map +1 -0
- package/dist/deployment.js +130 -0
- package/dist/embedded-transaction.d.ts +22 -4
- package/dist/embedded-transaction.d.ts.map +1 -1
- package/dist/embedded-transaction.js +51 -5
- package/dist/feltdb.d.ts +14 -2
- package/dist/feltdb.d.ts.map +1 -1
- package/dist/file-db.js +1 -1
- package/dist/http-client.d.ts +14 -0
- package/dist/http-client.d.ts.map +1 -1
- package/dist/http-client.js +23 -5
- package/dist/http-db.d.ts +119 -1
- package/dist/http-db.d.ts.map +1 -1
- package/dist/http-db.js +346 -31
- package/dist/index-core.d.ts +2 -0
- package/dist/index-core.d.ts.map +1 -1
- package/dist/index-core.js +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -0
- package/dist/indexeddb-db.d.ts.map +1 -1
- package/dist/indexeddb-db.js +35 -21
- package/dist/managed-recovery.d.ts +192 -0
- package/dist/managed-recovery.d.ts.map +1 -0
- package/dist/managed-recovery.js +242 -0
- package/dist/memory-db.js +1 -1
- package/dist/studio-app/assets/{feltdb_wasm-DB8cX151.js → feltdb_wasm-DaNwCLRX.js} +1 -1
- package/dist/studio-app/assets/feltdb_wasm_bg-DnsHNv6g.wasm +0 -0
- package/dist/studio-app/assets/index-j8IlhNqJ.js +29 -0
- package/dist/studio-app/index.html +1 -1
- package/dist/transaction.d.ts +30 -0
- package/dist/transaction.d.ts.map +1 -1
- package/dist/transaction.js +41 -0
- 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-ClhDHp0S.wasm +0 -0
- package/dist/studio-app/assets/index-B0k4UAlI.js +0 -29
|
@@ -2,7 +2,6 @@
|
|
|
2
2
|
///
|
|
3
3
|
/// This module provides tools to understand how collection cardinality is reconstructed
|
|
4
4
|
/// during startup and how it compares to query-time lookups.
|
|
5
|
-
|
|
6
5
|
use crate::{AtomicMutation, FeltDb};
|
|
7
6
|
use std::collections::HashMap;
|
|
8
7
|
|
|
@@ -61,9 +60,9 @@ pub fn diagnose_cardinality(
|
|
|
61
60
|
|
|
62
61
|
CardinalityDiagnostic {
|
|
63
62
|
collection: collection_name.to_string(),
|
|
64
|
-
persisted_capabilities: vec![],
|
|
63
|
+
persisted_capabilities: vec![], // Would need access to inner.rows to populate
|
|
65
64
|
persisted_row_counts: HashMap::new(),
|
|
66
|
-
total_persisted_rows: 0,
|
|
65
|
+
total_persisted_rows: 0, // Would need to scan inner.rows
|
|
67
66
|
maintained_count,
|
|
68
67
|
query_capability,
|
|
69
68
|
match_status: if maintained_count == 0 {
|
|
@@ -71,7 +70,7 @@ pub fn diagnose_cardinality(
|
|
|
71
70
|
} else {
|
|
72
71
|
"OK".to_string()
|
|
73
72
|
},
|
|
74
|
-
delta: 0,
|
|
73
|
+
delta: 0, // Can't compute without authoritative row count
|
|
75
74
|
}
|
|
76
75
|
}
|
|
77
76
|
|
|
@@ -125,7 +124,8 @@ mod tests {
|
|
|
125
124
|
},
|
|
126
125
|
];
|
|
127
126
|
|
|
128
|
-
db.apply_atomic_transaction("txn-1", None, &[], &mutations, None)
|
|
127
|
+
db.apply_atomic_transaction("txn-1", None, &[], &mutations, None)
|
|
128
|
+
.unwrap();
|
|
129
129
|
|
|
130
130
|
// At this point, cardinality should be 2 for the key "github_webhook_deliveries"
|
|
131
131
|
let count = db.collection_cardinality(capability).unwrap();
|
|
@@ -140,14 +140,13 @@ mod tests {
|
|
|
140
140
|
|
|
141
141
|
// But if query looks for a DIFFERENT capability:
|
|
142
142
|
let namespaced_capability = "default:github_webhook_deliveries";
|
|
143
|
-
let count_namespaced = reopened
|
|
143
|
+
let count_namespaced = reopened
|
|
144
|
+
.collection_cardinality(namespaced_capability)
|
|
145
|
+
.unwrap();
|
|
144
146
|
|
|
145
147
|
// If the persisted rows were stored under the non-namespaced key,
|
|
146
148
|
// this will return 0 - demonstrating the mismatch
|
|
147
|
-
println!(
|
|
148
|
-
"Rows under '{}': {}",
|
|
149
|
-
capability, count_after
|
|
150
|
-
);
|
|
149
|
+
println!("Rows under '{}': {}", capability, count_after);
|
|
151
150
|
println!(
|
|
152
151
|
"Rows under '{}': {}",
|
|
153
152
|
namespaced_capability, count_namespaced
|
|
@@ -218,12 +217,15 @@ mod tests {
|
|
|
218
217
|
.unwrap();
|
|
219
218
|
|
|
220
219
|
// Before restart, both formats should be queryable
|
|
221
|
-
assert_eq!(
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
220
|
+
assert_eq!(
|
|
221
|
+
db.collection_cardinality(&old_format_capability).unwrap(),
|
|
222
|
+
2
|
|
223
|
+
);
|
|
224
|
+
assert_eq!(
|
|
225
|
+
db.collection_cardinality(&new_format_capability).unwrap(),
|
|
226
|
+
2
|
|
226
227
|
);
|
|
228
|
+
println!("Before restart: old_format={}, new_format={}", 2, 2);
|
|
227
229
|
}
|
|
228
230
|
|
|
229
231
|
// After restart, cardinality is recomputed from persisted log
|
|
@@ -162,11 +162,13 @@ mod tests {
|
|
|
162
162
|
let probe = envelope_at("A", 2, "r2");
|
|
163
163
|
let probe_bytes = serde_json::to_string(&probe).expect("serialize").len();
|
|
164
164
|
|
|
165
|
-
let (mut executor, _dir) =
|
|
166
|
-
receiver(CausalCapacity::new(usize::MAX, probe_bytes * 2 - 1));
|
|
165
|
+
let (mut executor, _dir) = receiver(CausalCapacity::new(usize::MAX, probe_bytes * 2 - 1));
|
|
167
166
|
let outcomes = fill_with_blocked(&mut executor, "A", 3);
|
|
168
167
|
|
|
169
|
-
assert!(matches!(
|
|
168
|
+
assert!(matches!(
|
|
169
|
+
outcomes[0],
|
|
170
|
+
ReceiveOutcome::PendingDependencies { .. }
|
|
171
|
+
));
|
|
170
172
|
assert!(
|
|
171
173
|
matches!(outcomes[1], ReceiveOutcome::CapacityDeferred { .. }),
|
|
172
174
|
"the second envelope breaches a bound one byte short of two, got {:?}",
|
|
@@ -185,7 +187,10 @@ mod tests {
|
|
|
185
187
|
let large = envelope_at("A", 3, &"L".repeat(4096));
|
|
186
188
|
let small_bytes = serde_json::to_string(&small).expect("serialize").len();
|
|
187
189
|
let large_bytes = serde_json::to_string(&large).expect("serialize").len();
|
|
188
|
-
assert!(
|
|
190
|
+
assert!(
|
|
191
|
+
large_bytes > small_bytes * 2,
|
|
192
|
+
"the fixture must actually differ in size"
|
|
193
|
+
);
|
|
189
194
|
|
|
190
195
|
let (mut executor, _dir) = receiver(CausalCapacity::new(usize::MAX, small_bytes + 16));
|
|
191
196
|
|
|
@@ -240,7 +245,11 @@ mod tests {
|
|
|
240
245
|
.expect("submit");
|
|
241
246
|
|
|
242
247
|
match outcome {
|
|
243
|
-
SubmitOutcome::CapacityExceeded {
|
|
248
|
+
SubmitOutcome::CapacityExceeded {
|
|
249
|
+
limit_entries,
|
|
250
|
+
pending_entries,
|
|
251
|
+
..
|
|
252
|
+
} => {
|
|
244
253
|
assert_eq!(limit_entries, 4);
|
|
245
254
|
assert_eq!(pending_entries, 4);
|
|
246
255
|
}
|
|
@@ -271,7 +280,10 @@ mod tests {
|
|
|
271
280
|
let (mut executor, _dir) = receiver(CausalCapacity::new(2, usize::MAX));
|
|
272
281
|
|
|
273
282
|
let outcomes = fill_with_blocked(&mut executor, "A", 3);
|
|
274
|
-
assert!(matches!(
|
|
283
|
+
assert!(matches!(
|
|
284
|
+
outcomes[2],
|
|
285
|
+
ReceiveOutcome::CapacityDeferred { .. }
|
|
286
|
+
));
|
|
275
287
|
assert_eq!(executor.deferred_causal_count(), 1);
|
|
276
288
|
|
|
277
289
|
// Deliver the missing dependency A:1, which releases the whole chain.
|
|
@@ -280,8 +292,16 @@ mod tests {
|
|
|
280
292
|
.expect("receive");
|
|
281
293
|
assert!(matches!(released, ReceiveOutcome::Applied { .. }));
|
|
282
294
|
|
|
283
|
-
assert_eq!(
|
|
284
|
-
|
|
295
|
+
assert_eq!(
|
|
296
|
+
executor.pending_causal_count(),
|
|
297
|
+
0,
|
|
298
|
+
"nothing is left waiting"
|
|
299
|
+
);
|
|
300
|
+
assert_eq!(
|
|
301
|
+
executor.deferred_causal_count(),
|
|
302
|
+
0,
|
|
303
|
+
"nothing is left deferred"
|
|
304
|
+
);
|
|
285
305
|
let applied = executor
|
|
286
306
|
.get_replica_state("receiver")
|
|
287
307
|
.map(|replica| replica.operations_applied)
|
|
@@ -300,7 +320,10 @@ mod tests {
|
|
|
300
320
|
.get_replica_state("receiver")
|
|
301
321
|
.map(|replica| replica.operations_applied)
|
|
302
322
|
.unwrap_or(0);
|
|
303
|
-
assert_eq!(
|
|
323
|
+
assert_eq!(
|
|
324
|
+
applied, 0,
|
|
325
|
+
"nothing may be applied while its dependency is missing"
|
|
326
|
+
);
|
|
304
327
|
assert_eq!(executor.causal_frontier().get("A"), 0);
|
|
305
328
|
}
|
|
306
329
|
|
|
@@ -327,13 +350,20 @@ mod tests {
|
|
|
327
350
|
// log a second time.
|
|
328
351
|
let (mut executor, _dir) = receiver(CausalCapacity::new(1, usize::MAX));
|
|
329
352
|
let outcomes = fill_with_blocked(&mut executor, "A", 2);
|
|
330
|
-
assert!(matches!(
|
|
353
|
+
assert!(matches!(
|
|
354
|
+
outcomes[1],
|
|
355
|
+
ReceiveOutcome::CapacityDeferred { .. }
|
|
356
|
+
));
|
|
331
357
|
|
|
332
358
|
let again = executor
|
|
333
359
|
.receive_replicated(message(envelope_at("A", 3, "r3")), zero_version())
|
|
334
360
|
.expect("receive");
|
|
335
361
|
assert_eq!(again, ReceiveOutcome::AlreadyKnown);
|
|
336
|
-
assert_eq!(
|
|
362
|
+
assert_eq!(
|
|
363
|
+
executor.deferred_causal_count(),
|
|
364
|
+
1,
|
|
365
|
+
"still one deferred entry"
|
|
366
|
+
);
|
|
337
367
|
}
|
|
338
368
|
|
|
339
369
|
#[test]
|
|
@@ -377,7 +407,10 @@ mod tests {
|
|
|
377
407
|
.expect("executor");
|
|
378
408
|
executor.set_causal_capacity(CausalCapacity::new(2, usize::MAX));
|
|
379
409
|
let outcomes = fill_with_blocked(&mut executor, "A", 3);
|
|
380
|
-
assert!(matches!(
|
|
410
|
+
assert!(matches!(
|
|
411
|
+
outcomes[2],
|
|
412
|
+
ReceiveOutcome::CapacityDeferred { .. }
|
|
413
|
+
));
|
|
381
414
|
assert_eq!(executor.pending_causal_count(), 2);
|
|
382
415
|
assert_eq!(executor.deferred_causal_count(), 1);
|
|
383
416
|
}
|
|
@@ -392,13 +425,20 @@ mod tests {
|
|
|
392
425
|
recovered.set_causal_capacity(CausalCapacity::new(2, usize::MAX));
|
|
393
426
|
let replayed = recovered.load_from_disk(log_path).expect("recover");
|
|
394
427
|
|
|
395
|
-
assert_eq!(
|
|
428
|
+
assert_eq!(
|
|
429
|
+
replayed, 3,
|
|
430
|
+
"all three envelopes were durable before the restart"
|
|
431
|
+
);
|
|
396
432
|
assert_eq!(
|
|
397
433
|
recovered.pending_causal_count(),
|
|
398
434
|
2,
|
|
399
435
|
"recovery honours the same bound the live path does"
|
|
400
436
|
);
|
|
401
|
-
assert_eq!(
|
|
437
|
+
assert_eq!(
|
|
438
|
+
recovered.deferred_causal_count(),
|
|
439
|
+
1,
|
|
440
|
+
"the excess is deferred, not lost"
|
|
441
|
+
);
|
|
402
442
|
|
|
403
443
|
// And the dependency still releases everything after the restart.
|
|
404
444
|
recovered
|
|
@@ -446,7 +486,11 @@ mod tests {
|
|
|
446
486
|
executor.causal_barrier.pending_keys()
|
|
447
487
|
};
|
|
448
488
|
|
|
449
|
-
assert_eq!(
|
|
489
|
+
assert_eq!(
|
|
490
|
+
split(3),
|
|
491
|
+
split(3),
|
|
492
|
+
"the same log and bound recover identically"
|
|
493
|
+
);
|
|
450
494
|
assert_eq!(split(3).len(), 3);
|
|
451
495
|
}
|
|
452
496
|
}
|