]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
[MEDIUM] session: set SI_FL_NOLINGER when aborting on write timeouts
authorWilly Tarreau <w@1wt.eu>
Tue, 29 Dec 2009 13:49:56 +0000 (14:49 +0100)
committerWilly Tarreau <w@1wt.eu>
Tue, 29 Dec 2009 13:49:56 +0000 (14:49 +0100)
Doing this helps us flush the system buffers from all unread data. This
avoids having orphans when clients suddenly get off the net without
reading their entire response.

src/session.c

index 2261c932d1313be5b5c6070452002e3447ca7046..a22a6f347acedb3921e828374bd969b3dcfd403f 100644 (file)
@@ -668,19 +668,23 @@ struct task *process_session(struct task *t)
 
                buffer_check_timeouts(s->req);
 
+               if (unlikely((s->req->flags & (BF_SHUTW|BF_WRITE_TIMEOUT)) == BF_WRITE_TIMEOUT)) {
+                       s->req->cons->flags |= SI_FL_NOLINGER;
+                       s->req->cons->shutw(s->req->cons);
+               }
+
                if (unlikely((s->req->flags & (BF_SHUTR|BF_READ_TIMEOUT)) == BF_READ_TIMEOUT))
                        s->req->prod->shutr(s->req->prod);
 
-               if (unlikely((s->req->flags & (BF_SHUTW|BF_WRITE_TIMEOUT)) == BF_WRITE_TIMEOUT))
-                       s->req->cons->shutw(s->req->cons);
-
                buffer_check_timeouts(s->rep);
 
+               if (unlikely((s->rep->flags & (BF_SHUTW|BF_WRITE_TIMEOUT)) == BF_WRITE_TIMEOUT)) {
+                       s->rep->cons->flags |= SI_FL_NOLINGER;
+                       s->rep->cons->shutw(s->rep->cons);
+               }
+
                if (unlikely((s->rep->flags & (BF_SHUTR|BF_READ_TIMEOUT)) == BF_READ_TIMEOUT))
                        s->rep->prod->shutr(s->rep->prod);
-
-               if (unlikely((s->rep->flags & (BF_SHUTW|BF_WRITE_TIMEOUT)) == BF_WRITE_TIMEOUT))
-                       s->rep->cons->shutw(s->rep->cons);
        }
 
        /* 1b: check for low-level errors reported at the stream interface.