fix(repository): allow eight transient database retries

This commit is contained in:
ice breaker
2026-08-31 17:10:31 +08:00
parent 863667ce67
commit b6a7b8b7df
2 changed files with 21 additions and 24 deletions
+19 -22
View File
@@ -22,9 +22,9 @@ import (
)
const (
maxDatabaseInitializationAttempts = 8
databaseInitializationRetryBase = time.Second
databaseInitializationRetryMax = 30 * time.Second
maxDatabaseInitializationRetries = 8
databaseInitializationRetryBase = time.Second
databaseInitializationRetryMax = 30 * time.Second
)
// initializeDatabaseWithRetry retries only errors that indicate PostgreSQL is
@@ -39,32 +39,29 @@ func initializeDatabaseWithRetryWithWait(
initialize func(context.Context) error,
wait func(context.Context, time.Duration) error,
) error {
var lastErr error
for attempt := 1; attempt <= maxDatabaseInitializationAttempts; attempt++ {
for attempt := 1; ; attempt++ {
if err := initialize(ctx); err == nil {
return nil
} else {
lastErr = err
if !isTransientDatabaseInitializationError(err) || attempt == maxDatabaseInitializationAttempts {
if !isTransientDatabaseInitializationError(err) || attempt > maxDatabaseInitializationRetries {
return err
}
delay := databaseInitializationRetryBase * time.Duration(1<<(attempt-1))
if delay > databaseInitializationRetryMax {
delay = databaseInitializationRetryMax
}
slog.Warn("database initialization temporarily unavailable; retrying",
"retry", attempt,
"max_retries", maxDatabaseInitializationRetries,
"retry_in", delay,
"error", err,
)
if err := wait(ctx, delay); err != nil {
return err
}
}
delay := databaseInitializationRetryBase * time.Duration(1<<(attempt-1))
if delay > databaseInitializationRetryMax {
delay = databaseInitializationRetryMax
}
slog.Warn("database initialization temporarily unavailable; retrying",
"attempt", attempt,
"max_attempts", maxDatabaseInitializationAttempts,
"retry_in", delay,
"error", lastErr,
)
if err := wait(ctx, delay); err != nil {
return err
}
}
return lastErr
}
func waitForDatabaseInitializationRetry(ctx context.Context, delay time.Duration) error {
@@ -99,8 +99,8 @@ func TestInitializeDatabaseWithRetryReturnsLastErrorAfterLimit(t *testing.T) {
})
require.ErrorIs(t, err, lastErr)
require.Equal(t, maxDatabaseInitializationAttempts, attempts)
require.Len(t, delays, maxDatabaseInitializationAttempts-1)
require.Equal(t, maxDatabaseInitializationRetries+1, attempts)
require.Len(t, delays, maxDatabaseInitializationRetries)
require.Equal(t, databaseInitializationRetryMax, delays[len(delays)-1])
}