aboutsummaryrefslogtreecommitdiffstats
path: root/serve/serve.c
diff options
context:
space:
mode:
authoreunhhu <[email protected]>2026-09-30 03:03:52 +0100
committereunhhu <[email protected]>2026-09-30 03:03:52 +0100
commitc9c0edf5a8fc9f79fff42064db09bc297e117a88 (patch)
treee8ca03f9f8af2c04726e78389559887b9d3cee4e /serve/serve.c
parentd1e8f38f100571d55aaa98527ae2873e6d247f80 (diff)
downloadpure-c9c0edf5a8fc9f79fff42064db09bc297e117a88.tar.gz
pure-c9c0edf5a8fc9f79fff42064db09bc297e117a88.zip
Let a receiver whose app is full keep what came, and say so
A link's delivery the app had no room for was handed over again at the next turn: a receiver over its memory budget would refuse the same records as fast as the owner could apply them. And its sender, seeing records received but not stored for a second, sent the whole window again every second. Now a host says a delivery found it full (PureLinkDone.full). The receiver keeps the records and hands them over again after a pause, 100 ms doubling to 500 ms, and meanwhile its STORED frames carry flag 2: the app is full and what came is kept. A sender hearing it starts its one-second wait for the save again, and sends none of it again. The spec (012) says both sides; the pause is a local choice that must stay under the sender's wait. pure_link_done takes the PureLinkDone itself. test-link's new case keeps the app full for 5 s: 12 hand-overs meanwhile, taken within 0.5 s of having room, and no record sent again (21,640 without the flag).
Diffstat (limited to 'serve/serve.c')
-rw-r--r--serve/serve.c3
1 files changed, 2 insertions, 1 deletions
diff --git a/serve/serve.c b/serve/serve.c
index 38111a3..95ac37f 100644
--- a/serve/serve.c
+++ b/serve/serve.c
@@ -1710,7 +1710,8 @@ static void hand_back(void *context, Applied *applied, size_t count) {
events = events || applied[i].waiter;
LinkJob *link = applied[i].link;
if (!link) continue; /* records a link delivered: stored now, or not */
- pure_link_done(link->listener, link->token, applied[i].heard, applied[i].status == PURE_OK, applied[i].gap);
+ pure_link_done(link->listener, (PureLinkDone){link->token, applied[i].heard, applied[i].status == PURE_OK,
+ applied[i].gap, false});
free(link->ingress);
free(link);
}