Skip to content

Commit 7cf2ba3

Browse files
committed
close RPC listener on shutdown so the port is released and Accept goroutine exits
1 parent 447be23 commit 7cf2ba3

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"
@@ -158,6 +160,35 @@ web1: sleep 0.2
158160
}
159161
}
160162

163+
func TestGoremanReleasesRPCPort(t *testing.T) {
164+
f, err := os.CreateTemp("", "")
165+
if err != nil {
166+
t.Fatal(err)
167+
}
168+
if _, err := f.Write([]byte("web1: sleep 0.1\n")); err != nil {
169+
t.Fatal(err)
170+
}
171+
cfg := &config{
172+
ExitOnError: true,
173+
Procfile: f.Name(),
174+
Port: 18555,
175+
}
176+
if err := start(context.TODO(), notifyCh(), cfg); err != nil {
177+
t.Fatal(err)
178+
}
179+
addr := fmt.Sprintf("%s:%d", defaultAddr(), cfg.Port)
180+
for i := 0; i < 100; i++ {
181+
var ln net.Listener
182+
ln, err = net.Listen("tcp", addr)
183+
if err == nil {
184+
ln.Close()
185+
return
186+
}
187+
time.Sleep(10 * time.Millisecond)
188+
}
189+
t.Fatalf("RPC port was not released after goreman stopped: %v", err)
190+
}
191+
161192
func TestGoremanStopProcDoesntStopOtherProcs(t *testing.T) {
162193
var file = []byte(`
163194
web1: sleep 10

rpc.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,10 @@ func startServer(ctx context.Context, rpcChan chan<- *rpcMessage, listenPort uin
179179
if err != nil {
180180
return err
181181
}
182+
go func() {
183+
<-ctx.Done()
184+
server.Close()
185+
}()
182186
var wg sync.WaitGroup
183187
var acceptingConns = true
184188
for acceptingConns {

0 commit comments

Comments
 (0)