diff --git a/internal/natsbus/server.go b/internal/natsbus/server.go index 3345004..4fb5280 100644 --- a/internal/natsbus/server.go +++ b/internal/natsbus/server.go @@ -7,6 +7,7 @@ import ( "context" "fmt" "log/slog" + "os" "time" natsserver "github.com/nats-io/nats-server/v2/server" @@ -64,10 +65,23 @@ func Start(cfg Config) (*Server, error) { // Start server in background go ns.Start() - // Wait for server to be ready + // Wait for server to be ready. If it fails (stale lock files, corrupt + // store), clean the data directory and retry once. if !ns.ReadyForConnections(10 * time.Second) { ns.Shutdown() - return nil, fmt.Errorf("NATS server failed to start within 10s") + slog.Warn("NATS server failed to start, cleaning store and retrying", "dataDir", cfg.DataDir) + os.RemoveAll(cfg.DataDir) + os.MkdirAll(cfg.DataDir, 0755) + + ns, err = natsserver.NewServer(opts) + if err != nil { + return nil, fmt.Errorf("creating NATS server (retry): %w", err) + } + go ns.Start() + if !ns.ReadyForConnections(10 * time.Second) { + ns.Shutdown() + return nil, fmt.Errorf("NATS server failed to start after retry") + } } slog.Info("NATS JetStream server started", "port", cfg.Port, "dataDir", cfg.DataDir)