1
0
Fork 0

Protect against double-close of NodeTransport

master
Philip O'Toole 1 year ago
parent 365abac57c
commit 57eabce899

@ -51,7 +51,8 @@ func (t *Transport) Addr() net.Addr {
// custom configuration of the InstallSnapshot method. // custom configuration of the InstallSnapshot method.
type NodeTransport struct { type NodeTransport struct {
*raft.NetworkTransport *raft.NetworkTransport
done chan struct{} done chan struct{}
closed bool
} }
// NewNodeTransport returns an initialized NodeTransport. // NewNodeTransport returns an initialized NodeTransport.
@ -64,6 +65,11 @@ func NewNodeTransport(transport *raft.NetworkTransport) *NodeTransport {
// Close closes the transport // Close closes the transport
func (n *NodeTransport) Close() error { func (n *NodeTransport) Close() error {
if n.closed {
return nil
}
n.closed = true
close(n.done) close(n.done)
if n.NetworkTransport == nil { if n.NetworkTransport == nil {
return nil return nil

@ -18,4 +18,7 @@ func Test_NewNodeTransport(t *testing.T) {
if err := nt.Close(); err != nil { if err := nt.Close(); err != nil {
t.Fatalf("failed to close NodeTransport: %s", err.Error()) t.Fatalf("failed to close NodeTransport: %s", err.Error())
} }
if err := nt.Close(); err != nil {
t.Fatalf("failed to double-close NodeTransport: %s", err.Error())
}
} }

Loading…
Cancel
Save