diff --git a/internal/servers/controller/controller.go b/internal/servers/controller/controller.go index 35144a5258..76e80816f7 100644 --- a/internal/servers/controller/controller.go +++ b/internal/servers/controller/controller.go @@ -315,6 +315,11 @@ func (c *Controller) Start() error { if err := c.startListeners(); err != nil { return fmt.Errorf("error starting controller listeners: %w", err) } + + // Upsert server before starting tickers and scheduler to ensure the server exists + if err := c.upsertServer(c.baseContext); err != nil { + return fmt.Errorf("error upserting server: %w", err) + } if err := c.scheduler.Start(c.baseContext, c.schedulerWg); err != nil { return fmt.Errorf("error starting scheduler: %w", err) } diff --git a/internal/servers/controller/tickers.go b/internal/servers/controller/tickers.go index 8b93b5e0d1..749195f50b 100644 --- a/internal/servers/controller/tickers.go +++ b/internal/servers/controller/tickers.go @@ -5,6 +5,7 @@ import ( "math/rand" "time" + "github.com/hashicorp/boundary/internal/errors" "github.com/hashicorp/boundary/internal/observability/event" "github.com/hashicorp/boundary/internal/servers" "github.com/hashicorp/boundary/internal/types/resource" @@ -29,28 +30,36 @@ func (c *Controller) startStatusTicking(cancelCtx context.Context) { return case <-timer.C: - server := &servers.Server{ - PrivateId: c.conf.RawConfig.Controller.Name, - Name: c.conf.RawConfig.Controller.Name, - Type: resource.Controller.String(), - Description: c.conf.RawConfig.Controller.Description, - Address: c.conf.RawConfig.Controller.PublicClusterAddr, - } - repo, err := c.ServersRepoFn() - if err != nil { + if err := c.upsertServer(cancelCtx); err != nil { event.WriteError(cancelCtx, op, err, event.WithInfoMsg("error fetching repository for status update")) - } else { - _, _, err = repo.UpsertServer(cancelCtx, server) - if err != nil { - event.WriteError(cancelCtx, op, err, event.WithInfoMsg("error performing status update")) - } else { - } } timer.Reset(statusInterval) } } } +func (c *Controller) upsertServer(ctx context.Context) error { + const op = "controller.(Controller).upsertServer" + server := &servers.Server{ + PrivateId: c.conf.RawConfig.Controller.Name, + Name: c.conf.RawConfig.Controller.Name, + Type: resource.Controller.String(), + Description: c.conf.RawConfig.Controller.Description, + Address: c.conf.RawConfig.Controller.PublicClusterAddr, + } + repo, err := c.ServersRepoFn() + if err != nil { + return errors.Wrap(ctx, err, op, errors.WithMsg("error fetching repository for status update")) + } + + _, _, err = repo.UpsertServer(ctx, server) + if err != nil { + return errors.Wrap(ctx, err, op, errors.WithMsg("error performing status update")) + } + + return nil +} + func (c *Controller) startNonceCleanupTicking(cancelCtx context.Context) { const op = "controller.(Controller).startNonceCleanupTicking" timer := time.NewTimer(0)