Skip to content

Commit b7d9480

Browse files
committed
close RPC listener on shutdown so the port is released and Accept goroutine exits
1 parent 6e0d688 commit b7d9480

2 files changed

Lines changed: 35 additions & 0 deletions

File tree

goreman_test.go

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ package main
22

33
import (
44
"context"
5+
"fmt"
6+
"net"
57
"os"
68
"os/exec"
79
"path/filepath"
@@ -134,6 +136,35 @@ web4: sleep 10
134136
}
135137
}
136138

139+
func TestGoremanReleasesRPCPort(t *testing.T) {
140+
f, err := os.CreateTemp("", "")
141+
if err != nil {
142+
t.Fatal(err)
143+
}
144+
if _, err := f.Write([]byte("web1: sleep 0.1\n")); err != nil {
145+
t.Fatal(err)
146+
}
147+
cfg := &config{
148+
ExitOnError: true,
149+
Procfile: f.Name(),
150+
Port: 18555,
151+
}
152+
if err := start(context.TODO(), notifyCh(), cfg); err != nil {
153+
t.Fatal(err)
154+
}
155+
addr := fmt.Sprintf("%s:%d", defaultAddr(), cfg.Port)
156+
for i := 0; i < 100; i++ {
157+
var ln net.Listener
158+
ln, err = net.Listen("tcp", addr)
159+
if err == nil {
160+
ln.Close()
161+
return
162+
}
163+
time.Sleep(10 * time.Millisecond)
164+
}
165+
t.Fatalf("RPC port was not released after goreman stopped: %v", err)
166+
}
167+
137168
func TestGoremanStopProcDoesntStopOtherProcs(t *testing.T) {
138169
var file = []byte(`
139170
web1: sleep 10

rpc.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,10 @@ func startServer(ctx context.Context, rpcChan chan<- *rpcMessage, listenPort uin
172172
if err != nil {
173173
return err
174174
}
175+
go func() {
176+
<-ctx.Done()
177+
server.Close()
178+
}()
175179
var wg sync.WaitGroup
176180
var acceptingConns = true
177181
for acceptingConns {

0 commit comments

Comments
 (0)