diff --git a/include/haproxy/server-t.h b/include/haproxy/server-t.h index f3f5a02f4..ecf11e2d3 100644 --- a/include/haproxy/server-t.h +++ b/include/haproxy/server-t.h @@ -150,6 +150,7 @@ enum srv_initaddr { #define SRV_F_DYNAMIC 0x1000 /* dynamic server instantiated at runtime */ #define SRV_F_NON_PURGEABLE 0x2000 /* this server cannot be removed at runtime */ #define SRV_F_DEFSRV_USE_SSL 0x4000 /* default-server uses SSL */ +#define SRV_F_DELETED 0x8000 /* srv is deleted but not yet purged */ /* configured server options for send-proxy (server->pp_opts) */ #define SRV_PP_V1 0x0001 /* proxy protocol version 1 */ diff --git a/src/server.c b/src/server.c index ade6aafd4..6b6d867b3 100644 --- a/src/server.c +++ b/src/server.c @@ -5107,6 +5107,15 @@ static int cli_parse_delete_server(char **args, char *payload, struct appctx *ap /* remove srv from idle_node tree for idle conn cleanup */ eb32_delete(&srv->idle_node); + /* flag the server as deleted + * (despite the server being removed from primary server list, + * one could still access the server data from a valid ptr) + * Deleted flag helps detecting when a server is in transient removal + * state. + * ie: removed from the list but not yet freed/purged from memory. + */ + srv->flags |= SRV_F_DELETED; + /* set LSB bit (odd bit) for reuse_cnt */ srv_id_reuse_cnt |= 1;