MEDIUM: servers: Used a locked list for idle_orphan_conns.

Use the locked macros when manipulating idle_orphan_conns, so that other
threads can remove elements from it.
It will be useful later to avoid having a task per server and per thread to
cleanup the orphan list.
This commit is contained in:
Olivier Houchard 2019-01-22 16:11:03 +01:00 committed by Olivier Houchard
parent a8434ec146
commit 7f1bc31fee
3 changed files with 7 additions and 5 deletions

View File

@ -698,7 +698,7 @@ static inline void conn_free(struct connection *conn)
} }
conn_force_unsubscribe(conn); conn_force_unsubscribe(conn);
LIST_DEL(&conn->list); LIST_DEL_LOCKED(&conn->list);
LIST_INIT(&conn->list); LIST_INIT(&conn->list);
pool_free(pool_head_connection, conn); pool_free(pool_head_connection, conn);
} }

View File

@ -252,7 +252,7 @@ static inline int srv_add_to_idle_list(struct server *srv, struct connection *co
return 0; return 0;
} }
LIST_DEL(&conn->list); LIST_DEL(&conn->list);
LIST_ADDQ(&srv->idle_orphan_conns[tid], &conn->list); LIST_ADDQ_LOCKED(&srv->idle_orphan_conns[tid], &conn->list);
srv->curr_idle_thr[tid]++; srv->curr_idle_thr[tid]++;
conn->idle_time = now_ms; conn->idle_time = now_ms;

View File

@ -1307,10 +1307,13 @@ int connect_server(struct stream *s)
(((s->be->options & PR_O_REUSE_MASK) == PR_O_REUSE_ALWS) || (((s->be->options & PR_O_REUSE_MASK) == PR_O_REUSE_ALWS) ||
(((s->be->options & PR_O_REUSE_MASK) != PR_O_REUSE_NEVR) && (((s->be->options & PR_O_REUSE_MASK) != PR_O_REUSE_NEVR) &&
s->txn && (s->txn->flags & TX_NOT_FIRST)))) { s->txn && (s->txn->flags & TX_NOT_FIRST)))) {
srv_conn = LIST_ELEM(srv->idle_orphan_conns[tid].n, srv_conn = LIST_POP_LOCKED(&srv->idle_orphan_conns[tid],
struct connection *, list); struct connection *, list);
if (srv_conn) {
LIST_INIT(&srv_conn->list);
reuse_orphan = 1; reuse_orphan = 1;
} }
}
/* If we've picked a connection from the pool, we now have to /* If we've picked a connection from the pool, we now have to
* detach it. We may have to get rid of the previous idle * detach it. We may have to get rid of the previous idle
@ -1341,7 +1344,6 @@ int connect_server(struct stream *s)
* list and add it back to the idle list. * list and add it back to the idle list.
*/ */
if (reuse && reuse_orphan) { if (reuse && reuse_orphan) {
LIST_DEL(&srv_conn->list);
srv_conn->idle_time = 0; srv_conn->idle_time = 0;
HA_ATOMIC_SUB(&srv->curr_idle_conns, 1); HA_ATOMIC_SUB(&srv->curr_idle_conns, 1);
srv->curr_idle_thr[tid]--; srv->curr_idle_thr[tid]--;