From 7a20aa6e6bc5f17f5d0c18bd087e657243bebb45 Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Tue, 13 Jul 2010 16:30:45 +0200 Subject: [PATCH] [MEDIUM] session: make it possible to call an I/O handler on both SI This will be used when an I/O handler running in a stream interface needs to establish a connection somewhere. We want the session processor to evaluate both I/O handlers, depending on which side has one. Doing so also requires that stream_int_update_embedded() wakes the session up only when the other side is established or has closed, for instance in order to handle connection errors without looping indefinitely during the connection setup time. The session processor still relies on BF_READ_ATTACHED being set, though we must do whatever is required to remove this dependency. --- src/session.c | 9 ++++++--- src/stream_interface.c | 2 +- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/session.c b/src/session.c index 10c7f13d6..acd977031 100644 --- a/src/session.c +++ b/src/session.c @@ -1821,11 +1821,14 @@ resync_stream_interface: s->req->rex = TICK_ETERNITY; } - /* Call the second stream interface's I/O handler if it's embedded. + /* Call the stream interfaces' I/O handlers when embedded. * Note that this one may wake the task up again. */ - if (s->req->cons->iohandler) { - s->req->cons->iohandler(s->req->cons); + if (s->req->cons->iohandler || s->rep->cons->iohandler) { + if (s->req->cons->iohandler) + s->req->cons->iohandler(s->req->cons); + if (s->rep->cons->iohandler) + s->rep->cons->iohandler(s->rep->cons); if (task_in_rq(t)) { /* If we woke up, we don't want to requeue the * task to the wait queue, but rather requeue diff --git a/src/stream_interface.c b/src/stream_interface.c index 113f01c65..9d2f9c5eb 100644 --- a/src/stream_interface.c +++ b/src/stream_interface.c @@ -142,7 +142,7 @@ void stream_int_update_embedded(struct stream_interface *si) * the to only rely the changes the chk_* might have performed. */ if (/* check stream interface changes */ - (si->flags & SI_FL_ERR) || si->state != SI_ST_EST || si->ib->cons->state != SI_ST_EST || + (si->flags & SI_FL_ERR) || si->state != SI_ST_EST || si->ib->cons->state > SI_ST_EST || /* check response buffer changes */ (si->ib->flags & (BF_READ_NULL|BF_READ_ERROR|BF_READ_DONTWAIT)) || ((si->ib->flags & BF_READ_ACTIVITY) && !si->ib->to_forward) ||