Skip to content

v0.4.7 — reassembly is per node

Choose a tag to compare

@dasimon135 dasimon135 released this 24 Aug 21:13
· 16 commits to main since this release

Fixed

Two nodes sending long replies at the same time no longer cancel each other
out.

Reassembly of segmented messages was held in a single slot, shared by every node
on the network, and the identity it keyed on carried no source address. A segment
arriving from one node in the middle of another node's transfer did not
interleave — it reset. The first node's half-received message was discarded and
its acknowledgment timer cancelled with it, the node retransmitted into the same
race, and neither message was ever delivered. Nothing in any log said so.

This was there from the beginning, on the stated grounds that the stack only ever
talked to one node at a time. That stopped being true twice over: the proxy
address filter now lets status traffic from any node reach the integration, and
v0.4.6 started acknowledging segmented messages — which actively invites nodes to
send them.

Reassembly state and both timers are now kept per node. The table of tracked
nodes is bounded, evicting an idle one before one with a transfer in flight, and
a stranded transfer is dropped when its timer expires rather than left behind.

In practice this was not reachable from normal lamp control, which sends one
request at a time and whose replies fit in a single segment. It closes the gap
#9 opened rather than
fixing a symptom anyone was seeing — the transport is now correct without a
condition attached.