BBlack has uploaded a new change for review.
https://gerrit.wikimedia.org/r/71648
Change subject: bugfix: parser incompletion was causing queue backlog...
......................................................................
bugfix: parser incompletion was causing queue backlog...
In some now-common situation that wasn't being triggered before,
the HTTP parser never completed even though we received
a successful response, which in turn exposed a bug where
the purger would not advance through the queue in those
conditions, resulting in a fast loop re-sending the same
PURGE over and over and over.... This seems to fix it.
Change-Id: Ib18a086e74e971aafeb809fe84adbfecf0b5eff9
---
M src/purger.c
1 file changed, 22 insertions(+), 25 deletions(-)
git pull ssh://gerrit.wikimedia.org:29418/operations/software/varnish/vhtcpd
refs/changes/48/71648/1
diff --git a/src/purger.c b/src/purger.c
index 4763e3d..e0ab382 100644
--- a/src/purger.c
+++ b/src/purger.c
@@ -525,30 +525,24 @@
const unsigned to_recv = s->inbuf_size - s->inbuf_parsed;
int recvrv = recv(s->fd, &s->inbuf[s->inbuf_parsed], to_recv, 0);
- if(recvrv < 1) {
- if(recvrv == -1) {
- switch(errno) {
- case EAGAIN:
- case EINTR:
- // no real problem, but must return to eventloop and wait
more
- dmn_log_debug("purger: %s/%s -> purger_read_cb silent
result: EAGAIN/EINTR", dmn_logf_anysin(&s->daddr), state_strs[s->state]);
- return;
- case ENOTCONN:
- case ECONNRESET:
- case ETIMEDOUT:
- case EPIPE:
- // "normal" problems, no need to log about it
- dmn_log_debug("purger: %s/%s -> purger_read_cb silent
result: closing due to '%s'", dmn_logf_anysin(&s->daddr), state_strs[s->state],
dmn_logf_errno());
- break;
- default:
- // abormal problems, mention it in the log
- dmn_log_err("TCP conn to %s failed while reading: %s",
dmn_logf_anysin(&s->daddr), dmn_logf_errno());
- }
+ if(recvrv < 0) {
+ switch(errno) {
+ case EAGAIN:
+ case EINTR:
+ // no real problem, but must return to eventloop and wait more
+ dmn_log_debug("purger: %s/%s -> purger_read_cb silent result:
EAGAIN/EINTR", dmn_logf_anysin(&s->daddr), state_strs[s->state]);
+ return;
+ case ENOTCONN:
+ case ECONNRESET:
+ case ETIMEDOUT:
+ case EPIPE:
+ // "normal" problems, no need to log about it
+ dmn_log_debug("purger: %s/%s -> purger_read_cb silent result:
closing due to '%s'", dmn_logf_anysin(&s->daddr), state_strs[s->state],
dmn_logf_errno());
+ break;
+ default:
+ // abormal problems, mention it in the log
+ dmn_log_err("TCP conn to %s failed while reading: %s",
dmn_logf_anysin(&s->daddr), dmn_logf_errno());
}
-
- if(recvrv == 0)
- dmn_log_debug("purger: %s/%s -> purger_read_cb silent result:
server closed", dmn_logf_anysin(&s->daddr), state_strs[s->state]);
-
close_from_read_cb(s, false);
return;
}
@@ -556,7 +550,10 @@
// From here we actually got some data...
if(s->state != PST_RECVWAIT) {
- dmn_log_err("TCP conn to %s: received unexpected data from server
during request-send or idle phases...", dmn_logf_anysin(&s->daddr));
+ if(recvrv == 0)
+ dmn_log_debug("purger: %s/%s -> purger_read_cb silent result:
server closed", dmn_logf_anysin(&s->daddr), state_strs[s->state]);
+ else
+ dmn_log_err("TCP conn to %s: received unexpected data from server
during request-send or idle phases...", dmn_logf_anysin(&s->daddr));
close_from_read_cb(s, false);
return;
}
@@ -620,7 +617,7 @@
else {
// If neither of the above, parser consumed all available data and
didn't complete the message,
// so just return to the loop and maintain this state to get more
data.
- dmn_log_debug("purger: %s/%s -> purger_read_cb silent result: apparent
partial parse, still waiting for data...", dmn_logf_anysin(&s->daddr),
state_strs[s->state]);
+ dmn_log_debug("purger: %s/%s -> purger_read_cb silent result: apparent
partial parse (%u new, %u total), still waiting for data...",
dmn_logf_anysin(&s->daddr), state_strs[s->state], recvrv, s->inbuf_parsed);
}
}
--
To view, visit https://gerrit.wikimedia.org/r/71648
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: Ib18a086e74e971aafeb809fe84adbfecf0b5eff9
Gerrit-PatchSet: 1
Gerrit-Project: operations/software/varnish/vhtcpd
Gerrit-Branch: master
Gerrit-Owner: BBlack <[email protected]>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits