zerodds-corba-cos-transactions 1.0 — Spec Coverage

Source: docs/specs/zerodds-corba-cos-transactions-1.0.md (ZeroDDS vendor spec)

Implementation:

§1 otid_t — transaction identity

§1.1 Structure

Spec: §1.1 — otid_t { long formatID; long bequeath_length; sequence<octet> tid; }; Rust PSM Otid with new/null.

Repo: crates/corba-cos-transactions/src/otid.rs::Otid (new, null, is_null).

Tests: crates/corba-cos-transactions/src/otid.rs::tests::null_otid.

Status: done

§1.2 CDR encoding + byte conformance

Spec: §1.2 — encode/decode write formatID, bequeath_length, tid-len, tid; big-endian golden 00000007 00000003 00000003 aabbcc byte-identical to JacORB otid_tHelper.

Repo: crates/corba-cos-transactions/src/otid.rs::Otid::encode / decode.

Tests: crates/corba-cos-transactions/src/otid.rs::tests::roundtrip_be_le, byte_exact_golden_be.

Status: done

§2 PropagationContext

§2.1 ServiceContext (id = 0)

Spec: §2.1 — PropagationContext as a CDR encapsulation in the TransactionService ServiceContext (id = 0).

Repo: crates/corba-cos-transactions/src/propagation.rs::PropagationContext, TRANSACTION_SERVICE_CONTEXT_ID, to_service_context_data / from_service_context_data.

Tests: crates/corba-cos-transactions/src/propagation.rs::tests::service_context_id_is_zero, flat_context_service_context_roundtrip.

Status: done

§2.2 Object-reference encoding + byte conformance

Spec: §2.2 — coord/term as object references (nil = type_id “” + 0 profiles); implementation_specific_data = tk_null (1 word); 52-byte golden byte-identical to JacORB PropagationContextHelper.

Repo: crates/corba-cos-transactions/src/propagation.rs (write_object_ref / read_object_ref, TransIdentity).

Tests: crates/corba-cos-transactions/src/propagation.rs::tests::propagation_context_byte_identical_to_jacorb, trans_identity_nil_refs_roundtrip, nested_context_with_parents.

Status: done

§2.3 API

Spec: §2.3 — flat(timeout, otid) + encapsulation serialization.

Repo: crates/corba-cos-transactions/src/propagation.rs::PropagationContext::flat.

Tests: tests/ots_distributed.rs::transaction_context_propagates_over_wire.

Status: done

§3 2-phase commit

§3.1 Resource + Vote

Spec: §3.1 — Resource trait (prepare/commit/rollback/commit_one_phase/forget) + Vote (Commit/Rollback/ReadOnly).

Repo: crates/corba-cos-transactions/src/two_phase.rs::Resource, Vote, HeuristicOutcome.

Tests: crates/corba-cos-transactions/src/two_phase.rs::tests::all_commit_commits_everyone.

Status: done

§3.2 Coordinator algorithm

Spec: §3.2 — empty set → Committed; one resource → one-phase; otherwise prepare phase, then commit/rollback per votes; read-only drops out in phase 2.

Repo: crates/corba-cos-transactions/src/two_phase.rs::coordinate_commit + coordinate_rollback.

Tests: two_phase.rs::tests: one_rollback_vote_rolls_back_prepared, read_only_skips_phase_two, single_resource_uses_one_phase, single_resource_one_phase_rollback, empty_set_commits_trivially, heuristic_commit_failure_reports_mixed.

Status: done

§3.3 Orchestration

Spec: §3.3 — Current (begin/commit/rollback, fresh otid), rollback_only → subsequent commit yields RolledBack; register_resource only in Active status.

Repo: crates/corba-cos-transactions/src/transaction.rs::Current, Coordinator, Terminator, Control, Status.

Tests: transaction.rs::tests: current_begin_commit_two_resources, rollback_only_forces_rollback_on_commit, explicit_rollback, commit_without_transaction_errors, double_begin_rejected, suspend_resume_keeps_resources, propagation_context_carries_otid.

Status: done

Annex A — heuristics

A.1 Heuristic outcome

Spec: Annex A — HeuristicOutcome (Mixed/Rollback/Commit/Hazard); a deviation → the coordinator reports HeuristicMixed, the resource may forget.

Repo: crates/corba-cos-transactions/src/two_phase.rs::HeuristicOutcome + the two_phase path.

Tests: two_phase.rs::tests::heuristic_commit_failure_reports_mixed.

Status: done

A.2 Durability — transaction log + RecoveryCoordinator (§10.3.7)

Spec: §10.3.7 RecoveryCoordinator — crash-recoverable 2PC: the commit decision is force-written before phase 2; a restart resolves in-doubt transactions (presumed-abort).

Repo: crates/corba-cos-transactions/src/recovery.rs: TransactionLog trait + InMemoryLog; coordinate_commit_durable (force-write Decided before phase 2); RecoveryCoordinator (recover/replay_completion with presumed-abort) + ResourceResolver.

Tests: recovery.rs::tests (8): durable_commit_logs_decision_then_completion, recovery_completes_in_doubt_commit/_rollback, replay_completion_returns_logged_decision, replay_completion_presumed_abort_for_unknown, preparing_state_is_presumed_abort, single_resource_durable_one_phase, durable_rollback_decision_logged.

Status: done


Audit status

10 done / 0 partial / 0 open / 0 n/a (informative) / 0 n/a (rejected).

Test run: cargo test -p zerodds-corba-cos-transactions — 30 unit + 3 e2e green, 0 failed.

zerodds-corba-cos-transactions 1.0 — Spec-Coverage

Quelle: docs/specs/zerodds-corba-cos-transactions-1.0.md (ZeroDDS Vendor-Spec)

Implementation:

§1 otid_t — Transaktions-Identität

§1.1 Struktur

Spec: §1.1 — otid_t { long formatID; long bequeath_length; sequence<octet> tid; }; Rust-PSM Otid mit new/null.

Repo: crates/corba-cos-transactions/src/otid.rs::Otid (new, null, is_null).

Tests: crates/corba-cos-transactions/src/otid.rs::tests::null_otid.

Status: done

§1.2 CDR-Encoding + Byte-Konformität

Spec: §1.2 — encode/decode schreiben formatID, bequeath_length, tid-len, tid; Big-Endian-Golden 00000007 00000003 00000003 aabbcc byte-identisch zu JacORB otid_tHelper.

Repo: crates/corba-cos-transactions/src/otid.rs::Otid::encode / decode.

Tests: crates/corba-cos-transactions/src/otid.rs::tests::roundtrip_be_le, byte_exact_golden_be.

Status: done

§2 PropagationContext

§2.1 ServiceContext (id = 0)

Spec: §2.1 — PropagationContext als CDR-Encapsulation im TransactionService-ServiceContext (id = 0).

Repo: crates/corba-cos-transactions/src/propagation.rs::PropagationContext, TRANSACTION_SERVICE_CONTEXT_ID, to_service_context_data / from_service_context_data.

Tests: crates/corba-cos-transactions/src/propagation.rs::tests::service_context_id_is_zero, flat_context_service_context_roundtrip.

Status: done

§2.2 Object-Reference-Encoding + Byte-Konformität

Spec: §2.2 — coord/term als Object-References (nil = type_id “” + 0 Profile); implementation_specific_data = tk_null (1 Wort); 52-Byte-Golden byte-identisch zu JacORB PropagationContextHelper.

Repo: crates/corba-cos-transactions/src/propagation.rs (write_object_ref / read_object_ref, TransIdentity).

Tests: crates/corba-cos-transactions/src/propagation.rs::tests::propagation_context_byte_identical_to_jacorb, trans_identity_nil_refs_roundtrip, nested_context_with_parents.

Status: done

§2.3 API

Spec: §2.3 — flat(timeout, otid) + Encapsulation-Serialisierung.

Repo: crates/corba-cos-transactions/src/propagation.rs::PropagationContext::flat.

Tests: tests/ots_distributed.rs::transaction_context_propagates_over_wire.

Status: done

§3 2-Phase-Commit

§3.1 Resource + Vote

Spec: §3.1 — Resource-Trait (prepare/commit/rollback/commit_one_phase/forget) + Vote (Commit/Rollback/ReadOnly).

Repo: crates/corba-cos-transactions/src/two_phase.rs::Resource, Vote, HeuristicOutcome.

Tests: crates/corba-cos-transactions/src/two_phase.rs::tests::all_commit_commits_everyone.

Status: done

§3.2 Coordinator-Algorithmus

Spec: §3.2 — leere Menge → Committed; eine Resource → One-Phase; sonst Prepare-Phase, dann Commit/Rollback je Votes; Read-Only entfällt in Phase 2.

Repo: crates/corba-cos-transactions/src/two_phase.rs::coordinate_commit + coordinate_rollback.

Tests: two_phase.rs::tests: one_rollback_vote_rolls_back_prepared, read_only_skips_phase_two, single_resource_uses_one_phase, single_resource_one_phase_rollback, empty_set_commits_trivially, heuristic_commit_failure_reports_mixed.

Status: done

§3.3 Orchestrierung

Spec: §3.3 — Current (begin/commit/rollback, frische otid), rollback_only → folgendes commit liefert RolledBack; register_resource nur im Active-Status.

Repo: crates/corba-cos-transactions/src/transaction.rs::Current, Coordinator, Terminator, Control, Status.

Tests: transaction.rs::tests: current_begin_commit_two_resources, rollback_only_forces_rollback_on_commit, explicit_rollback, commit_without_transaction_errors, double_begin_rejected, suspend_resume_keeps_resources, propagation_context_carries_otid.

Status: done

Annex A — Heuristik

A.1 Heuristic-Outcome

Spec: Annex A — HeuristicOutcome (Mixed/Rollback/Commit/Hazard); Abweichung → Coordinator meldet HeuristicMixed, Resource darf forget.

Repo: crates/corba-cos-transactions/src/two_phase.rs::HeuristicOutcome + two_phase-Pfad.

Tests: two_phase.rs::tests::heuristic_commit_failure_reports_mixed.

Status: done

A.2 Durability — Transaction-Log + RecoveryCoordinator (§10.3.7)

Spec: §10.3.7 RecoveryCoordinator — crash-recoverable 2PC: die Commit-Entscheidung wird vor Phase 2 force-geschrieben; ein Neustart löst in-doubt-Transaktionen auf (presumed-abort).

Repo: crates/corba-cos-transactions/src/recovery.rs: TransactionLog-Trait + InMemoryLog; coordinate_commit_durable (force-write Decided vor Phase 2); RecoveryCoordinator (recover/replay_completion mit presumed-abort) + ResourceResolver.

Tests: recovery.rs::tests (8): durable_commit_logs_decision_then_completion, recovery_completes_in_doubt_commit/_rollback, replay_completion_returns_logged_decision, replay_completion_presumed_abort_for_unknown, preparing_state_is_presumed_abort, single_resource_durable_one_phase, durable_rollback_decision_logged.

Status: done


Audit-Status

10 done / 0 partial / 0 open / 0 n/a (informative) / 0 n/a (rejected).

Test-Lauf: cargo test -p zerodds-corba-cos-transactions — 30 Unit + 3 e2e grün, 0 failed.