mirror of
https://github.com/coder/coder.git
synced 2025-07-15 22:20:27 +00:00
fix: Use sync.WaitGroup to await hijacked HTTP connections (#337)
WebSockets hijack the HTTP connection from the server, causing server.Close() to not wait for these connections to fully cleanup. This adds a global wait-group to the coderd API, which ensures all WebSocket HTTP handlers have properly exited before returning.
This commit is contained in:
@ -33,7 +33,7 @@ func Root() *cobra.Command {
|
||||
Use: "coderd",
|
||||
RunE: func(cmd *cobra.Command, args []string) error {
|
||||
logger := slog.Make(sloghuman.Sink(os.Stderr))
|
||||
handler := coderd.New(&coderd.Options{
|
||||
handler, closeCoderd := coderd.New(&coderd.Options{
|
||||
Logger: logger,
|
||||
Database: databasefake.New(),
|
||||
Pubsub: database.NewPubsubInMemory(),
|
||||
@ -49,11 +49,11 @@ func Root() *cobra.Command {
|
||||
Scheme: "http",
|
||||
Host: address,
|
||||
})
|
||||
closer, err := newProvisionerDaemon(cmd.Context(), client, logger)
|
||||
daemonClose, err := newProvisionerDaemon(cmd.Context(), client, logger)
|
||||
if err != nil {
|
||||
return xerrors.Errorf("create provisioner daemon: %w", err)
|
||||
}
|
||||
defer closer.Close()
|
||||
defer daemonClose.Close()
|
||||
|
||||
errCh := make(chan error)
|
||||
go func() {
|
||||
@ -61,6 +61,7 @@ func Root() *cobra.Command {
|
||||
errCh <- http.Serve(listener, handler)
|
||||
}()
|
||||
|
||||
closeCoderd()
|
||||
select {
|
||||
case <-cmd.Context().Done():
|
||||
return cmd.Context().Err()
|
||||
|
Reference in New Issue
Block a user