mirror of
http://git.haproxy.org/git/haproxy.git/
synced 2025-02-20 12:46:56 +00:00
MEDIUM: peers: make use of stream_accept_session()
Instead of going through some obscure initialization sequences, we now rely on the stream code to initialize our stream. Some parts are still a bit tricky as we cannot call the frontend's accept code which is only made for appctx in input. So part of the initialization past the stream code is what ought to be in the frontend code instead. Still, even without this, these are 71 lines that were removed.
This commit is contained in:
parent
470280ef63
commit
342bfb180c
87
src/peers.c
87
src/peers.c
@ -1138,51 +1138,23 @@ static struct stream *peer_session_create(struct peer *peer, struct peer_session
|
||||
Alert("out of memory in peer_session_create().\n");
|
||||
goto out_free_sess;
|
||||
}
|
||||
|
||||
t->process = l->handler;
|
||||
t->context = sess;
|
||||
t->nice = l->nice;
|
||||
|
||||
if ((s = pool_alloc2(pool2_stream)) == NULL) { /* disable this proxy for a while */
|
||||
Alert("out of memory in peer_session_create().\n");
|
||||
if (stream_accept_session(sess, t) <= 0) {
|
||||
Alert("Failed to initialize stream in peer_session_create().\n");
|
||||
goto out_free_task;
|
||||
}
|
||||
|
||||
LIST_ADDQ(&streams, &s->list);
|
||||
LIST_INIT(&s->back_refs);
|
||||
LIST_INIT(&s->buffer_wait);
|
||||
|
||||
/* The tasks below are normally what is supposed to be done by
|
||||
* fe->accept().
|
||||
*/
|
||||
s = t->context; // For now the session is not stored anywhere else :-/
|
||||
s->flags = SF_ASSIGNED|SF_ADDR_SET;
|
||||
|
||||
s->task = t;
|
||||
t->context = s;
|
||||
s->sess = sess;
|
||||
s->be = s->sess->fe;
|
||||
s->req.buf = s->res.buf = NULL;
|
||||
s->req_cap = NULL;
|
||||
s->res_cap = NULL;
|
||||
|
||||
s->si[0].flags = SI_FL_NONE;
|
||||
s->si[1].flags = SI_FL_ISBACK;
|
||||
|
||||
si_reset(&s->si[0]);
|
||||
si_set_state(&s->si[0], SI_ST_EST);
|
||||
|
||||
if (s->sess->fe->options2 & PR_O2_INDEPSTR)
|
||||
s->si[0].flags |= SI_FL_INDEP_STR;
|
||||
|
||||
si_attach_appctx(&s->si[0], appctx);
|
||||
s->si[0].flags |= SI_FL_WAIT_DATA;
|
||||
|
||||
si_reset(&s->si[1]);
|
||||
|
||||
/* initiate an outgoing connection */
|
||||
si_set_state(&s->si[1], SI_ST_ASS);
|
||||
s->si[1].conn_retries = p->conn_retries;
|
||||
|
||||
if (s->be->options2 & PR_O2_INDEPSTR)
|
||||
s->si[1].flags |= SI_FL_INDEP_STR;
|
||||
|
||||
/* automatically prepare the stream interface to connect to the
|
||||
* pre-initialized connection in si->conn.
|
||||
*/
|
||||
@ -1194,70 +1166,25 @@ static struct stream *peer_session_create(struct peer *peer, struct peer_session
|
||||
|
||||
conn->target = s->target = &s->be->obj_type;
|
||||
memcpy(&conn->addr.to, &peer->addr, sizeof(conn->addr.to));
|
||||
|
||||
stream_init_srv_conn(s);
|
||||
s->pend_pos = NULL;
|
||||
|
||||
/* init store persistence */
|
||||
s->store_count = 0;
|
||||
memset(s->stkctr, 0, sizeof(s->stkctr));
|
||||
|
||||
/* FIXME: the logs are horribly complicated now, because they are
|
||||
* defined in <p>, <p>, and later <be> and <be>. We still initialize
|
||||
* a few of them to help troubleshooting (eg: show sess shows them).
|
||||
*/
|
||||
|
||||
s->logs.logwait = 0;
|
||||
s->logs.level = 0;
|
||||
s->logs.accept_date = sess->accept_date; /* user-visible date for logging */
|
||||
s->logs.tv_accept = sess->tv_accept; /* corrected date for internal use */
|
||||
s->do_log = NULL;
|
||||
|
||||
/* default error reporting function, may be changed by analysers */
|
||||
s->srv_error = default_srv_error;
|
||||
|
||||
s->uniq_id = 0;
|
||||
s->unique_id = NULL;
|
||||
|
||||
s->txn = NULL;
|
||||
|
||||
channel_init(&s->req);
|
||||
s->req.flags |= CF_READ_ATTACHED; /* the producer is already connected */
|
||||
|
||||
/* activate default analysers enabled for this listener */
|
||||
s->req.analysers = l->analysers;
|
||||
|
||||
/* note: this should not happen anymore since there's always at least the switching rules */
|
||||
if (!s->req.analysers) {
|
||||
channel_auto_connect(&s->req);/* don't wait to establish connection */
|
||||
channel_auto_close(&s->req);/* let the producer forward close requests */
|
||||
channel_auto_close(&s->req); /* let the producer forward close requests */
|
||||
}
|
||||
|
||||
s->req.rto = s->sess->fe->timeout.client;
|
||||
s->req.wto = s->be->timeout.server;
|
||||
|
||||
channel_init(&s->res);
|
||||
s->res.flags |= CF_ISRESP;
|
||||
|
||||
s->res.rto = s->be->timeout.server;
|
||||
s->res.wto = s->sess->fe->timeout.client;
|
||||
|
||||
s->req.rex = TICK_ETERNITY;
|
||||
s->req.wex = TICK_ETERNITY;
|
||||
s->req.analyse_exp = TICK_ETERNITY;
|
||||
s->res.rex = TICK_ETERNITY;
|
||||
s->res.wex = TICK_ETERNITY;
|
||||
s->res.analyse_exp = TICK_ETERNITY;
|
||||
t->expire = TICK_ETERNITY;
|
||||
|
||||
s->res.flags |= CF_READ_DONTWAIT;
|
||||
|
||||
/* it is important not to call the wakeup function directly but to
|
||||
* pass through task_wakeup(), because this one knows how to apply
|
||||
* priorities to tasks.
|
||||
*/
|
||||
task_wakeup(t, TASK_WOKEN_INIT);
|
||||
|
||||
l->nbconn++; /* warning! right now, it's up to the handler to decrease this */
|
||||
p->feconn++;/* beconn will be increased later */
|
||||
jobs++;
|
||||
|
Loading…
Reference in New Issue
Block a user