Summary
I replaced this branch with a different change, because upstream moved underneath the old one. The old version improved the startup exception that named the first blocking journal. #993 (d365777) changed startup so that unsupported-protocol file-registration journals are parked as NeedsAttention rather than thrown on, so as far as I can tell that exception no longer carries the information I was trying to improve.
What I think is still missing after #993 is a record of which operation was parked. The Information summary carries only counts, and the state the mutation had reached is overwritten when the row is parked. This logs one Warning naming the operation id, the state it had reached and the reason, from the protocol pass and from TryMarkNeedsAttentionAsync (which the adoption, orphan and owned-row paths use). Each transition is logged by the call that made it, at most once per row.
Changes
Fixed
- The relational protocol pass parks each selected row with its own conditional update and logs only when that update affected the row, so a concurrent pass cannot cause a duplicate or misleading Warning.
- The in-memory branch logs from the tracked rows, capturing each row's state before it is overwritten.
- Template:
File-registration publication {OperationId} parked as NeedsAttention after reaching {ReachedState}: {Reason}.
What this does not cover
Live-path parking in FileMover and the rename reconciler's protocol pass are not touched; rename parity might be a reasonable follow-up. No new state, API or schema, and no repair mechanism. Owned rows that fail an import already surface their id via RepairRequired (a 409 on manual import; download imports reach the log through the global error handler); this adds the reason and reached state.
Testing
Upstream had no test of the unsupported-protocol registration path, so I think this adds the first one. It seeds protocol versions -1 and Current + 1 and asserts ev...
Automated Canary build