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::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::{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::{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::{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: crates/corba-cos-transactions/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::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: crates/corba-cos-transactions/src/two_phase.rs::{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: crates/corba-cos-transactions/src/transaction.rs::{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: crates/corba-cos-transactions/src/two_phase.rs::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: crates/corba-cos-transactions/src/recovery.rs::{durable_commit_logs_decision_then_completion, durable_rollback_decision_logged, recovery_completes_in_doubt_commit, recovery_completes_in_doubt_rollback, replay_completion_returns_logged_decision, replay_completion_presumed_abort_for_unknown, preparing_state_is_presumed_abort, single_resource_durable_one_phase}.

Status: partial — force-writing the decision, recovery and presumed-abort are built and checked against InMemoryLog; a log that survives a process crash is missing (A.2.1).

A.2.1 Persistent transaction and heuristic log

Spec: Non-goals — “Recoverable 2PC with a persistent log (recovery after a crash)”; Annex A — “Persistent heuristic logging is a non-goal”.

Repo: —

Tests: —

Status: open — TransactionLog has only the implementation InMemoryLog (crates/corba-cos-transactions/src/recovery.rs); after a crash the log is empty.

Non-goals of the spec

Non-goal — nested transactions

Spec: Non-goals — “Nested transactions with sub-coordinator federation — the PropagationContext carries parents, but the sub-transaction semantics (§OTS 10.4) are only structural in v1.0”.

Repo: —

Tests: —

Status: open — PropagationContext.parents is encoded and decoded (crates/corba-cos-transactions/src/propagation.rs); sub-coordinator, sub-transaction commit and rollback are missing.

Non-goal — coordinator/terminator call over GIOP

Spec: Non-goals — “Live coordinator/terminator object ref callback over GIOP (distributed 2PC over real IORs) — the *_ior fields are carried (nil for a flat tx)”.

Repo: —

Tests: —

Status: open — the *_ior fields are carried and are nil for a flat transaction; a remote participant cannot call coordinator and terminator over GIOP.


Audit status

9 done / 1 partial / 3 open / 0 blocked / 0 n/a (informative).

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

Open items: zerodds-corba-cos-transactions-1.0.open.en.md.

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::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::{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::{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::{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: crates/corba-cos-transactions/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::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: crates/corba-cos-transactions/src/two_phase.rs::{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: crates/corba-cos-transactions/src/transaction.rs::{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: crates/corba-cos-transactions/src/two_phase.rs::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: crates/corba-cos-transactions/src/recovery.rs::{durable_commit_logs_decision_then_completion, durable_rollback_decision_logged, recovery_completes_in_doubt_commit, recovery_completes_in_doubt_rollback, replay_completion_returns_logged_decision, replay_completion_presumed_abort_for_unknown, preparing_state_is_presumed_abort, single_resource_durable_one_phase}.

Status: partial — Force-Write der Entscheidung, Recovery und presumed-abort sind gebaut und gegen InMemoryLog geprüft; ein Log, das einen Prozessabsturz übersteht, fehlt (A.2.1).

A.2.1 Persistentes Transaktions- und Heuristik-Log

Spec: Nicht-Ziele — „Recoverable 2PC with a persistent log (recovery after a crash)“; Annex A — „Persistent heuristic logging is a non-goal“.

Repo: —

Tests: —

Status: open — TransactionLog hat nur die Implementierung InMemoryLog (crates/corba-cos-transactions/src/recovery.rs); nach einem Absturz ist das Log leer.

Nicht-Ziele der Spec

Nicht-Ziel — verschachtelte Transaktionen

Spec: Nicht-Ziele — „Nested transactions with sub-coordinator federation — the PropagationContext carries parents, but the sub-transaction semantics (§OTS 10.4) are only structural in v1.0“.

Repo: —

Tests: —

Status: open — PropagationContext.parents wird kodiert und dekodiert (crates/corba-cos-transactions/src/propagation.rs); Sub-Coordinator, Sub-Transaktions-Commit und -Rollback fehlen.

Nicht-Ziel — Coordinator/Terminator-Aufruf über GIOP

Spec: Nicht-Ziele — „Live coordinator/terminator object ref callback over GIOP (distributed 2PC over real IORs) — the *_ior fields are carried (nil for a flat tx)“.

Repo: —

Tests: —

Status: open — die *_ior-Felder werden übertragen und sind bei einer flachen Transaktion nil; ein entfernter Teilnehmer kann Coordinator und Terminator nicht über GIOP aufrufen.


Audit-Status

9 done / 1 partial / 3 open / 0 blocked / 0 n/a (informative).

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

Offene Punkte: zerodds-corba-cos-transactions-1.0.open.md.