MEDIUM: connection: replace idle conn lists by eb trees
The server idle/safe/available connection lists are replaced with ebmb-
trees. This is used to store backend connections, with the new field
connection hash as the key. The hash is a 8-bytes size field, used to
reflect specific connection parameters.
This is a preliminary work to be able to reuse connection with SNI,
explicit src/dst address or PROXY protocol.
diff --git a/src/cfgparse.c b/src/cfgparse.c
index c3159f5..0dcb0a1 100644
--- a/src/cfgparse.c
+++ b/src/cfgparse.c
@@ -3548,17 +3548,17 @@
for (newsrv = curproxy->srv; newsrv; newsrv = newsrv->next) {
int i;
- newsrv->available_conns = calloc(global.nbthread, sizeof(*newsrv->available_conns));
+ newsrv->available_conns_tree = calloc(global.nbthread, sizeof(*newsrv->available_conns_tree));
- if (!newsrv->available_conns) {
+ if (!newsrv->available_conns_tree) {
ha_alert("parsing [%s:%d] : failed to allocate idle connections for server '%s'.\n",
- newsrv->conf.file, newsrv->conf.line, newsrv->id);
+ newsrv->conf.file, newsrv->conf.line, newsrv->id);
cfgerr++;
continue;
}
for (i = 0; i < global.nbthread; i++)
- LIST_INIT(&newsrv->available_conns[i]);
+ newsrv->available_conns_tree[i] = EB_ROOT;
if (newsrv->max_idle_conns != 0) {
if (idle_conn_task == NULL) {
@@ -3580,27 +3580,27 @@
}
}
- newsrv->idle_conns = calloc((unsigned short)global.nbthread, sizeof(*newsrv->idle_conns));
- if (!newsrv->idle_conns) {
+ newsrv->idle_conns_tree = calloc((unsigned short)global.nbthread, sizeof(*newsrv->idle_conns_tree));
+ if (!newsrv->idle_conns_tree) {
ha_alert("parsing [%s:%d] : failed to allocate idle connections for server '%s'.\n",
- newsrv->conf.file, newsrv->conf.line, newsrv->id);
+ newsrv->conf.file, newsrv->conf.line, newsrv->id);
cfgerr++;
continue;
}
for (i = 0; i < global.nbthread; i++)
- MT_LIST_INIT(&newsrv->idle_conns[i]);
+ newsrv->idle_conns_tree[i] = EB_ROOT;
- newsrv->safe_conns = calloc(global.nbthread, sizeof(*newsrv->safe_conns));
- if (!newsrv->safe_conns) {
+ newsrv->safe_conns_tree = calloc(global.nbthread, sizeof(*newsrv->safe_conns_tree));
+ if (!newsrv->safe_conns_tree) {
ha_alert("parsing [%s:%d] : failed to allocate idle connections for server '%s'.\n",
- newsrv->conf.file, newsrv->conf.line, newsrv->id);
+ newsrv->conf.file, newsrv->conf.line, newsrv->id);
cfgerr++;
continue;
}
for (i = 0; i < global.nbthread; i++)
- MT_LIST_INIT(&newsrv->safe_conns[i]);
+ newsrv->safe_conns_tree[i] = EB_ROOT;
newsrv->curr_idle_thr = calloc(global.nbthread, sizeof(*newsrv->curr_idle_thr));
if (!newsrv->curr_idle_thr)