]> git.ipfire.org Git - thirdparty/FORT-validator.git/commitdiff
Cache the client request queue size
authorAlberto Leiva Popper <ydahhrk@gmail.com>
Tue, 7 Jul 2026 22:53:22 +0000 (16:53 -0600)
committerAlberto Leiva Popper <ydahhrk@gmail.com>
Tue, 7 Jul 2026 22:53:22 +0000 (16:53 -0600)
src/rtr/pdu_stream.c
src/rtr/pdu_stream.h
src/rtr/rtr.c
test/rtr/pdu_stream_test.c

index bb28cbc1c42dc025544906bfa7035341723b586c..71c46fd31481ad87ef3a4f0f5269bd7b109e5c53 100644 (file)
@@ -48,6 +48,7 @@ struct pdu_stream *pdustream_create(int fd, char const *addr)
 
        result->claimed = false;
        TAILQ_INIT(&result->requests);
+       result->reqcount = 0;
 
        result->eos = false;
 
@@ -443,30 +444,21 @@ create_request(struct pdu_stream *stream, struct pdu_header *hdr,
 static int
 queue_request(struct pdu_stream *stream, struct rtr_request *req)
 {
-       struct rtr_request *node;
-       unsigned int i;
-
        if (TAILQ_EMPTY(&stream->requests)) {
                TAILQ_INSERT_HEAD(&stream->requests, req, lh);
-               pr_op_debug("Queued first request: %s", stream->addr);
+               stream->reqcount++;
                return 0;
        }
 
-       i = 0;
-       TAILQ_FOREACH(node, &stream->requests, lh) {
-               if ((++i) >= 4)
-                       break;
-
-               if (TAILQ_NEXT(node, lh) == NULL) {
-                       TAILQ_INSERT_AFTER(&stream->requests, node, req, lh);
-                       pr_op_debug("Queued request: %s", stream->addr);
-                       return 0;
-               }
+       if (stream->reqcount >= 4) {
+               pr_op_err("%s: Too many simultaneous requests; Dropping RTR connection.",
+                   stream->addr);
+               return ENOSPC;
        }
 
-       pr_op_err("%s: Too many simultaneous requests; Dropping RTR connection.",
-           stream->addr);
-       return ENOSPC;
+       TAILQ_INSERT_TAIL(&stream->requests, req, lh);
+       stream->reqcount++;
+       return 0;
 }
 
 /*
index 313bd12979187de4413977fc1146063531ef2365..7bbdf13f1bc4bc2250f679952f8caaca24ea9279 100644 (file)
@@ -21,6 +21,7 @@ struct pdu_stream { /* It's an *input* stream. */
 
        bool claimed;
        TAILQ_HEAD(, rtr_request) requests; /* No more than 4 nodes */
+       unsigned int reqcount;
 
        bool eos; /* end of (input) stream */
 };
index 9b6e4e7978a93e6b6786fdae0401c4f698947022..d0e3b79998c7d628d253e1add182db96879e5f2e 100644 (file)
@@ -360,8 +360,10 @@ next_request(struct pdu_stream *client)
        struct rtr_request *req;
 
        req = TAILQ_FIRST(&client->requests);
-       if (req)
+       if (req) {
                TAILQ_REMOVE(&client->requests, req, lh);
+               client->reqcount--;
+       }
 
        return req;
 }
index 1821d4ad3032c1d9c0ed54f68fb826f48652bd25..a4b4682732070240b9393e0719c70881d81aeca6 100644 (file)
@@ -89,6 +89,7 @@ pop_request(struct pdu_stream *stream)
        request = TAILQ_FIRST(&stream->requests);
        ck_assert_ptr_ne(NULL, request);
        TAILQ_REMOVE(&stream->requests, request, lh);
+       stream->reqcount--;
 
        return request;
 }