diff --git a/staging/src/k8s.io/apimachinery/pkg/util/httpstream/spdy/connection.go b/staging/src/k8s.io/apimachinery/pkg/util/httpstream/spdy/connection.go index 3da7457f4827..d4ceab84f06d 100644 --- a/staging/src/k8s.io/apimachinery/pkg/util/httpstream/spdy/connection.go +++ b/staging/src/k8s.io/apimachinery/pkg/util/httpstream/spdy/connection.go @@ -123,7 +123,10 @@ func (c *connection) Close() error { func (c *connection) RemoveStreams(streams ...httpstream.Stream) { c.streamLock.Lock() for _, stream := range streams { - delete(c.streams, stream.Identifier()) + // It may be possible that the provided stream is nil if timed out. + if stream != nil { + delete(c.streams, stream.Identifier()) + } } c.streamLock.Unlock() } diff --git a/staging/src/k8s.io/apimachinery/pkg/util/httpstream/spdy/connection_test.go b/staging/src/k8s.io/apimachinery/pkg/util/httpstream/spdy/connection_test.go index edef917146fe..143d8c05e3a2 100644 --- a/staging/src/k8s.io/apimachinery/pkg/util/httpstream/spdy/connection_test.go +++ b/staging/src/k8s.io/apimachinery/pkg/util/httpstream/spdy/connection_test.go @@ -323,6 +323,9 @@ func TestConnectionRemoveStreams(t *testing.T) { // remove all existing c.RemoveStreams(stream0, stream1) + // remove nil stream should not crash + c.RemoveStreams(nil) + if len(c.streams) != 0 { t.Fatalf("should not have any streams, has %d", len(c.streams)) }