mirror of
http://git.haproxy.org/git/haproxy.git/
synced 2025-03-24 11:56:48 +00:00
MEDIUM: spoe: don't create a dummy listener for outgoing connections
The code currently creates a listener only to ensure that sess->li is properly populated, and to retrieve the frontend (which is also available directly from the session). It turns out that the current infrastructure (for a large part) already supports not having any listener on a session (since Lua does the same), except for the following places which were not yet converted : - session_count_new() : used by session_accept_fd, ie never for spoe - session_accept_fd() : never used here, an applet initiates the session - session_prepare_log_prefix() : embryonic sessions only, thus unused - session_kill_embryonic() : same - conn_complete_session() : same - build_log_line() for fields %cp, %fp and %ft : unused here but may change - http_wait_for_request() and subsequent functions : unused here Thus for now it's as safe to run SPOE without listener as it is for Lua, and this was an obstacle against some cleanups of the listener code. The places above should be plugged so that it becomes save over the long term as well. An alternative in the future might be to create a dummy listener that outgoing connections could use just to avoid keeping a null here.
This commit is contained in:
parent
a12dde04e0
commit
5820a36690
@ -1557,8 +1557,6 @@ create_spoe_appctx(struct spoe_config *conf)
|
||||
struct session *sess;
|
||||
struct task *task;
|
||||
struct stream *strm;
|
||||
struct listener *l = LIST_NEXT(&conf->agent_fe.conf.listeners,
|
||||
struct listener *, by_fe);
|
||||
|
||||
if ((appctx = appctx_new(&spoe_applet)) == NULL)
|
||||
goto out_error;
|
||||
@ -1575,7 +1573,7 @@ create_spoe_appctx(struct spoe_config *conf)
|
||||
APPCTX_SPOE(appctx).max_frame_size = global.tune.bufsize;
|
||||
task_wakeup(APPCTX_SPOE(appctx).task, TASK_WOKEN_INIT);
|
||||
|
||||
sess = session_new(&conf->agent_fe, l, &appctx->obj_type);
|
||||
sess = session_new(&conf->agent_fe, NULL, &appctx->obj_type);
|
||||
if (!sess)
|
||||
goto out_free_spoe;
|
||||
|
||||
@ -1585,8 +1583,6 @@ create_spoe_appctx(struct spoe_config *conf)
|
||||
if ((strm = stream_new(sess, task, &appctx->obj_type)) == NULL)
|
||||
goto out_free_task;
|
||||
|
||||
strm->target = sess->listener->default_target;
|
||||
strm->req.analysers |= sess->listener->analysers;
|
||||
stream_set_backend(strm, conf->agent->b.be);
|
||||
|
||||
/* applet is waiting for data */
|
||||
@ -2306,7 +2302,6 @@ static int
|
||||
spoe_init(struct proxy *px, struct flt_conf *fconf)
|
||||
{
|
||||
struct spoe_config *conf = fconf->conf;
|
||||
struct listener *l;
|
||||
|
||||
memset(&conf->agent_fe, 0, sizeof(conf->agent_fe));
|
||||
init_new_proxy(&conf->agent_fe);
|
||||
@ -2324,26 +2319,12 @@ spoe_init(struct proxy *px, struct flt_conf *fconf)
|
||||
conf->agent_fe.default_target = &spoe_applet.obj_type;
|
||||
conf->agent_fe.fe_req_ana = AN_REQ_SWITCHING_RULES;
|
||||
|
||||
if ((l = calloc(1, sizeof(*l))) == NULL) {
|
||||
Alert("spoe_init : out of memory.\n");
|
||||
goto out_error;
|
||||
}
|
||||
l->obj_type = OBJ_TYPE_LISTENER;
|
||||
l->obj_type = OBJ_TYPE_LISTENER;
|
||||
l->frontend = &conf->agent_fe;
|
||||
l->state = LI_READY;
|
||||
l->analysers = conf->agent_fe.fe_req_ana;
|
||||
LIST_ADDQ(&conf->agent_fe.conf.listeners, &l->by_fe);
|
||||
|
||||
if (!sighandler_registered) {
|
||||
signal_register_fct(0, sig_stop_spoe, 0);
|
||||
sighandler_registered = 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
out_error:
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* Free ressources allocated by the SPOE filter. */
|
||||
|
Loading…
Reference in New Issue
Block a user