diff --git a/cmd/gateway/main.go b/cmd/gateway/main.go index 3783b89..21ad81d 100644 --- a/cmd/gateway/main.go +++ b/cmd/gateway/main.go @@ -52,12 +52,9 @@ func main() { if l, err := serviceadapter.NewLoader(registry, "api"); err != nil { log.Printf("ServiceAdapter loader disabled: %v", err) } else { - if err := l.Start(30 * time.Second); err != nil { - log.Printf("ServiceAdapter loader failed: %v", err) - } else { - loader = l - log.Printf("ServiceAdapter loader started") - } + l.Start(30 * time.Second) + loader = l + log.Printf("ServiceAdapter loader started (background)") } router := server.NewRouter(healthChecker, dispatcher, temporalHandler, upstreamHandler) diff --git a/internal/serviceadapter/informer.go b/internal/serviceadapter/informer.go index 81090af..1ca2e24 100644 --- a/internal/serviceadapter/informer.go +++ b/internal/serviceadapter/informer.go @@ -54,7 +54,7 @@ func NewLoader(registry *Registry, namespace string) (*Loader, error) { token: string(tokenBytes), baseURL: "https://kubernetes.default.svc", client: &http.Client{ - Timeout: 10 * time.Second, + Timeout: 30 * time.Second, Transport: &http.Transport{ TLSClientConfig: &tls.Config{RootCAs: pool}, }, @@ -63,19 +63,22 @@ func NewLoader(registry *Registry, namespace string) (*Loader, error) { }, nil } -// Start loads ServiceAdapters immediately, then polls every interval. -func (l *Loader) Start(interval time.Duration) error { - if err := l.load(); err != nil { - // Retry once after 2s — handles transient "storage reinitializing" (429) - log.Printf("serviceadapter loader: first attempt failed (%v), retrying in 2s", err) - time.Sleep(2 * time.Second) - if err := l.load(); err != nil { - return fmt.Errorf("serviceadapter loader: %w", err) - } - } - - // Background poll for changes +// Start begins loading ServiceAdapters in the background. Non-blocking. +// Retries on failure so the gateway can start serving immediately. +func (l *Loader) Start(interval time.Duration) { go func() { + // Initial load with retries (API server may be slow on startup) + for attempt := 1; ; attempt++ { + if err := l.load(); err != nil { + backoff := time.Duration(min(attempt*5, 30)) * time.Second + log.Printf("serviceadapter loader: attempt %d failed (%v), retry in %s", attempt, err, backoff) + time.Sleep(backoff) + continue + } + break + } + + // Poll for changes ticker := time.NewTicker(interval) defer ticker.Stop() for { @@ -89,8 +92,6 @@ func (l *Loader) Start(interval time.Duration) error { } } }() - - return nil } // Stop stops the background poll.