fix: non-blocking loader with retry backoff, 30s timeout
This commit is contained in:
+3
-6
@@ -52,12 +52,9 @@ func main() {
|
|||||||
if l, err := serviceadapter.NewLoader(registry, "api"); err != nil {
|
if l, err := serviceadapter.NewLoader(registry, "api"); err != nil {
|
||||||
log.Printf("ServiceAdapter loader disabled: %v", err)
|
log.Printf("ServiceAdapter loader disabled: %v", err)
|
||||||
} else {
|
} else {
|
||||||
if err := l.Start(30 * time.Second); err != nil {
|
l.Start(30 * time.Second)
|
||||||
log.Printf("ServiceAdapter loader failed: %v", err)
|
loader = l
|
||||||
} else {
|
log.Printf("ServiceAdapter loader started (background)")
|
||||||
loader = l
|
|
||||||
log.Printf("ServiceAdapter loader started")
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
router := server.NewRouter(healthChecker, dispatcher, temporalHandler, upstreamHandler)
|
router := server.NewRouter(healthChecker, dispatcher, temporalHandler, upstreamHandler)
|
||||||
|
|||||||
@@ -54,7 +54,7 @@ func NewLoader(registry *Registry, namespace string) (*Loader, error) {
|
|||||||
token: string(tokenBytes),
|
token: string(tokenBytes),
|
||||||
baseURL: "https://kubernetes.default.svc",
|
baseURL: "https://kubernetes.default.svc",
|
||||||
client: &http.Client{
|
client: &http.Client{
|
||||||
Timeout: 10 * time.Second,
|
Timeout: 30 * time.Second,
|
||||||
Transport: &http.Transport{
|
Transport: &http.Transport{
|
||||||
TLSClientConfig: &tls.Config{RootCAs: pool},
|
TLSClientConfig: &tls.Config{RootCAs: pool},
|
||||||
},
|
},
|
||||||
@@ -63,19 +63,22 @@ func NewLoader(registry *Registry, namespace string) (*Loader, error) {
|
|||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Start loads ServiceAdapters immediately, then polls every interval.
|
// Start begins loading ServiceAdapters in the background. Non-blocking.
|
||||||
func (l *Loader) Start(interval time.Duration) error {
|
// Retries on failure so the gateway can start serving immediately.
|
||||||
if err := l.load(); err != nil {
|
func (l *Loader) Start(interval time.Duration) {
|
||||||
// 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
|
|
||||||
go func() {
|
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)
|
ticker := time.NewTicker(interval)
|
||||||
defer ticker.Stop()
|
defer ticker.Stop()
|
||||||
for {
|
for {
|
||||||
@@ -89,8 +92,6 @@ func (l *Loader) Start(interval time.Duration) error {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Stop stops the background poll.
|
// Stop stops the background poll.
|
||||||
|
|||||||
Reference in New Issue
Block a user