@@ -139,39 +139,75 @@ func TestWatchingCacheParallelOperations(t *testing.T) {
139139 var wg sync.WaitGroup
140140 wg .Add (2 )
141141
142+ firstErrs := make (chan error , 2 )
143+ firstFallbackModes := make (chan bool , 1 )
144+ firstNsDefNames := make (chan string , 1 )
145+
146+ secondErrs := make (chan error , 2 )
147+ secondFallbackModes := make (chan bool , 2 )
148+
142149 go (func () {
150+ defer wg .Done ()
151+
143152 // Read somenamespace (which should not be found)
144153 _ , _ , err := wcache .SnapshotReader (rev ("1" )).ReadNamespaceByName (t .Context (), "somenamespace" )
145- require . ErrorAs ( t , err , & datastore. NamespaceNotFoundError {})
146- require . False ( t , wcache .namespaceCache .inFallbackMode )
154+ firstErrs <- err
155+ firstFallbackModes <- wcache .namespaceCache .inFallbackMode
147156
148157 // Write somenamespace.
149158 fakeDS .updateNamespace ("somenamespace" , & corev1.NamespaceDefinition {Name : "somenamespace" }, rev ("2" ))
150159
151160 // Read again (which should be found now)
152161 nsDef , _ , err := wcache .SnapshotReader (rev ("2" )).ReadNamespaceByName (t .Context (), "somenamespace" )
153- require .NoError (t , err )
154- require .Equal (t , "somenamespace" , nsDef .Name )
155-
156- wg .Done ()
162+ firstErrs <- err
163+ firstNsDefNames <- nsDef .Name
157164 })()
158165
159166 go (func () {
167+ defer wg .Done ()
168+
160169 // Read anothernamespace (which should not be found)
161170 _ , _ , err := wcache .SnapshotReader (rev ("1" )).ReadNamespaceByName (t .Context (), "anothernamespace" )
162- require . ErrorAs ( t , err , & datastore. NamespaceNotFoundError {})
163- require . False ( t , wcache .namespaceCache .inFallbackMode )
171+ secondErrs <- err
172+ secondFallbackModes <- wcache .namespaceCache .inFallbackMode
164173
165174 // Read again (which should still not be found)
166175 _ , _ , err = wcache .SnapshotReader (rev ("3" )).ReadNamespaceByName (t .Context (), "anothernamespace" )
167- require .ErrorAs (t , err , & datastore.NamespaceNotFoundError {})
168- require .False (t , wcache .namespaceCache .inFallbackMode )
169-
170- wg .Done ()
176+ secondErrs <- err
177+ secondFallbackModes <- wcache .namespaceCache .inFallbackMode
171178 })()
172179
173180 wg .Wait ()
174181
182+ var nsNotFoundErr datastore.NamespaceNotFoundError
183+
184+ // Make the assertions
185+ // Assertions on first goroutine
186+ // Non-existent namespace
187+ err := <- firstErrs
188+ require .ErrorAs (t , err , & nsNotFoundErr )
189+ inFallbackMode := <- firstFallbackModes
190+ require .False (t , inFallbackMode )
191+
192+ // Namespace that we expect to exist
193+ err = <- firstErrs
194+ require .NoError (t , err , "expected namespace read from rev 2 to succeed" )
195+ name := <- firstNsDefNames
196+ require .Equal (t , "somenamespace" , name )
197+
198+ // Assertions on second goroutine
199+ // Reading a non-existent namespace
200+ err = <- secondErrs
201+ require .ErrorAs (t , err , & nsNotFoundErr )
202+ inFallbackMode = <- secondFallbackModes
203+ require .False (t , inFallbackMode )
204+
205+ // Reading another non-existent namespace
206+ err = <- secondErrs
207+ require .ErrorAs (t , err , & nsNotFoundErr )
208+ inFallbackMode = <- secondFallbackModes
209+ require .False (t , inFallbackMode )
210+
175211 // Close the proxy and ensure the background goroutines are terminated.
176212 wcache .Close ()
177213 time .Sleep (10 * time .Millisecond )
@@ -208,22 +244,38 @@ func TestWatchingCacheParallelReaderWriter(t *testing.T) {
208244 wg .Done ()
209245 })()
210246
247+ headRevisionErrors := make (chan error , 1000 )
248+ snapshotReaderErrors := make (chan error , 1000 )
249+ namespaceNames := make (chan string , 1000 )
250+
211251 go (func () {
212252 // Start a loop to read a namespace a bunch of times.
213253 for i := 0 ; i < 1000 ; i ++ {
214254 headRevision , err := fakeDS .HeadRevision (t .Context ())
215- require . NoError ( t , err )
255+ headRevisionErrors <- err
216256
217257 nsDef , _ , err := wcache .SnapshotReader (headRevision ).ReadNamespaceByName (t .Context (), "somenamespace" )
218- require . NoError ( t , err )
219- require . Equal ( t , "somenamespace" , nsDef .Name )
258+ snapshotReaderErrors <- err
259+ namespaceNames <- nsDef .Name
220260 }
221261
222262 wg .Done ()
223263 })()
224264
225265 wg .Wait ()
226266
267+ // 1000 iterations, 3 channels
268+ for range 3000 {
269+ select {
270+ case headRevisionErr := <- headRevisionErrors :
271+ require .NoError (t , headRevisionErr , "unexpected error getting head revision" )
272+ case snapshotReaderErr := <- snapshotReaderErrors :
273+ require .NoError (t , snapshotReaderErr , "unexpected error reading namespace" )
274+ case namespaceName := <- namespaceNames :
275+ require .Equal (t , "somenamespace" , namespaceName )
276+ }
277+ }
278+
227279 // Close the proxy and ensure the background goroutines are terminated.
228280 wcache .Close ()
229281 time .Sleep (10 * time .Millisecond )
0 commit comments