[PATCH 2/6] virNetDaemonAutoShutdown: Allow live update of shutdown timeout

Michal Prívozník mprivozn at redhat.com
Thu Jun 16 12:59:22 UTC 2022


On 6/13/22 15:56, Peter Krempa wrote:
> Modify the code so that calling 'virNetDaemonAutoShutdown' will update
> the auto shutdown timeout also for running daemons.
> 
> This involves changing the logic when to do the update of the timer so
> that it can be called from both when the daemon is not yet runnign and
> when doing a live update.
> 
> Signed-off-by: Peter Krempa <pkrempa at redhat.com>
> ---
>  src/locking/lock_daemon.c  |  5 ++---
>  src/logging/log_daemon.c   |  5 ++---
>  src/remote/remote_daemon.c |  4 ++--
>  src/rpc/virnetdaemon.c     | 29 +++++++++++++++++++++--------
>  src/rpc/virnetdaemon.h     |  4 ++--
>  5 files changed, 29 insertions(+), 18 deletions(-)
> 


> diff --git a/src/rpc/virnetdaemon.c b/src/rpc/virnetdaemon.c
> index 7bf27eed9d..84af1adc06 100644
> --- a/src/rpc/virnetdaemon.c
> +++ b/src/rpc/virnetdaemon.c
> @@ -75,6 +75,7 @@ struct _virNetDaemon {
>      bool finished;
>      bool graceful;
>      bool execRestart;
> +    bool running; /* the daemon has reached the running phase */
> 
>      unsigned int autoShutdownTimeout;
>      int autoShutdownTimerID;
> @@ -424,7 +425,7 @@ virNetDaemonAutoShutdownTimer(int timerid G_GNUC_UNUSED,
>  static int
>  virNetDaemonShutdownTimerRegister(virNetDaemon *dmn)
>  {
> -    if (dmn->autoShutdownTimeout == 0)
> +    if (dmn->autoShutdownTimerID != -1)
>          return 0;
> 
>      if ((dmn->autoShutdownTimerID = virEventAddTimeout(-1,
> @@ -442,7 +443,7 @@ virNetDaemonShutdownTimerRegister(virNetDaemon *dmn)
>  static void
>  virNetDaemonShutdownTimerUpdate(virNetDaemon *dmn)
>  {
> -    if (dmn->autoShutdownTimeout == 0)
> +    if (dmn->autoShutdownTimerID == -1)
>          return;
> 
>      /* A shutdown timeout is specified, so check
> @@ -450,13 +451,15 @@ virNetDaemonShutdownTimerUpdate(virNetDaemon *dmn)
>       * shutdown after timeout seconds
>       */
>      if (dmn->autoShutdownTimerActive) {
> -        if (virNetDaemonHasClients(dmn)) {
> +        if (virNetDaemonHasClients(dmn) ||
> +            dmn->autoShutdownTimeout == 0) {

Here the logical OR makes sense, because either of the conditions has to
lead to timer deactivation, however ...

>              VIR_DEBUG("Deactivating shutdown timer %d", dmn->autoShutdownTimerID);
>              virEventUpdateTimeout(dmn->autoShutdownTimerID, -1);
>              dmn->autoShutdownTimerActive = false;
>          }
>      } else {
> -        if (!virNetDaemonHasClients(dmn)) {
> +        if (!virNetDaemonHasClients(dmn) ||
> +            dmn->autoShutdownTimeout != 0) {

... here both conditions have to be met. Otherwise setting timeout to 0
and disconnecting the last client will lead to immediate quit of the daemon.

Michal



More information about the libvir-list mailing list