From d9e0b6870201d9200b3c225903b43b850475600b Mon Sep 17 00:00:00 2001 From: eunhhu Date: Wed, 30 Sep 2026 03:32:07 +0100 Subject: Hold a window of each output's sends in its transport, not the outbox A link's ring and a wire's queue took every saved send of their output and kept it until delivered: with the receiver down they held the outbox a second time, 178 B and 313 B more a send (104). Each outlet now holds a window, --window bytes (4 MiB) and 65,536 sends past what its receiver has, at least one; the outbox keeps the rest. The owner remembers each outlet's place in the outbox and looks on from there after a save and after its transports deliver. Places move back by the sends that left the outbox since (PureApp.sends_gone), so a trim before a place skips nothing, and sends queued before are not looked at again however many wait. pure_app_sent reads a send by its place (the newest-first visit it replaces is gone); pure_link_held and pure_wire_held say what a transport holds. With the receiver down a node now grows by the outbox alone once the window is full: 219 and 218 B a send over the link and HTTP (399 and 534 B before). check.py server_windows keeps the receivers of a sender's two outputs, one linked and one over HTTP, down through 300 buys with a 2,000-byte window, then starts them: each applies all 300 once. Without the refill after deliveries the link stops at 117. --- serve/deliver.h | 3 +++ 1 file changed, 3 insertions(+) (limited to 'serve/deliver.h') diff --git a/serve/deliver.h b/serve/deliver.h index a7ccac3..244363a 100644 --- a/serve/deliver.h +++ b/serve/deliver.h @@ -37,6 +37,9 @@ bool pure_wire_queue(PureWire *, uint64_t seq, PureSpan payload); uint64_t pure_wire_queued(const PureWire *); /* The last number delivered; any thread. */ uint64_t pure_wire_delivered(PureWire *); +/* The bytes of the sends queued and not yet delivered (their JSON, and the + * payloads kept for answers); any thread. */ +size_t pure_wire_held(PureWire *); /* Deliver on a thread of the wire's own, calling notify after each delivery. */ bool pure_wire_start(PureWire *, void (*notify)(void *), void *context); /* Stop (a delivery under way is finished or abandoned) and free. */ -- cgit v1.2.3