mirror of
https://github.com/element-hq/synapse.git
synced 2026-11-04 15:37:49 +00:00
The native driver's write path recorded no `sql_txn_count` or `sql_txn_duration`, nor the log context's transaction counts, so the `persist_events` panels read near zero at `rust_event_persistence: transaction` and `full`. `run_write_interaction` now times each interaction as `new_transaction` does: every attempt, from when it has its connection, so the wait for one is left out. The times go into a task-local list that `with_txn_timings` collects. The persister's entry points carry the list back on what they already return (`PersistEffects`, `PreparedChunk`, `PersistedBatch`, `CurrentStateUpdate`), and Python records it where `new_transaction` would: the two counters, the pool's perf counters and the current log context, which is the caller's when Python applies what Rust returned. That costs no GIL hop. When a persist fails, or Python gives up a batch, no result carries the times back, so the persister keeps them and `flush_rust_persist_metrics` counts them at the next scrape, without a log context. In shadow mode Python's own interactions are the ones used, so Rust's dry run is not recorded. The stream orderings' `nextval`, which runs outside a write interaction, is recorded as `_load_next_mult_id`, as Python's is. The `db.<desc>` tracing span is not recorded. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LXMkcZVkcZhi21augBff4a