flamenco/internal/worker/state_offline.go
Sybren A. Stüvel 1355ec5e1d Worker: Change how the worker shuts down
Instead of sending the current process an interrupt signal, use a dedicated
channel to signal the wish to shut down. The main function responds to that
channel closing by performing the shutdown.

This solves an issue where the Worker would not cleanly shut down on
Windows when `offline` state was requested by the Manager.
2022-08-12 11:15:19 -07:00

49 lines
1.3 KiB
Go

package worker
// SPDX-License-Identifier: GPL-3.0-or-later
import (
"context"
"github.com/rs/zerolog"
"github.com/rs/zerolog/log"
"git.blender.org/flamenco/pkg/api"
)
func (w *Worker) gotoStateOffline(context.Context) {
w.stateMutex.Lock()
defer w.stateMutex.Unlock()
w.state = api.WorkerStatusOffline
// Signal that the Worker should shut down.
log.Debug().Msg("closing the shutdown channel")
close(w.shutdown)
}
// SignOff forces the worker in shutdown state and acknlowedges this to the Manager.
// Does NOT actually peform a shutdown; is intended to be called while shutdown is in progress.
func (w *Worker) SignOff(ctx context.Context) {
w.stateMutex.Lock()
w.state = api.WorkerStatusOffline
logger := log.With().Str("state", string(w.state)).Logger()
w.stateMutex.Unlock()
logger.Info().Msg("signing off at Manager")
SignOff(ctx, logger, w.client)
}
// SignOff sends a signoff request to the Manager.
// Any error is logged but not returned.
func SignOff(ctx context.Context, logger zerolog.Logger, client FlamencoClient) {
resp, err := client.SignOffWithResponse(ctx)
switch {
case err != nil:
logger.Error().Err(err).Msg("unable to sign off at Manager")
case resp.JSONDefault != nil:
logger.Error().Interface("error", resp.JSONDefault).Msg("error received when signing off at Manager")
}
}