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

Reply via email to