mirror of
https://github.com/pyMC-dev/pyMC_Repeater.git
synced 2026-10-31 04:01:59 +01:00
A bridge sends one logical packet through both radios, and the two do not fare alike: 500 kHz and 62.5 kHz are different channels with different neighbours and different contention. The packet row holds one set of LBT figures, from the primary egress, so the other radio's attempts and backoffs were dropped on the floor -- and an egress that failed was never stored at all, leaving the half of the story an operator most wants to see only in the log. A new packet_egress table keeps one row per physical send: packet id, timestamp, radio, whether it went out, and its LBT attempts, total backoff and channel-busy flag. Written only on a node with two or more radios; with one radio the packet row already says all of this, and nothing about single-radio behaviour changes. The rows are written on the storage writer thread beside the packet, addressed by the id the insert returns, and are kept off packet_record itself so they do not ride along on every websocket, Glass and MQTT publish. Retention ages them out on the packet cutoff, and purging packets takes them along. /lbt_diagnostics gains radios[]: the same summary and bucket shape per radio, read from the new table over a covering index, so one radio's contention is never read as the other's. The combined figures above it are unchanged and still count each packet once. Per-radio entries carry no rf block -- the RRD series behind it is node-wide, and hanging it off one radio would read as that radio's own RSSI and loss -- and no packet-type breakdown, which would cost a heap lookup per egress. The fan-out now reads a send's LBT metadata whether or not it succeeded. The single-egress path has always done so, and the figures on a failed send are exactly the ones that explain it -- as far as they reach us: a radio that raises instead of returning metadata (an SX1262 giving up on a busy channel) reports nothing to read, so that row records the failure with no attempts rather than inventing them. Redundancy copies are recorded too. A multi-ack burst is real airtime on both radios, and leaving it out would undercount exactly the traffic multi-ack adds to a channel already busy enough to need it. /db_stats lists packet_egress only once something has been written to it, so a single-radio node reports the tables it always reported and never pays for counting rows it does not have. The bucket and summary maths moved out of get_lbt_diagnostics into three module functions so the per-radio series is the same code as the combined one rather than a second copy of 150 lines. The combined answer is unchanged.