fix: Robust DB connection retries and move sandbox routes to admin group.

This commit is contained in:
Haitao Pan 2026-02-06 16:21:29 +08:00
parent 9169192144
commit 1bfe4f1d53
3 changed files with 41 additions and 15 deletions

View File

@ -175,4 +175,8 @@ func registerAdminRoutes(group *gin.RouterGroup, h *handler) {
admin.GET("/blacklist", h.listBlacklist)
admin.POST("/blacklist", h.addToBlacklist)
admin.DELETE("/blacklist/:email", h.removeFromBlacklist)
// Sandbox mode
admin.GET("/sandbox/binding", h.getSandboxBinding)
admin.POST("/sandbox/bind", h.bindSandboxNode)
}

View File

@ -308,9 +308,6 @@ func RegisterRoutes(r *gin.Engine, opts ...Option) {
authProtected.POST("/admin/blacklist", h.addToBlacklist)
authProtected.DELETE("/admin/blacklist/:email", h.removeFromBlacklist)
authProtected.GET("/admin/sandbox/binding", h.getSandboxBinding)
authProtected.POST("/admin/sandbox/bind", h.bindSandboxNode)
authProtected.GET("/users", h.listUsers)
// Internal routes for service-to-service reads.

View File

@ -642,9 +642,23 @@ func runServer(ctx context.Context, cfg *config.Config, logger *slog.Logger) err
MaxIdleConns: cfg.Store.MaxIdleConns,
}
st, cleanup, err := store.New(ctx, storeCfg)
// Initialize business store with retries to account for sidecar startup
var st store.Store
var cleanup func(context.Context) error
var err error
for i := 0; i < 15; i++ {
st, cleanup, err = store.New(ctx, storeCfg)
if err == nil {
break
}
if storeCfg.Driver == "" || storeCfg.Driver == "memory" {
return err
}
slog.Warn("retrying business store connection...", "attempt", i+1, "err", err)
time.Sleep(2 * time.Second)
}
if err != nil {
return err
return fmt.Errorf("business store connection failed after sidecar wait: %w", err)
}
defer func() {
if cleanup == nil {
@ -1355,19 +1369,30 @@ func openAdminSettingsDB(cfg config.Store) (*gorm.DB, func(context.Context) erro
db *gorm.DB
err error
)
switch driver {
case "", "memory":
db, err = gorm.Open(sqlite.Open("file::memory:?cache=shared"), &gorm.Config{})
case "postgres", "postgresql", "pgx":
if strings.TrimSpace(cfg.DSN) == "" {
return nil, nil, errors.New("admin settings database requires a dsn")
for i := 0; i < 15; i++ {
switch driver {
case "", "memory":
db, err = gorm.Open(sqlite.Open("file::memory:?cache=shared"), &gorm.Config{})
case "postgres", "postgresql", "pgx":
if strings.TrimSpace(cfg.DSN) == "" {
return nil, nil, errors.New("admin settings database requires a dsn")
}
db, err = gorm.Open(postgres.Open(cfg.DSN), &gorm.Config{})
default:
return nil, nil, fmt.Errorf("unsupported admin settings driver %q", cfg.Driver)
}
db, err = gorm.Open(postgres.Open(cfg.DSN), &gorm.Config{})
default:
return nil, nil, fmt.Errorf("unsupported admin settings driver %q", cfg.Driver)
if err == nil {
break
}
if driver == "" || driver == "memory" {
return nil, nil, err
}
slog.Warn("retrying admin settings db connection...", "attempt", i+1, "err", err)
time.Sleep(2 * time.Second)
}
if err != nil {
return nil, nil, err
return nil, nil, fmt.Errorf("admin settings db connection failed after sidecar wait: %w", err)
}
if err := db.AutoMigrate(&model.AdminSetting{}, &model.SandboxBinding{}); err != nil {