1
0
Fork 0

fix: return a proper error from Node.Join()

This commit is contained in:
Arthur K. 2026-01-19 18:41:27 +03:00
parent fa9cbe6d5c
commit 27edc01912
Signed by: wzray
GPG key ID: B97F30FDC4636357

View file

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