packer/rpc: hard close all streams when underlying conn closes
This commit is contained in:
parent
5dffab7439
commit
d9f79b0ecc
|
@ -234,7 +234,13 @@ func (m *MuxConn) openStream(id uint32) (*Stream, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *MuxConn) loop() {
|
func (m *MuxConn) loop() {
|
||||||
defer m.Close()
|
defer func() {
|
||||||
|
m.mu.Lock()
|
||||||
|
defer m.mu.Unlock()
|
||||||
|
for _, w := range m.streams {
|
||||||
|
w.remoteClose()
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
var id uint32
|
var id uint32
|
||||||
var packetType muxPacketType
|
var packetType muxPacketType
|
||||||
|
@ -384,16 +390,13 @@ func (s *Stream) Close() error {
|
||||||
return fmt.Errorf("Stream in bad state: %d", s.state)
|
return fmt.Errorf("Stream in bad state: %d", s.state)
|
||||||
}
|
}
|
||||||
|
|
||||||
if _, err := s.mux.write(s.id, muxPacketFin, nil); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
if s.state == streamStateEstablished {
|
if s.state == streamStateEstablished {
|
||||||
s.setState(streamStateFinWait1)
|
s.setState(streamStateFinWait1)
|
||||||
} else {
|
} else {
|
||||||
s.remoteClose()
|
s.remoteClose()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
s.mux.write(s.id, muxPacketFin, nil)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -114,6 +114,32 @@ func TestMuxConn(t *testing.T) {
|
||||||
<-doneCh
|
<-doneCh
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestMuxConn_socketClose(t *testing.T) {
|
||||||
|
client, server := testMux(t)
|
||||||
|
defer client.Close()
|
||||||
|
defer server.Close()
|
||||||
|
|
||||||
|
go func() {
|
||||||
|
_, err := server.Accept(0)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("err: %s", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
server.rwc.Close()
|
||||||
|
}()
|
||||||
|
|
||||||
|
s0, err := client.Dial(0)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("err: %s", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
var data [1024]byte
|
||||||
|
_, err = s0.Read(data[:])
|
||||||
|
if err != io.EOF {
|
||||||
|
t.Fatalf("err: %s", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestMuxConn_clientClosesStreams(t *testing.T) {
|
func TestMuxConn_clientClosesStreams(t *testing.T) {
|
||||||
client, server := testMux(t)
|
client, server := testMux(t)
|
||||||
defer client.Close()
|
defer client.Close()
|
||||||
|
|
Loading…
Reference in New Issue