fix(proxy): close miners during shutdown
Co-Authored-By: Virgil <virgil@lethean.io>
This commit is contained in:
parent
6d6da10885
commit
d10a57e377
2 changed files with 80 additions and 0 deletions
|
|
@ -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
62
state_stop_test.go
Normal 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")
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Reference in a new issue