From 87b35491a2d009a266e326f42f9a66ff31c2a57e Mon Sep 17 00:00:00 2001 From: Nikolay Govorov Date: Sun, 12 Apr 2026 15:05:40 +0100 Subject: Fix graceful shutdown --- cmd/mirum-server/server.go | 18 ++++++++++-------- cmd/mirum-server/server_web.go | 5 ++++- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/cmd/mirum-server/server.go b/cmd/mirum-server/server.go index 5b4bbf0..3201256 100644 --- a/cmd/mirum-server/server.go +++ b/cmd/mirum-server/server.go @@ -30,7 +30,6 @@ type server struct { // Close releases resources owned by the server. Call exactly once, after // all HTTP servers have finished Shutdown. func (s *server) Close() { - close(s.queue) s.db.Close() } @@ -51,24 +50,27 @@ func (s *server) PurgeSessions(ctx context.Context) { } } -func (s *server) enqueue(ev *forges.PushEvent) string { - s.taskCounter.Add(1) - id := fmt.Sprintf("task-%d", s.taskCounter.Load()) +func (s *server) enqueue(ctx context.Context, ev *forges.PushEvent) (string, error) { + id := fmt.Sprintf("task-%d", s.taskCounter.Add(1)) slog.Info("push", "repo", ev.Owner+"/"+ev.Repo, "branch", ev.Branch, "sha", ev.SHA[:8], "task", id) s.tasks.Store(id, ev) - _ = s.forge.SetStatus(context.Background(), ev, forges.StatusPending, "Queued") + _ = s.forge.SetStatus(ctx, ev, forges.StatusPending, "Queued") - s.queue <- &wirepb.Task{ + select { + case s.queue <- &wirepb.Task{ Id: id, CloneUrl: s.forge.AuthURL(ev.CloneURL), Branch: ev.Branch, Sha: ev.SHA, RepoFullName: ev.Owner + "/" + ev.Repo, + }: + return id, nil + case <-ctx.Done(): + s.tasks.Delete(id) + return "", ctx.Err() } - - return id } func (s *server) complete(ctx context.Context, taskID string, success bool, errMsg string) error { diff --git a/cmd/mirum-server/server_web.go b/cmd/mirum-server/server_web.go index 8e62e53..377284c 100644 --- a/cmd/mirum-server/server_web.go +++ b/cmd/mirum-server/server_web.go @@ -216,7 +216,10 @@ func (h *webHandler) webhook(w http.ResponseWriter, r *http.Request) { return } - h.srv.enqueue(ev) + if _, err := h.srv.enqueue(r.Context(), ev); err != nil { + http.Error(w, "server shutting down", http.StatusServiceUnavailable) + return + } w.WriteHeader(http.StatusAccepted) } -- Gilti