Skip to content

Commit 21e39c0

Browse files
committed
feat: implement graceful shutdown for first child listener and enhance connection handling
1 parent c1cfc15 commit 21e39c0

File tree

2 files changed

+34
-4
lines changed

2 files changed

+34
-4
lines changed

firstchild_listener.go

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,15 +10,37 @@ type firstChildListener struct {
1010
ch chan net.Conn
1111
closeOnce sync.Once
1212
wg sync.WaitGroup
13+
closed chan struct{}
1314
}
1415

1516
func (sl *firstChildListener) Forward(conn net.Conn) {
1617
sl.wg.Add(1)
18+
19+
// Check if listener is closed before sending
20+
select {
21+
case <-sl.closed:
22+
// Listener is closed, don't forward the connection
23+
sl.wg.Done()
24+
conn.Close()
25+
return
26+
default:
27+
}
28+
1729
select {
1830
case sl.ch <- conn:
31+
case <-sl.closed:
32+
// Listener was closed while trying to send
33+
sl.wg.Done()
34+
conn.Close()
1935
default:
2036
go func() {
21-
sl.ch <- conn
37+
select {
38+
case sl.ch <- conn:
39+
case <-sl.closed:
40+
// Listener was closed while waiting
41+
sl.wg.Done()
42+
conn.Close()
43+
}
2244
}()
2345
}
2446
}
@@ -37,8 +59,9 @@ func (sl *firstChildListener) Addr() net.Addr {
3759
}
3860

3961
func (sl *firstChildListener) Close() error {
40-
sl.wg.Wait()
4162
sl.closeOnce.Do(func() {
63+
close(sl.closed)
64+
sl.wg.Wait()
4265
close(sl.ch)
4366
})
4467
return nil

risefront.go

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ type Dialer interface {
3838
type Config struct {
3939
Addresses []string // Addresses to listen to.
4040
Run func([]net.Listener) error // Handle the connections. All open connections should be properly closed before returning (srv.Shutdown for http.Server for instance).
41+
Shutdown func() // A callback to trigger graceful shutdown of the Run function.
4142

4243
Name string // Name of the socket file
4344
Dialer Dialer // Dialer for child-parent communication. Let empty for default dialer (PrefixDialer{}).
@@ -220,8 +221,9 @@ func (cfg Config) runParent(ctx context.Context, socket string) error {
220221

221222
// first child listener
222223
sl := firstChildListener{
223-
addr: ln.Addr(),
224-
ch: make(chan net.Conn),
224+
addr: ln.Addr(),
225+
ch: make(chan net.Conn),
226+
closed: make(chan struct{}),
225227
}
226228
firstChildListeners = append(firstChildListeners, &sl)
227229

@@ -564,6 +566,11 @@ func Restart() {
564566
err := globalConfig.createChild()
565567
if err != nil {
566568
globalConfig.LogHandler(ErrorLevel, "restart.createChild", err)
569+
return
570+
}
571+
572+
if globalConfig.Shutdown != nil {
573+
globalConfig.Shutdown()
567574
}
568575
}
569576

0 commit comments

Comments
 (0)