From 9027f30aa865f108c827060ef59ac62c9d07002b Mon Sep 17 00:00:00 2001 From: Gaurav Singh Date: Sat, 25 Apr 2020 20:35:04 -0400 Subject: [PATCH 1/3] Fix race condition in decoder --- staging/src/k8s.io/client-go/rest/watch/decoder_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/staging/src/k8s.io/client-go/rest/watch/decoder_test.go b/staging/src/k8s.io/client-go/rest/watch/decoder_test.go index 2e02cf75262..0bda7748ec8 100644 --- a/staging/src/k8s.io/client-go/rest/watch/decoder_test.go +++ b/staging/src/k8s.io/client-go/rest/watch/decoder_test.go @@ -48,7 +48,7 @@ func TestDecoder(t *testing.T) { out, in := io.Pipe() decoder := restclientwatch.NewDecoder(streaming.NewDecoder(out, getDecoder()), getDecoder()) - + eventType := eventType expect := &v1.Pod{ObjectMeta: metav1.ObjectMeta{Name: "foo"}} encoder := json.NewEncoder(in) go func() { From e3dde36e1410b4c9b49648378b2dea1612f612fb Mon Sep 17 00:00:00 2001 From: Gaurav Singh Date: Sun, 26 Apr 2020 11:06:32 -0400 Subject: [PATCH 2/3] goroutine: Convert eventType to interface{} --- staging/src/k8s.io/client-go/rest/watch/decoder_test.go | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/staging/src/k8s.io/client-go/rest/watch/decoder_test.go b/staging/src/k8s.io/client-go/rest/watch/decoder_test.go index 0bda7748ec8..493434ec5c3 100644 --- a/staging/src/k8s.io/client-go/rest/watch/decoder_test.go +++ b/staging/src/k8s.io/client-go/rest/watch/decoder_test.go @@ -48,10 +48,9 @@ func TestDecoder(t *testing.T) { out, in := io.Pipe() decoder := restclientwatch.NewDecoder(streaming.NewDecoder(out, getDecoder()), getDecoder()) - eventType := eventType expect := &v1.Pod{ObjectMeta: metav1.ObjectMeta{Name: "foo"}} encoder := json.NewEncoder(in) - go func() { + go func(eventType interface{}) { data, err := runtime.Encode(scheme.Codecs.LegacyCodec(v1.SchemeGroupVersion), expect) if err != nil { t.Fatalf("Unexpected error %v", err) @@ -64,10 +63,10 @@ func TestDecoder(t *testing.T) { t.Errorf("Unexpected error %v", err) } in.Close() - }() + }(eventType) done := make(chan struct{}) - go func() { + go func(eventType interface{}) { action, got, err := decoder.Decode() if err != nil { t.Fatalf("Unexpected error %v", err) @@ -80,7 +79,7 @@ func TestDecoder(t *testing.T) { } t.Logf("Exited read") close(done) - }() + }(eventType) <-done done = make(chan struct{}) From c6ac8ea5f7b4e4a6f4d4895122ab1b613840b199 Mon Sep 17 00:00:00 2001 From: Gaurav Singh Date: Mon, 4 May 2020 21:52:06 -0400 Subject: [PATCH 3/3] duplicate iteration variable in go func --- .../src/k8s.io/client-go/rest/watch/decoder_test.go | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/staging/src/k8s.io/client-go/rest/watch/decoder_test.go b/staging/src/k8s.io/client-go/rest/watch/decoder_test.go index 493434ec5c3..c014f0656d2 100644 --- a/staging/src/k8s.io/client-go/rest/watch/decoder_test.go +++ b/staging/src/k8s.io/client-go/rest/watch/decoder_test.go @@ -50,28 +50,29 @@ func TestDecoder(t *testing.T) { decoder := restclientwatch.NewDecoder(streaming.NewDecoder(out, getDecoder()), getDecoder()) expect := &v1.Pod{ObjectMeta: metav1.ObjectMeta{Name: "foo"}} encoder := json.NewEncoder(in) - go func(eventType interface{}) { + eType := eventType + go func() { data, err := runtime.Encode(scheme.Codecs.LegacyCodec(v1.SchemeGroupVersion), expect) if err != nil { t.Fatalf("Unexpected error %v", err) } event := metav1.WatchEvent{ - Type: string(eventType), + Type: string(eType), Object: runtime.RawExtension{Raw: json.RawMessage(data)}, } if err := encoder.Encode(&event); err != nil { t.Errorf("Unexpected error %v", err) } in.Close() - }(eventType) + }() done := make(chan struct{}) - go func(eventType interface{}) { + go func() { action, got, err := decoder.Decode() if err != nil { t.Fatalf("Unexpected error %v", err) } - if e, a := eventType, action; e != a { + if e, a := eType, action; e != a { t.Errorf("Expected %v, got %v", e, a) } if e, a := expect, got; !apiequality.Semantic.DeepDerivative(e, a) { @@ -79,7 +80,7 @@ func TestDecoder(t *testing.T) { } t.Logf("Exited read") close(done) - }(eventType) + }() <-done done = make(chan struct{})