diff --git a/internal/roles/node/node.go b/internal/roles/node/node.go index 762ae4b..5bc113e 100644 --- a/internal/roles/node/node.go +++ b/internal/roles/node/node.go @@ -3,6 +3,7 @@ package node import ( "context" "errors" + "fmt" "sync" "time" @@ -14,14 +15,14 @@ import ( ) type Role struct { - state *state.RuntimeState + state *state.RuntimeState keepaliveGroup sync.WaitGroup - config config.NodeConfig + config config.NodeConfig } func New(state *state.RuntimeState, config config.NodeConfig) *Role { return &Role{ - state: state, + state: state, config: config, } } @@ -40,25 +41,28 @@ func (r *Role) Join(bootstrap string) error { return errors.New("no masters configured") } + var errs []error for m := range masters { logger := log.With().Str("host", m).Logger() logger.Debug().Msg("trying to join via master") nodes, err := client.Post[[]types.Node](m, "/master/join", r.state.Self) if err != nil { + errs = append(errs, err) logger.Debug().Err(err).Msg("unable to join") continue } if err := r.state.Registry.Set(*nodes); err != nil { logger.Debug().Err(err).Msg("unable to set master's nodes") + errs = append(errs, err) continue } return nil } - return errors.New("unable to join") + return fmt.Errorf("unable to join with any master: %w", errors.Join(errs...)) } func (r *Role) Leave() error { @@ -67,7 +71,7 @@ func (r *Role) Leave() error { return nil } - sent := false + var errs []error for _, m := range masters { logger := log.With().Str("name", m.Hostname).Logger() logger.Debug().Msg("sending leave message") @@ -75,19 +79,15 @@ func (r *Role) Leave() error { _, err := client.Post[any](m.Endpoint, types.PathMasterLeave, r.state.Self) if err != nil { logger.Debug().Err(err).Msg("unable to send leave message") + errs = append(errs, err) continue } else { - sent = true logger.Debug().Msg("leave message sent") - break + return nil } } - if !sent { - return errors.New("unable to send leave message") - } - - return nil + return fmt.Errorf("unable to send leave message to any master: %w", errors.Join(errs...)) } func (r *Role) OnStartup(ctx context.Context) error {