MEDIUM: listener: let do_unbind_listener() decide whether to close or not

The listener contains all the information needed to decide to close on
unbind or not. The rule is the following (when we're not stopping):

  - worker process unbinding from a worker's FD with socket transfer enabled => keep
  - master process unbinding from a master's inherited FD => keep
  - master process unbinding from a master's FD => close
  - master process unbinding from a worker's FD => close
  - worker process unbinding from a master's FD => close
  - worker process unbinding from a worker's FD => close

Let's translate that into the function and stop using the do_close
argument that is a bit obscure for callers. It was not yet removed
to ease code testing.
This commit is contained in:
Willy Tarreau 2020-10-09 15:47:17 +02:00
parent 87acd4e848
commit 374e9af358

View File

@ -581,14 +581,32 @@ void do_unbind_listener(struct listener *listener, int do_close)
}
out_close:
if (do_close) {
listener->rx.flags &= ~RX_F_BOUND;
if (listener->rx.fd != -1)
fd_delete(listener->rx.fd);
listener->rx.fd = -1;
if (listener->state > LI_ASSIGNED)
listener_set_state(listener, LI_ASSIGNED);
}
/* There are a number of situations where we prefer to keep the FD and
* not to close it (unless we're stopping, of course):
* - worker process unbinding from a worker's FD with socket transfer enabled => keep
* - master process unbinding from a master's inherited FD => keep
* - master process unbinding from a master's FD => close
* - master process unbinding from a worker's FD => close
* - worker process unbinding from a master's FD => close
* - worker process unbinding from a worker's FD => close
*/
if (!stopping && !master &&
!(listener->options & LI_O_MWORKER) &&
(global.tune.options & GTUNE_SOCKET_TRANSFER))
return;
if (!stopping && master &&
listener->options & LI_O_MWORKER &&
listener->rx.flags & RX_F_INHERITED)
return;
listener->rx.flags &= ~RX_F_BOUND;
if (listener->rx.fd != -1)
fd_delete(listener->rx.fd);
listener->rx.fd = -1;
if (listener->state > LI_ASSIGNED)
listener_set_state(listener, LI_ASSIGNED);
}
/* This function closes the listening socket for the specified listener,