aboutsummaryrefslogtreecommitdiff
path: root/forged/internal/server/server.go
diff options
context:
space:
mode:
authorRunxi Yu <me@runxiyu.org>2025-08-17 04:48:47 +0800
committerRunxi Yu <me@runxiyu.org>2025-08-17 05:22:09 +0800
commitb6dd3ffce416fa86c223fad5d2f6c3db5d5727e4 (patch)
treef3cc533b1ef5184ee881d9d0103a47ec7f09bd34 /forged/internal/server/server.go
parentAdd shutdown timeouts (diff)
downloadforge-b6dd3ffce416fa86c223fad5d2f6c3db5d5727e4.tar.gz
forge-b6dd3ffce416fa86c223fad5d2f6c3db5d5727e4.tar.zst
forge-b6dd3ffce416fa86c223fad5d2f6c3db5d5727e4.zip
A few other context fixes
Diffstat (limited to 'forged/internal/server/server.go')
-rw-r--r--forged/internal/server/server.go54
1 files changed, 10 insertions, 44 deletions
diff --git a/forged/internal/server/server.go b/forged/internal/server/server.go
index 472df7a..ab677e0 100644
--- a/forged/internal/server/server.go
+++ b/forged/internal/server/server.go
@@ -10,6 +10,7 @@ import (
"go.lindenii.runxiyu.org/forge/forged/internal/incoming/lmtp"
"go.lindenii.runxiyu.org/forge/forged/internal/incoming/ssh"
"go.lindenii.runxiyu.org/forge/forged/internal/incoming/web"
+ "golang.org/x/sync/errgroup"
)
type Server struct {
@@ -51,57 +52,22 @@ func (server *Server) Run(ctx context.Context) (err error) {
// TODO: Not running git2d because it should be run separately.
// This needs to be documented somewhere, hence a TODO here for now.
- subCtx, cancel := context.WithCancel(ctx)
- defer cancel()
+ g, gctx := errgroup.WithContext(ctx)
- server.database, err = database.Open(subCtx, server.config.DB)
+ server.database, err = database.Open(gctx, server.config.DB)
if err != nil {
return fmt.Errorf("open database: %w", err)
}
+ defer server.database.Close()
- errCh := make(chan error)
+ g.Go(func() error { return server.hookServer.Run(gctx) })
+ g.Go(func() error { return server.lmtpServer.Run(gctx) })
+ g.Go(func() error { return server.webServer.Run(gctx) })
+ g.Go(func() error { return server.sshServer.Run(gctx) })
- go func() {
- if err := server.hookServer.Run(subCtx); err != nil {
- select {
- case errCh <- err:
- default:
- }
- }
- }()
-
- go func() {
- if err := server.lmtpServer.Run(subCtx); err != nil {
- select {
- case errCh <- err:
- default:
- }
- }
- }()
-
- go func() {
- if err := server.webServer.Run(subCtx); err != nil {
- select {
- case errCh <- err:
- default:
- }
- }
- }()
-
- go func() {
- if err := server.sshServer.Run(subCtx); err != nil {
- select {
- case errCh <- err:
- default:
- }
- }
- }()
-
- select {
- case err := <-errCh:
+ if err := g.Wait(); err != nil {
return fmt.Errorf("server error: %w", err)
- case <-ctx.Done():
}
- return nil
+ return ctx.Err()
}