BUG/MINOR: server: do not use refcount in free_server in stopping mode

Currently there is a leak at process shutdown with dynamic servers with
check/agent-check activated. Check purges are not executed on process
stopping, so the server is not liberated due to its refcount.

The solution is simply to ignore the refcount on process stopping mode
and free the server on the first free_server invocation.

This should not be backported, unless dynamic server checks are
backported. In this case, the following commit must be backported first.
  7afa5c1843
  MINOR: global: define MODE_STOPPING
This commit is contained in:
Amaury Denoyelle 2021-08-09 15:08:54 +02:00
parent 7afa5c1843
commit 13f2e2ceeb

View File

@ -2210,16 +2210,20 @@ static uint srv_release_dynsrv(struct server *srv)
return HA_ATOMIC_SUB_FETCH(&srv->refcount_dynsrv, 1);
}
/* Deallocate a server <srv> and its member. <srv> must be allocated.
/* Deallocate a server <srv> and its member. <srv> must be allocated. For
* dynamic servers, its refcount is decremented first. The free operations are
* conducted only if the refcount is nul, unless the process is stopping.
*/
void free_server(struct server *srv)
{
/* For dynamic servers, decrement the reference counter. Only free the
* server when reaching zero.
*/
if (srv->flags & SRV_F_DYNAMIC) {
if (srv_release_dynsrv(srv))
return;
if (likely(!(global.mode & MODE_STOPPING))) {
if (srv->flags & SRV_F_DYNAMIC) {
if (srv_release_dynsrv(srv))
return;
}
}
task_destroy(srv->warmup);