mirror of
https://github.com/NLnetLabs/unbound.git
synced 2025-12-20 23:00:56 -05:00
- Fix readagain and writeagain callback functions for comm point
cleanup.
This commit is contained in:
parent
d05c259458
commit
e50152aa1f
5 changed files with 50 additions and 18 deletions
|
|
@ -7,6 +7,8 @@
|
||||||
- Fix memory leak for edns client tag opcode config element.
|
- Fix memory leak for edns client tag opcode config element.
|
||||||
- Attempt fix for libevent state in tcp reuse cases after a packet
|
- Attempt fix for libevent state in tcp reuse cases after a packet
|
||||||
is written.
|
is written.
|
||||||
|
- Fix readagain and writeagain callback functions for comm point
|
||||||
|
cleanup.
|
||||||
|
|
||||||
24 November 2020: Wouter
|
24 November 2020: Wouter
|
||||||
- Merge PR #283 : Stream reuse. This implements upstream stream
|
- Merge PR #283 : Stream reuse. This implements upstream stream
|
||||||
|
|
|
||||||
|
|
@ -655,6 +655,10 @@ outnet_tcp_take_into_use(struct waiting_tcp* w)
|
||||||
pend->query = w;
|
pend->query = w;
|
||||||
pend->reuse.outnet = w->outnet;
|
pend->reuse.outnet = w->outnet;
|
||||||
pend->c->repinfo.addrlen = w->addrlen;
|
pend->c->repinfo.addrlen = w->addrlen;
|
||||||
|
pend->c->tcp_more_read_again = &pend->reuse.cp_more_read_again;
|
||||||
|
pend->c->tcp_more_write_again = &pend->reuse.cp_more_write_again;
|
||||||
|
pend->reuse.cp_more_read_again = 0;
|
||||||
|
pend->reuse.cp_more_write_again = 0;
|
||||||
memcpy(&pend->c->repinfo.addr, &w->addr, w->addrlen);
|
memcpy(&pend->c->repinfo.addr, &w->addr, w->addrlen);
|
||||||
pend->reuse.pending = pend;
|
pend->reuse.pending = pend;
|
||||||
if(pend->c->ssl)
|
if(pend->c->ssl)
|
||||||
|
|
@ -804,8 +808,8 @@ reuse_move_writewait_away(struct outside_network* outnet,
|
||||||
pend->c->tcp_write_pkt = NULL;
|
pend->c->tcp_write_pkt = NULL;
|
||||||
pend->c->tcp_write_pkt_len = 0;
|
pend->c->tcp_write_pkt_len = 0;
|
||||||
pend->c->tcp_write_and_read = 0;
|
pend->c->tcp_write_and_read = 0;
|
||||||
pend->c->tcp_more_read_again = 0;
|
pend->reuse.cp_more_read_again = 0;
|
||||||
pend->c->tcp_more_write_again = 0;
|
pend->reuse.cp_more_write_again = 0;
|
||||||
pend->c->tcp_is_reading = 1;
|
pend->c->tcp_is_reading = 1;
|
||||||
w = pend->query;
|
w = pend->query;
|
||||||
pend->query = NULL;
|
pend->query = NULL;
|
||||||
|
|
@ -1008,7 +1012,7 @@ outnet_tcp_cb(struct comm_point* c, void* arg, int error,
|
||||||
* because this callback called after a tcp write
|
* because this callback called after a tcp write
|
||||||
* succeeded and likely more buffer space is available
|
* succeeded and likely more buffer space is available
|
||||||
* and we can write some more. */
|
* and we can write some more. */
|
||||||
pend->c->tcp_more_write_again = 1;
|
pend->reuse.cp_more_write_again = 1;
|
||||||
pend->query = reuse_write_wait_pop(&pend->reuse);
|
pend->query = reuse_write_wait_pop(&pend->reuse);
|
||||||
comm_point_stop_listening(pend->c);
|
comm_point_stop_listening(pend->c);
|
||||||
outnet_tcp_take_query_setup(pend->c->fd, pend,
|
outnet_tcp_take_query_setup(pend->c->fd, pend,
|
||||||
|
|
@ -1016,8 +1020,8 @@ outnet_tcp_cb(struct comm_point* c, void* arg, int error,
|
||||||
} else {
|
} else {
|
||||||
verbose(VERB_ALGO, "outnet tcp writes done, wait");
|
verbose(VERB_ALGO, "outnet tcp writes done, wait");
|
||||||
pend->c->tcp_write_and_read = 0;
|
pend->c->tcp_write_and_read = 0;
|
||||||
pend->c->tcp_more_read_again = 0;
|
pend->reuse.cp_more_read_again = 0;
|
||||||
pend->c->tcp_more_write_again = 0;
|
pend->reuse.cp_more_write_again = 0;
|
||||||
pend->c->tcp_is_reading = 1;
|
pend->c->tcp_is_reading = 1;
|
||||||
comm_point_stop_listening(pend->c);
|
comm_point_stop_listening(pend->c);
|
||||||
reuse_tcp_setup_timeout(pend);
|
reuse_tcp_setup_timeout(pend);
|
||||||
|
|
@ -1072,7 +1076,7 @@ outnet_tcp_cb(struct comm_point* c, void* arg, int error,
|
||||||
* because this callback called after a successful read
|
* because this callback called after a successful read
|
||||||
* and there could be more bytes to read on the input */
|
* and there could be more bytes to read on the input */
|
||||||
if(pend->reuse.tree_by_id.count != 0)
|
if(pend->reuse.tree_by_id.count != 0)
|
||||||
pend->c->tcp_more_read_again = 1;
|
pend->reuse.cp_more_read_again = 1;
|
||||||
reuse_tcp_setup_read_and_timeout(pend);
|
reuse_tcp_setup_read_and_timeout(pend);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -266,6 +266,18 @@ struct reuse_tcp {
|
||||||
* or not is also part of the key to the rbtree.
|
* or not is also part of the key to the rbtree.
|
||||||
* There is a timeout and read event on the fd, to close it. */
|
* There is a timeout and read event on the fd, to close it. */
|
||||||
struct pending_tcp* pending;
|
struct pending_tcp* pending;
|
||||||
|
/**
|
||||||
|
* The more read again value pointed to by the commpoint
|
||||||
|
* tcp_more_read_again pointer, so that it exists after commpoint
|
||||||
|
* delete
|
||||||
|
*/
|
||||||
|
int cp_more_read_again;
|
||||||
|
/**
|
||||||
|
* The more write again value pointed to by the commpoint
|
||||||
|
* tcp_more_write_again pointer, so that it exists after commpoint
|
||||||
|
* delete
|
||||||
|
*/
|
||||||
|
int cp_more_write_again;
|
||||||
/** rbtree with other queries waiting on the connection, by ID number,
|
/** rbtree with other queries waiting on the connection, by ID number,
|
||||||
* of type struct waiting_tcp. It is for looking up received
|
* of type struct waiting_tcp. It is for looking up received
|
||||||
* answers to the structure for callback. And also to see if ID
|
* answers to the structure for callback. And also to see if ID
|
||||||
|
|
|
||||||
|
|
@ -1056,8 +1056,8 @@ reclaim_tcp_handler(struct comm_point* c)
|
||||||
comm_point_start_listening(c->tcp_parent, -1, -1);
|
comm_point_start_listening(c->tcp_parent, -1, -1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
c->tcp_more_read_again = 0;
|
c->tcp_more_read_again = NULL;
|
||||||
c->tcp_more_write_again = 0;
|
c->tcp_more_write_again = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** do the callback when writing is done */
|
/** do the callback when writing is done */
|
||||||
|
|
@ -1937,8 +1937,9 @@ tcp_more_read_again(int fd, struct comm_point* c)
|
||||||
* the connection, the callback signals this, and we try again */
|
* the connection, the callback signals this, and we try again */
|
||||||
/* this continues until the read routines get EAGAIN or so,
|
/* this continues until the read routines get EAGAIN or so,
|
||||||
* and thus does not call the callback, and the bool is 0 */
|
* and thus does not call the callback, and the bool is 0 */
|
||||||
while(c->tcp_more_read_again) {
|
int* moreread = c->tcp_more_read_again;
|
||||||
c->tcp_more_read_again = 0;
|
while(moreread && *moreread) {
|
||||||
|
*moreread = 0;
|
||||||
if(!comm_point_tcp_handle_read(fd, c, 0)) {
|
if(!comm_point_tcp_handle_read(fd, c, 0)) {
|
||||||
reclaim_tcp_handler(c);
|
reclaim_tcp_handler(c);
|
||||||
if(!c->tcp_do_close) {
|
if(!c->tcp_do_close) {
|
||||||
|
|
@ -1960,8 +1961,9 @@ tcp_more_write_again(int fd, struct comm_point* c)
|
||||||
* the callback signals it and we try again. */
|
* the callback signals it and we try again. */
|
||||||
/* this continues until the write routines get EAGAIN or so,
|
/* this continues until the write routines get EAGAIN or so,
|
||||||
* and thus does not call the callback, and the bool is 0 */
|
* and thus does not call the callback, and the bool is 0 */
|
||||||
while(c->tcp_more_write_again) {
|
int* morewrite = c->tcp_more_write_again;
|
||||||
c->tcp_more_write_again = 0;
|
while(morewrite && *morewrite) {
|
||||||
|
*morewrite = 0;
|
||||||
if(!comm_point_tcp_handle_write(fd, c)) {
|
if(!comm_point_tcp_handle_write(fd, c)) {
|
||||||
reclaim_tcp_handler(c);
|
reclaim_tcp_handler(c);
|
||||||
if(!c->tcp_do_close) {
|
if(!c->tcp_do_close) {
|
||||||
|
|
@ -2015,6 +2017,7 @@ comm_point_tcp_handle_callback(int fd, short event, void* arg)
|
||||||
}
|
}
|
||||||
if(event&UB_EV_READ) {
|
if(event&UB_EV_READ) {
|
||||||
int has_tcpq = (c->tcp_req_info != NULL);
|
int has_tcpq = (c->tcp_req_info != NULL);
|
||||||
|
int* moreread = c->tcp_more_read_again;
|
||||||
if(!comm_point_tcp_handle_read(fd, c, 0)) {
|
if(!comm_point_tcp_handle_read(fd, c, 0)) {
|
||||||
reclaim_tcp_handler(c);
|
reclaim_tcp_handler(c);
|
||||||
if(!c->tcp_do_close) {
|
if(!c->tcp_do_close) {
|
||||||
|
|
@ -2026,12 +2029,13 @@ comm_point_tcp_handle_callback(int fd, short event, void* arg)
|
||||||
}
|
}
|
||||||
if(has_tcpq && c->tcp_req_info && c->tcp_req_info->read_again)
|
if(has_tcpq && c->tcp_req_info && c->tcp_req_info->read_again)
|
||||||
tcp_req_info_read_again(fd, c);
|
tcp_req_info_read_again(fd, c);
|
||||||
if(c->tcp_more_read_again)
|
if(moreread && *moreread)
|
||||||
tcp_more_read_again(fd, c);
|
tcp_more_read_again(fd, c);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if(event&UB_EV_WRITE) {
|
if(event&UB_EV_WRITE) {
|
||||||
int has_tcpq = (c->tcp_req_info != NULL);
|
int has_tcpq = (c->tcp_req_info != NULL);
|
||||||
|
int* morewrite = c->tcp_more_write_again;
|
||||||
if(!comm_point_tcp_handle_write(fd, c)) {
|
if(!comm_point_tcp_handle_write(fd, c)) {
|
||||||
reclaim_tcp_handler(c);
|
reclaim_tcp_handler(c);
|
||||||
if(!c->tcp_do_close) {
|
if(!c->tcp_do_close) {
|
||||||
|
|
@ -2043,7 +2047,7 @@ comm_point_tcp_handle_callback(int fd, short event, void* arg)
|
||||||
}
|
}
|
||||||
if(has_tcpq && c->tcp_req_info && c->tcp_req_info->read_again)
|
if(has_tcpq && c->tcp_req_info && c->tcp_req_info->read_again)
|
||||||
tcp_req_info_read_again(fd, c);
|
tcp_req_info_read_again(fd, c);
|
||||||
if(c->tcp_more_write_again)
|
if(morewrite && *morewrite)
|
||||||
tcp_more_write_again(fd, c);
|
tcp_more_write_again(fd, c);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -299,13 +299,23 @@ struct comm_point {
|
||||||
|
|
||||||
/** if set try to read another packet again (over connection with
|
/** if set try to read another packet again (over connection with
|
||||||
* multiple packets), once set, tries once, then zero again,
|
* multiple packets), once set, tries once, then zero again,
|
||||||
* so set it in the packet complete section. */
|
* so set it in the packet complete section.
|
||||||
int tcp_more_read_again;
|
* The pointer itself has to be set before the callback is invoked,
|
||||||
|
* when you set things up, and continue to exist also after the
|
||||||
|
* commpoint is closed and deleted in your callback. So that after
|
||||||
|
* the callback cleans up netevent can see what it has to do.
|
||||||
|
* Or leave NULL if it is not used at all. */
|
||||||
|
int* tcp_more_read_again;
|
||||||
|
|
||||||
/** if set try to write another packet (over connection with
|
/** if set try to write another packet (over connection with
|
||||||
* multiple packets), once set, tries once, then zero again,
|
* multiple packets), once set, tries once, then zero again,
|
||||||
* so set it in the packet complete section. */
|
* so set it in the packet complete section.
|
||||||
int tcp_more_write_again;
|
* The pointer itself has to be set before the callback is invoked,
|
||||||
|
* when you set things up, and continue to exist also after the
|
||||||
|
* commpoint is closed and deleted in your callback. So that after
|
||||||
|
* the callback cleans up netevent can see what it has to do.
|
||||||
|
* Or leave NULL if it is not used at all. */
|
||||||
|
int* tcp_more_write_again;
|
||||||
|
|
||||||
/** if set, read/write completes:
|
/** if set, read/write completes:
|
||||||
read/write state of tcp is toggled.
|
read/write state of tcp is toggled.
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue