91f28a8fa20db2435bec18d9084bb4d8fd1ffdd1

Author
Ayman Bagabas <ayman.bagabas@gmail.com>
Committer
Ayman Bagabas <ayman.bagabas@gmail.com>
Date

Message

fix(server): properly handle server shutdown

Diff

 1diff --git a/cmd/soft/serve/serve.go b/cmd/soft/serve/serve.go
 2index a8546abbe3b4ff9f782448eb922d3531932bdf5b..8a670cc95863d779300eba7fa2f7ae0f47b8d4c6 100644
 3--- a/cmd/soft/serve/serve.go
 4+++ b/cmd/soft/serve/serve.go
 5@@ -107,7 +107,13 @@ var (
 6 				doneOnce()
 7 			}()
 8 
 9-			<-done
10+			select {
11+			case err := <-lch:
12+				if err != nil {
13+					return fmt.Errorf("server error: %w", err)
14+				}
15+			case <-done:
16+			}
17 
18 			ctx, cancel := context.WithTimeout(ctx, 5*time.Second)
19 			defer cancel()
20@@ -115,8 +121,7 @@ var (
21 				return err
22 			}
23 
24-			// wait for serve to finish
25-			return <-lch
26+			return nil
27 		},
28 	}
29 )
30diff --git a/pkg/daemon/daemon.go b/pkg/daemon/daemon.go
31index a5156355e3362162ca8f958b232a4e5709c79751..2f7fd77e040eb8fb797e01481d61b32afd94bfb7 100644
32--- a/pkg/daemon/daemon.go
33+++ b/pkg/daemon/daemon.go
34@@ -321,11 +321,18 @@ func (d *GitDaemon) closeListener() error {
35 	if d.done.Load() {
36 		return ErrServerClosed
37 	}
38+	var err error
39+	for _, l := range d.listeners {
40+		if err = l.Close(); err != nil {
41+			err = errors.Join(err, fmt.Errorf("close listener %s: %w", l.Addr(), err))
42+		}
43+	}
44+	d.listeners = d.listeners[:0]
45 	d.once.Do(func() {
46-		close(d.finished)
47 		d.done.Store(true)
48+		close(d.finished)
49 	})
50-	return nil
51+	return err
52 }
53 
54 // Shutdown gracefully shuts down the daemon.
55@@ -337,8 +344,8 @@ func (d *GitDaemon) Shutdown(ctx context.Context) error {
56 	err := d.closeListener()
57 	finished := make(chan struct{}, 1)
58 	go func() {
59+		defer close(finished)
60 		d.wg.Wait()
61-		finished <- struct{}{}
62 	}()
63 	select {
64 	case <-ctx.Done():