|
|
- From ae03ce5039283b63124e069bccd2c742cd71c5fb Mon Sep 17 00:00:00 2001
- From: Willy Tarreau <w@1wt.eu>
- Date: Tue, 13 Dec 2016 15:21:25 +0100
- Subject: [PATCH 04/19] BUG/MINOR: stream-int: automatically release
- SI_FL_WAIT_DATA on SHUTW_NOW
-
- While developing an experimental applet performing only one read per full
- line, it appeared that it would be woken up for the client's close, not
- read all data (missing LF), then wait for a subsequent call, and would only
- be woken up on client timeout to finish the read. The reason is that we
- preset SI_FL_WAIT_DATA in the stream-interface's flags to avoid a fast loop,
- but there's nothing which can remove this flag until there's a read operation.
-
- We must definitely remove it in stream_int_notify() each time we're called
- with CF_SHUTW_NOW because we know there will be no more subsequent read
- and we don't want an applet which keeps the WANT_GET flag to block on this.
-
- This fix should be backported to 1.7 and 1.6 though it's uncertain whether
- cli, peers, lua or spoe really are affected there.
- (cherry picked from commit 8cf9c8e663fa468fa2380eddecd671172ff63868)
- ---
- src/stream_interface.c | 6 +++++-
- 1 file changed, 5 insertions(+), 1 deletion(-)
-
- diff --git a/src/stream_interface.c b/src/stream_interface.c
- index faeceb9..758aec7 100644
- --- a/src/stream_interface.c
- +++ b/src/stream_interface.c
- @@ -455,9 +455,13 @@ void stream_int_notify(struct stream_interface *si)
- oc->wex = TICK_ETERNITY;
- }
-
- - /* indicate that we may be waiting for data from the output channel */
- + /* indicate that we may be waiting for data from the output channel or
- + * we're about to close and can't expect more data if SHUTW_NOW is there.
- + */
- if ((oc->flags & (CF_SHUTW|CF_SHUTW_NOW)) == 0 && channel_may_recv(oc))
- si->flags |= SI_FL_WAIT_DATA;
- + else if ((oc->flags & (CF_SHUTW|CF_SHUTW_NOW)) == CF_SHUTW_NOW)
- + si->flags &= ~SI_FL_WAIT_DATA;
-
- /* update OC timeouts and wake the other side up if it's waiting for room */
- if (oc->flags & CF_WRITE_ACTIVITY) {
- --
- 2.10.2
-
|