From 75b9d1c041c0c814f91b07b789ac997aa952a4b9 Mon Sep 17 00:00:00 2001 From: Aurelien DARRAGON Date: Tue, 24 Jan 2023 14:40:01 +0100 Subject: [PATCH] MINOR: server: add SRV_F_DELETED flag Set the SRV_F_DELETED flag when server is removed from the cli. When removing a server from the cli (in cli_parse_delete_server()), we update the "visible" server list so that the removed server is no longer part of the list. However, despite the server being removed from "visible" server list, one could still access the server data from a valid ptr (ie: srv_take()) Deleted flag helps detecting when a server is in transient removal state: that is, removed from the list, thus not visible but not yet purged from memory. --- include/haproxy/server-t.h | 1 + src/server.c | 9 +++++++++ 2 files changed, 10 insertions(+) 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;