struct be_counters counters; /* statistics counters */
struct eb_root pendconns; /* pending connections */
- struct list actconns; /* active connections */
+ struct mt_list actconns; /* active connections (used by "shutdown server sessions") */
struct eb_root *idle_conns_tree; /* shareable idle connections*/
struct eb_root *safe_conns_tree; /* safe idle connections */
struct eb_root *available_conns_tree; /* Connection in used, but with still new streams available */
int32_t priority_offset; /* priority offset of the stream for the pending queue */
struct list list; /* position in global streams list */
- struct list by_srv; /* position in server stream list */
+ struct mt_list by_srv; /* position in server stream list */
struct list back_refs; /* list of users tracking this stream */
struct buffer_wait buffer_wait; /* position in the list of objects waiting for a buffer */
}
}
-static inline void __stream_add_srv_conn(struct stream *sess, struct server *srv)
-{
- sess->srv_conn = srv;
- LIST_ADD(&srv->actconns, &sess->by_srv);
-}
-
static inline void stream_add_srv_conn(struct stream *sess, struct server *srv)
{
- HA_SPIN_LOCK(SERVER_LOCK, &srv->lock);
- __stream_add_srv_conn(sess, srv);
- HA_SPIN_UNLOCK(SERVER_LOCK, &srv->lock);
+ MT_LIST_ADD(&srv->actconns, &sess->by_srv);
+ HA_ATOMIC_STORE(&sess->srv_conn, srv);
}
static inline void stream_del_srv_conn(struct stream *sess)
if (!srv)
return;
- HA_SPIN_LOCK(SERVER_LOCK, &srv->lock);
- sess->srv_conn = NULL;
- LIST_DEL(&sess->by_srv);
- HA_SPIN_UNLOCK(SERVER_LOCK, &srv->lock);
+ MT_LIST_DEL(&sess->by_srv);
+ HA_ATOMIC_STORE(&sess->srv_conn, NULL);
}
static inline void stream_init_srv_conn(struct stream *sess)
{
sess->srv_conn = NULL;
- LIST_INIT(&sess->by_srv);
+ MT_LIST_INIT(&sess->by_srv);
}
static inline void stream_choose_redispatch(struct stream *s)
socket_tcp.next = NULL;
socket_tcp.proxy = &socket_proxy;
socket_tcp.obj_type = OBJ_TYPE_SERVER;
- LIST_INIT(&socket_tcp.actconns);
+ MT_LIST_INIT(&socket_tcp.actconns);
socket_tcp.pendconns = EB_ROOT;
socket_tcp.idle_conns_tree = NULL;
socket_tcp.safe_conns_tree = NULL;
socket_ssl.next = NULL;
socket_ssl.proxy = &socket_proxy;
socket_ssl.obj_type = OBJ_TYPE_SERVER;
- LIST_INIT(&socket_ssl.actconns);
+ MT_LIST_INIT(&socket_ssl.actconns);
socket_ssl.pendconns = EB_ROOT;
socket_ssl.idle_conns_tree = NULL;
socket_ssl.safe_conns_tree = NULL;
__ha_barrier_atomic_store();
if (px->lbprm.server_take_conn)
px->lbprm.server_take_conn(srv);
- __stream_add_srv_conn(p->strm, srv);
+ stream_add_srv_conn(p->strm, srv);
task_wakeup(p->strm->task, TASK_WOKEN_RES);
*/
void srv_shutdown_streams(struct server *srv, int why)
{
- struct stream *stream, *stream_bck;
+ struct stream *stream;
+ struct mt_list *elt1, elt2;
- list_for_each_entry_safe(stream, stream_bck, &srv->actconns, by_srv)
+ mt_list_for_each_entry_safe(stream, &srv->actconns, by_srv, elt1, elt2)
if (stream->srv_conn == srv)
stream_shutdown(stream, why);
}
srv->obj_type = OBJ_TYPE_SERVER;
srv->proxy = proxy;
- LIST_INIT(&srv->actconns);
+ MT_LIST_INIT(&srv->actconns);
srv->pendconns = EB_ROOT;
srv->next_state = SRV_ST_RUNNING; /* early server setup */
*/
void sess_change_server(struct stream *sess, struct server *newsrv)
{
- if (sess->srv_conn == newsrv)
+ struct server *oldsrv = sess->srv_conn;
+
+ if (oldsrv == newsrv)
return;
- if (sess->srv_conn) {
- _HA_ATOMIC_SUB(&sess->srv_conn->served, 1);
- _HA_ATOMIC_SUB(&sess->srv_conn->proxy->served, 1);
+ if (oldsrv) {
+ _HA_ATOMIC_SUB(&oldsrv->served, 1);
+ _HA_ATOMIC_SUB(&oldsrv->proxy->served, 1);
__ha_barrier_atomic_store();
- if (sess->srv_conn->proxy->lbprm.server_drop_conn) {
- HA_SPIN_LOCK(SERVER_LOCK, &sess->srv_conn->lock);
- sess->srv_conn->proxy->lbprm.server_drop_conn(sess->srv_conn);
- HA_SPIN_UNLOCK(SERVER_LOCK, &sess->srv_conn->lock);
+ if (oldsrv->proxy->lbprm.server_drop_conn) {
+ HA_SPIN_LOCK(SERVER_LOCK, &oldsrv->lock);
+ oldsrv->proxy->lbprm.server_drop_conn(oldsrv);
+ HA_SPIN_UNLOCK(SERVER_LOCK, &oldsrv->lock);
}
stream_del_srv_conn(sess);
}