goto done;
if (conn_in_list) {
+ if (srv->cur_admin & SRV_ADMF_MAINT) {
+ /* Do not store an idle conn if server in maintenance. */
+ conn->mux->destroy(conn->ctx);
+ ret = -1;
+ goto done;
+ }
+
HA_SPIN_LOCK(IDLE_CONNS_LOCK, &idle_conns[tid].idle_conns_lock);
_srv_add_idle(srv, conn, conn_in_list == CO_FL_SAFE_LIST);
HA_SPIN_UNLOCK(IDLE_CONNS_LOCK, &idle_conns[tid].idle_conns_lock);
if (!ret && conn_in_list) {
struct server *srv = __objt_server(conn->target);
- HA_SPIN_LOCK(IDLE_CONNS_LOCK, &idle_conns[tid].idle_conns_lock);
- _srv_add_idle(srv, conn, conn_in_list == CO_FL_SAFE_LIST);
- HA_SPIN_UNLOCK(IDLE_CONNS_LOCK, &idle_conns[tid].idle_conns_lock);
+ if (!(srv->cur_admin & SRV_ADMF_MAINT)) {
+ HA_SPIN_LOCK(IDLE_CONNS_LOCK, &idle_conns[tid].idle_conns_lock);
+ _srv_add_idle(srv, conn, conn_in_list == CO_FL_SAFE_LIST);
+ HA_SPIN_UNLOCK(IDLE_CONNS_LOCK, &idle_conns[tid].idle_conns_lock);
+ }
+ else {
+ /* Do not store an idle conn if server in maintenance. */
+ goto release;
+ }
}
return t;
+
+ release:
+ fcgi_release(fconn);
+ return NULL;
}
/* callback called on any event by the connection handler.
if (!ret && conn_in_list) {
struct server *srv = __objt_server(conn->target);
- HA_SPIN_LOCK(IDLE_CONNS_LOCK, &idle_conns[tid].idle_conns_lock);
- _srv_add_idle(srv, conn, conn_in_list == CO_FL_SAFE_LIST);
- HA_SPIN_UNLOCK(IDLE_CONNS_LOCK, &idle_conns[tid].idle_conns_lock);
+ if (!(srv->cur_admin & SRV_ADMF_MAINT)) {
+ HA_SPIN_LOCK(IDLE_CONNS_LOCK, &idle_conns[tid].idle_conns_lock);
+ _srv_add_idle(srv, conn, conn_in_list == CO_FL_SAFE_LIST);
+ HA_SPIN_UNLOCK(IDLE_CONNS_LOCK, &idle_conns[tid].idle_conns_lock);
+ }
+ else {
+ /* Do not store an idle conn if server in maintenance. */
+ goto release;
+ }
}
return t;
+
+ release:
+ h1_release(h1c);
+ return NULL;
}
static int h1_wake(struct connection *conn)
if (!ret && conn_in_list) {
struct server *srv = __objt_server(conn->target);
- HA_SPIN_LOCK(IDLE_CONNS_LOCK, &idle_conns[tid].idle_conns_lock);
- _srv_add_idle(srv, conn, conn_in_list == CO_FL_SAFE_LIST);
- HA_SPIN_UNLOCK(IDLE_CONNS_LOCK, &idle_conns[tid].idle_conns_lock);
+ if (!(srv->cur_admin & SRV_ADMF_MAINT)) {
+ HA_SPIN_LOCK(IDLE_CONNS_LOCK, &idle_conns[tid].idle_conns_lock);
+ _srv_add_idle(srv, conn, conn_in_list == CO_FL_SAFE_LIST);
+ HA_SPIN_UNLOCK(IDLE_CONNS_LOCK, &idle_conns[tid].idle_conns_lock);
+ }
+ else {
+ /* Do not store an idle conn if server in maintenance. */
+ goto release;
+ }
}
-leave:
+ leave:
TRACE_LEAVE(H2_EV_H2C_WAKE);
return t;
+
+ release:
+ TRACE_LEAVE(H2_EV_H2C_WAKE);
+ h2_release(h2c);
+ return NULL;
}
/* callback called on any event by the connection handler.
if (!ret && conn_in_list) {
struct server *srv = __objt_server(conn->target);
- HA_SPIN_LOCK(IDLE_CONNS_LOCK, &idle_conns[tid].idle_conns_lock);
- _srv_add_idle(srv, conn, conn_in_list == CO_FL_SAFE_LIST);
- HA_SPIN_UNLOCK(IDLE_CONNS_LOCK, &idle_conns[tid].idle_conns_lock);
+ if (!(srv->cur_admin & SRV_ADMF_MAINT)) {
+ HA_SPIN_LOCK(IDLE_CONNS_LOCK, &idle_conns[tid].idle_conns_lock);
+ _srv_add_idle(srv, conn, conn_in_list == CO_FL_SAFE_LIST);
+ HA_SPIN_UNLOCK(IDLE_CONNS_LOCK, &idle_conns[tid].idle_conns_lock);
+ }
+ else {
+ /* Do not store an idle conn if server in maintenance. */
+ goto release;
+ }
}
return t;
+
+ release:
+ spop_release(spop_conn);
+ return NULL;
}
/* callback called on any event by the connection handler.
*/
if (!(conn->flags & CO_FL_PRIVATE) &&
srv && srv->pool_purge_delay > 0 &&
+ !(srv->cur_admin & SRV_ADMF_MAINT) &&
((srv->proxy->options & PR_O_REUSE_MASK) != PR_O_REUSE_NEVR) &&
ha_used_fds < global.tune.pool_high_count &&
(srv->max_idle_conns == -1 || srv->max_idle_conns > srv->curr_idle_conns) &&
#endif
leave:
if (!ret && conn_in_list) {
- struct server *srv = objt_server(conn->target);
+ struct server *srv = __objt_server(conn->target);
- TRACE_DEVEL("adding conn back to idle list", SSL_EV_CONN_IO_CB, conn);
- HA_SPIN_LOCK(IDLE_CONNS_LOCK, &idle_conns[tid].idle_conns_lock);
- _srv_add_idle(srv, conn, conn_in_list == CO_FL_SAFE_LIST);
- HA_SPIN_UNLOCK(IDLE_CONNS_LOCK, &idle_conns[tid].idle_conns_lock);
+ if (!(srv->cur_admin & SRV_ADMF_MAINT)) {
+ TRACE_DEVEL("adding conn back to idle list", SSL_EV_CONN_IO_CB, conn);
+ HA_SPIN_LOCK(IDLE_CONNS_LOCK, &idle_conns[tid].idle_conns_lock);
+ _srv_add_idle(srv, conn, conn_in_list == CO_FL_SAFE_LIST);
+ HA_SPIN_UNLOCK(IDLE_CONNS_LOCK, &idle_conns[tid].idle_conns_lock);
+ }
+ else {
+ /* Do not store an idle conn if server in maintenance. */
+
+ /* Connection is idle which means MUX layer is already initialized. */
+ BUG_ON(!conn->mux);
+ conn->mux->destroy(conn->ctx);
+ t = NULL;
+ }
}
TRACE_LEAVE(SSL_EV_CONN_IO_CB, conn);
return t;