From 91f28a8fa20db2435bec18d9084bb4d8fd1ffdd1 Mon Sep 17 00:00:00 2001 From: Ayman Bagabas Date: Thu, 3 Jul 2025 10:06:08 -0400 Subject: [PATCH] fix(server): properly handle server shutdown --- cmd/soft/serve/serve.go | 11 ++++++++--- pkg/daemon/daemon.go | 13 ++++++++++--- 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/cmd/soft/serve/serve.go b/cmd/soft/serve/serve.go index a8546abbe3b4ff9f782448eb922d3531932bdf5b..8a670cc95863d779300eba7fa2f7ae0f47b8d4c6 100644 --- a/cmd/soft/serve/serve.go +++ b/cmd/soft/serve/serve.go @@ -107,7 +107,13 @@ var ( doneOnce() }() - <-done + select { + case err := <-lch: + if err != nil { + return fmt.Errorf("server error: %w", err) + } + case <-done: + } ctx, cancel := context.WithTimeout(ctx, 5*time.Second) defer cancel() @@ -115,8 +121,7 @@ var ( return err } - // wait for serve to finish - return <-lch + return nil }, } ) diff --git a/pkg/daemon/daemon.go b/pkg/daemon/daemon.go index a5156355e3362162ca8f958b232a4e5709c79751..2f7fd77e040eb8fb797e01481d61b32afd94bfb7 100644 --- a/pkg/daemon/daemon.go +++ b/pkg/daemon/daemon.go @@ -321,11 +321,18 @@ func (d *GitDaemon) closeListener() error { if d.done.Load() { return ErrServerClosed } + var err error + for _, l := range d.listeners { + if err = l.Close(); err != nil { + err = errors.Join(err, fmt.Errorf("close listener %s: %w", l.Addr(), err)) + } + } + d.listeners = d.listeners[:0] d.once.Do(func() { - close(d.finished) d.done.Store(true) + close(d.finished) }) - return nil + return err } // Shutdown gracefully shuts down the daemon. @@ -337,8 +344,8 @@ func (d *GitDaemon) Shutdown(ctx context.Context) error { err := d.closeListener() finished := make(chan struct{}, 1) go func() { + defer close(finished) d.wg.Wait() - finished <- struct{}{} }() select { case <-ctx.Done():