From: W.C.A. Wijngaards Date: Mon, 13 Jul 2020 14:11:52 +0000 (+0200) Subject: stream reuse, make reuse possible straight away after first query to address. X-Git-Tag: release-1.13.0rc1~5^2~33 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=a7776a15e54e3a342e775831ac74c0c6f936a1d8;p=thirdparty%2Funbound.git stream reuse, make reuse possible straight away after first query to address. --- diff --git a/services/outside_network.c b/services/outside_network.c index 5acf00b6a..425c0839a 100644 --- a/services/outside_network.c +++ b/services/outside_network.c @@ -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) {