]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MINOR: server: add SRV_F_DELETED flag
authorAurelien DARRAGON <adarragon@haproxy.com>
Tue, 24 Jan 2023 13:40:01 +0000 (14:40 +0100)
committerChristopher Faulet <cfaulet@haproxy.com>
Wed, 5 Apr 2023 06:58:16 +0000 (08:58 +0200)
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
src/server.c

index f3f5a02f4c205f077f165f1a3dfb5590c9ad2832..ecf11e2d36fd2b47134d9bbc9eaff8119d926d3e 100644 (file)
@@ -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 */
index ade6aafd48af8373ee13ec6b97a228581a600940..6b6d867b3a08ab6d12091cb007c642d1e1834625 100644 (file)
@@ -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;