fix(proxy): close miners during shutdown

Co-Authored-By: Virgil <virgil@lethean.io>
This commit is contained in:
Virgil 2026-04-04 20:05:54 +00:00
parent 6d6da10885
commit d10a57e377
2 changed files with 80 additions and 0 deletions

View file

@ -244,6 +244,7 @@ func (p *Proxy) Stop() {
for _, server := range p.servers {
server.Stop()
}
p.closeAllMiners()
if p.watcher != nil {
p.watcher.Stop()
}
@ -262,6 +263,23 @@ func (p *Proxy) Stop() {
})
}
func (p *Proxy) closeAllMiners() {
if p == nil {
return
}
p.minersMu.RLock()
miners := make([]*Miner, 0, len(p.miners))
for _, miner := range p.miners {
miners = append(miners, miner)
}
p.minersMu.RUnlock()
for _, miner := range miners {
if miner != nil {
miner.Close()
}
}
}
// Reload swaps the live configuration and updates dependent state.
func (p *Proxy) Reload(cfg *Config) {
if p == nil || cfg == nil {

62
state_stop_test.go Normal file
View file

@ -0,0 +1,62 @@
package proxy
import (
"net"
"testing"
"time"
)
func TestProxy_Stop_Good(t *testing.T) {
serverConn, clientConn := net.Pipe()
defer serverConn.Close()
miner := NewMiner(clientConn, 3333, nil)
proxyInstance := &Proxy{
done: make(chan struct{}),
miners: map[int64]*Miner{miner.ID(): miner},
}
done := make(chan error, 1)
go func() {
buf := make([]byte, 1)
_, err := serverConn.Read(buf)
done <- err
}()
time.Sleep(10 * time.Millisecond)
proxyInstance.Stop()
select {
case err := <-done:
if err == nil {
t.Fatalf("expected miner connection to close during Stop")
}
case <-time.After(time.Second):
t.Fatalf("expected miner connection to close during Stop")
}
}
func TestProxy_Stop_Bad(t *testing.T) {
var proxyInstance *Proxy
proxyInstance.Stop()
}
func TestProxy_Stop_Ugly(t *testing.T) {
serverConn, clientConn := net.Pipe()
defer serverConn.Close()
miner := NewMiner(clientConn, 3333, nil)
proxyInstance := &Proxy{
done: make(chan struct{}),
miners: map[int64]*Miner{miner.ID(): miner},
}
proxyInstance.Stop()
proxyInstance.Stop()
buf := make([]byte, 1)
if _, err := serverConn.Read(buf); err == nil {
t.Fatalf("expected closed connection after repeated Stop calls")
}
}