From f4abfb2a0c4879f1d80945409df2153a06dfda7e Mon Sep 17 00:00:00 2001 From: Jan Safranek Date: Wed, 4 May 2016 14:20:13 +0200 Subject: [PATCH] Make fake event recorder thread safe. The test recorder should be thread safe in case it's used in multiple goroutines. This does not serve to ensure any order of recorded events, only to prevent golang race detector to crash when two events are emitted by concurrent goroutines. --- pkg/client/record/fake.go | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/pkg/client/record/fake.go b/pkg/client/record/fake.go index 7afe1bab205..35204ef2df6 100644 --- a/pkg/client/record/fake.go +++ b/pkg/client/record/fake.go @@ -23,18 +23,32 @@ import ( "k8s.io/kubernetes/pkg/runtime" ) -// FakeRecorder is used as a fake during tests. +// FakeRecorder is used as a fake during tests. It is thread safe. It is usable +// when created manually and not by NewFakeRecorder, however all events may be +// thrown away in this case. type FakeRecorder struct { - Events []string + Events chan string } func (f *FakeRecorder) Event(object runtime.Object, eventtype, reason, message string) { - f.Events = append(f.Events, fmt.Sprintf("%s %s %s", eventtype, reason, message)) + if f.Events != nil { + f.Events <- fmt.Sprintf("%s %s %s", eventtype, reason, message) + } } func (f *FakeRecorder) Eventf(object runtime.Object, eventtype, reason, messageFmt string, args ...interface{}) { - f.Events = append(f.Events, fmt.Sprintf(eventtype+" "+reason+" "+messageFmt, args...)) + if f.Events != nil { + f.Events <- fmt.Sprintf(eventtype+" "+reason+" "+messageFmt, args...) + } } func (f *FakeRecorder) PastEventf(object runtime.Object, timestamp unversioned.Time, eventtype, reason, messageFmt string, args ...interface{}) { } + +// NewFakeRecorder creates new fake event recorder with event channel with +// buffer of given size. +func NewFakeRecorder(bufferSize int) *FakeRecorder { + return &FakeRecorder{ + Events: make(chan string, bufferSize), + } +}