]> git.ipfire.org Git - thirdparty/unbound.git/commitdiff
stream reuse, make reuse possible straight away after first query to address.
authorW.C.A. Wijngaards <wouter@nlnetlabs.nl>
Mon, 13 Jul 2020 14:11:52 +0000 (16:11 +0200)
committerW.C.A. Wijngaards <wouter@nlnetlabs.nl>
Mon, 13 Jul 2020 14:11:52 +0000 (16:11 +0200)
services/outside_network.c

index 5acf00b6a902cf52c6225a44307b362b6736ac63..425c0839ae4e26c8534125201ce96a3448f4aa22 100644 (file)
@@ -435,6 +435,35 @@ tree_by_id_get_id(rbnode_type* node)
        return w->id;
 }
 
+/** insert into reuse tcp tree and LRU, false on failure (duplicate) */
+static int
+reuse_tcp_insert(struct outside_network* outnet, struct pending_tcp* pend_tcp)
+{
+       log_reuse_tcp(5, "reuse_tcp_insert", &pend_tcp->reuse);
+       if(pend_tcp->reuse.item_on_lru_list)
+               return 1;
+       pend_tcp->reuse.node.key = &pend_tcp->reuse;
+       pend_tcp->reuse.pending = pend_tcp;
+       if(!rbtree_insert(&outnet->tcp_reuse, &pend_tcp->reuse.node)) {
+               /* this is a duplicate connection, close this one */
+               verbose(5, "reuse_tcp_insert: duplicate connection");
+               pend_tcp->reuse.node.key = NULL;
+               return 0;
+       }
+       /* insert into LRU, first is newest */
+       pend_tcp->reuse.lru_prev = NULL;
+       if(outnet->tcp_reuse_first) {
+               pend_tcp->reuse.lru_next = outnet->tcp_reuse_first;
+               outnet->tcp_reuse_first->lru_prev = &pend_tcp->reuse;
+       } else {
+               pend_tcp->reuse.lru_next = NULL;
+               outnet->tcp_reuse_last = &pend_tcp->reuse;
+       }
+       outnet->tcp_reuse_first = &pend_tcp->reuse;
+       pend_tcp->reuse.item_on_lru_list = 1;
+       return 1;
+}
+
 /** find reuse tcp stream to destination for query, or NULL if none */
 static struct reuse_tcp*
 reuse_tcp_find(struct outside_network* outnet, struct sockaddr_storage* addr,
@@ -643,6 +672,8 @@ outnet_tcp_take_into_use(struct waiting_tcp* w)
        pend->c->repinfo.addrlen = w->addrlen;
        memcpy(&pend->c->repinfo.addr, &w->addr, w->addrlen);
        pend->reuse.pending = pend;
+       /* insert in reuse by address tree if not already inserted there */
+       (void)reuse_tcp_insert(w->outnet, pend);
        reuse_tree_by_id_insert(&pend->reuse, w);
        outnet_tcp_take_query_setup(s, pend, w);
        return 1;
@@ -809,35 +840,6 @@ decommission_pending_tcp(struct outside_network* outnet,
        reuse_del_readwait(&pend->reuse.tree_by_id);
 }
 
-/** insert into reuse tcp tree and LRU, false on failure (duplicate) */
-static int
-reuse_tcp_insert(struct outside_network* outnet, struct pending_tcp* pend_tcp)
-{
-       log_reuse_tcp(5, "reuse_tcp_insert", &pend_tcp->reuse);
-       if(pend_tcp->reuse.item_on_lru_list)
-               return 1;
-       pend_tcp->reuse.node.key = &pend_tcp->reuse;
-       pend_tcp->reuse.pending = pend_tcp;
-       if(!rbtree_insert(&outnet->tcp_reuse, &pend_tcp->reuse.node)) {
-               /* this is a duplicate connection, close this one */
-               verbose(5, "reuse_tcp_insert: duplicate connection");
-               pend_tcp->reuse.node.key = NULL;
-               return 0;
-       }
-       /* insert into LRU, first is newest */
-       pend_tcp->reuse.lru_prev = NULL;
-       if(outnet->tcp_reuse_first) {
-               pend_tcp->reuse.lru_next = outnet->tcp_reuse_first;
-               outnet->tcp_reuse_first->lru_prev = &pend_tcp->reuse;
-       } else {
-               pend_tcp->reuse.lru_next = NULL;
-               outnet->tcp_reuse_last = &pend_tcp->reuse;
-       }
-       outnet->tcp_reuse_first = &pend_tcp->reuse;
-       pend_tcp->reuse.item_on_lru_list = 1;
-       return 1;
-}
-
 /** perform failure callbacks for waiting queries in reuse read rbtree */
 static void reuse_cb_readwait_for_failure(rbtree_type* tree_by_id, int err)
 {