From: Willy Tarreau Date: Sun, 4 Oct 2009 15:18:35 +0000 (+0200) Subject: [MEDIUM] stream_int: adjust WAIT_ROOM handling X-Git-Tag: v1.4-dev4~33 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=96fd4b5f09d282d217d53cb411e0c80bb7663494;p=thirdparty%2Fhaproxy.git [MEDIUM] stream_int: adjust WAIT_ROOM handling When applets write data, they generall cannot fill the buffer, so as soon as we find a non-empty buffer, we're sure we're missing some room. --- diff --git a/src/dumpstats.c b/src/dumpstats.c index e8eef21f61..3e65ab79a6 100644 --- a/src/dumpstats.c +++ b/src/dumpstats.c @@ -438,10 +438,8 @@ void stats_io_handler(struct stream_interface *si) } /* If the output functions are still there, it means they require more room. */ - if (si->st0 >= STAT_CLI_OUTPUT) { - si->flags |= SI_FL_WAIT_ROOM; + if (si->st0 >= STAT_CLI_OUTPUT) break; - } /* Now we close the output if one of the writers did so, * or if we're not in interactive mode and the request @@ -637,9 +635,6 @@ void http_stats_io_handler(struct stream_interface *si) if (stats_dump_http(s, res, s->be->uri_auth)) { si->st0 = 1; si->shutw(si); - } else { - /* buffer full */ - si->flags |= SI_FL_WAIT_ROOM; } } diff --git a/src/stream_interface.c b/src/stream_interface.c index 6f026860f5..96b26def58 100644 --- a/src/stream_interface.c +++ b/src/stream_interface.c @@ -120,7 +120,10 @@ void stream_int_update_embedded(struct stream_interface *si) if ((si->ob->flags & (BF_FULL|BF_SHUTW|BF_SHUTW_NOW|BF_HIJACK)) == 0) si->flags |= SI_FL_WAIT_DATA; - if ((si->ib->flags & (BF_FULL|BF_SHUTR)) == BF_FULL) + /* we're almost sure that we need some space if the buffer is not + * empty, even if it's not full, because the applets can't fill it. + */ + if ((si->ib->flags & (BF_SHUTR|BF_OUT_EMPTY)) == 0) si->flags |= SI_FL_WAIT_ROOM; if (si->ob->flags & BF_WRITE_ACTIVITY) { @@ -134,10 +137,12 @@ void stream_int_update_embedded(struct stream_interface *si) si->ib->rex = tick_add_ifset(now_ms, si->ib->rto); } - if (si->ob->flags & BF_WRITE_PARTIAL) + if (likely((si->ob->flags & (BF_SHUTW|BF_WRITE_PARTIAL|BF_FULL)) == BF_WRITE_PARTIAL && + (si->ob->prod->flags & SI_FL_WAIT_ROOM))) si->ob->prod->chk_rcv(si->ob->prod); - if (si->ib->flags & BF_READ_PARTIAL) + if (((si->ib->flags & (BF_READ_PARTIAL|BF_OUT_EMPTY)) == BF_READ_PARTIAL) && + (si->ib->cons->flags & SI_FL_WAIT_DATA)) si->ib->cons->chk_snd(si->ib->cons); /* Note that we're trying to wake up in two conditions here :