MEDIUM: session: register a data->wake callback to process errors

The connection layer will soon call ->wake() only when errors happen, and
not ->init(). So make the session layer use this callback to detect errors
and abort connections.
This commit is contained in:
Willy Tarreau 2012-10-03 21:17:23 +02:00
parent 2396c1c4a2
commit 9683e9a05f

View File

@ -51,6 +51,7 @@ struct pool_head *pool2_session;
struct list sessions; struct list sessions;
static int conn_session_complete(struct connection *conn); static int conn_session_complete(struct connection *conn);
static int conn_session_update(struct connection *conn);
static struct task *expire_mini_session(struct task *t); static struct task *expire_mini_session(struct task *t);
int session_complete(struct session *s); int session_complete(struct session *s);
@ -58,7 +59,7 @@ int session_complete(struct session *s);
struct data_cb sess_conn_cb = { struct data_cb sess_conn_cb = {
.recv = NULL, .recv = NULL,
.send = NULL, .send = NULL,
.wake = NULL, .wake = conn_session_update,
.init = conn_session_complete, .init = conn_session_complete,
}; };
@ -281,6 +282,18 @@ static int conn_session_complete(struct connection *conn)
return -1; return -1;
} }
/* Update an embryonic session status. The connection is killed in case of
* error, and <0 will be returned. Otherwise it does nothing.
*/
static int conn_session_update(struct connection *conn)
{
if (conn->flags & CO_FL_ERROR) {
kill_mini_session(conn->owner);
return -1;
}
return 0;
}
/* Manages embryonic sessions timeout. It is only called when the timeout /* Manages embryonic sessions timeout. It is only called when the timeout
* strikes and performs the required cleanup. * strikes and performs the required cleanup.
*/ */