@@ -25,7 +25,6 @@ import (
2525 "go.mongodb.org/mongo-driver/v2/bson"
2626 "go.mongodb.org/mongo-driver/v2/mongo"
2727 "go.mongodb.org/mongo-driver/v2/mongo/options"
28- "go.mongodb.org/mongo-driver/v2/mongo/readconcern"
2928)
3029
3130func (suite * IntegrationTestSuite ) TestChangeStreamFilter_NoNamespaces () {
@@ -255,12 +254,6 @@ func (suite *IntegrationTestSuite) TestChangeStream_Resume_NoSkip() {
255254
256255 verifier1 := suite .BuildVerifier ()
257256
258- // Use of linearizable read concern below seems to freeze pre-4.4 servers.
259- srcVersion := verifier1 .srcClusterInfo .VersionArray
260- if util .CmpMinorVersions ([2 ]int (srcVersion ), [2 ]int {4 , 4 }) == - 1 {
261- suite .T ().Skipf ("Source version (%v) is too old for this test." , srcVersion )
262- }
263-
264257 srcDB := verifier1 .srcClient .Database (suite .DBNameForTest ())
265258 srcColl := srcDB .Collection ("coll" )
266259
@@ -289,9 +282,10 @@ func (suite *IntegrationTestSuite) TestChangeStream_Resume_NoSkip() {
289282 "should see a change stream resume token persisted" ,
290283 )
291284
292- insertCtx , cancelInserts := contextplus .WithCancelCause (ctx )
293- defer cancelInserts (ctx .Err ())
285+ stopInserts := make (chan struct {})
294286 insertsDone := make (chan struct {})
287+
288+ var insertedIDs []any
295289 go func () {
296290 defer func () {
297291 close (insertsDone )
@@ -302,21 +296,25 @@ func (suite *IntegrationTestSuite) TestChangeStream_Resume_NoSkip() {
302296 )
303297 require .NoError (suite .T (), err )
304298
305- sessCtx := mongo .NewSessionContext (insertCtx , sess )
299+ sessCtx := mongo .NewSessionContext (ctx , sess )
306300
307- docID := int32 (1 )
308301 for {
309- _ , err := srcColl .InsertOne (
302+ select {
303+ case <- ctx .Done ():
304+ return
305+ case <- stopInserts :
306+ return
307+ default :
308+ }
309+
310+ inserted , err := srcColl .InsertOne (
310311 sessCtx ,
311- bson.D {{ "_id" , docID } },
312+ bson.D {},
312313 )
313314
314- if err != nil {
315- require .ErrorIs (suite .T (), err , context .Canceled )
316- return
317- }
315+ require .NoError (suite .T (), err , "should insert" )
318316
319- docID ++
317+ insertedIDs = append ( insertedIDs , inserted . InsertedID )
320318 }
321319 }()
322320
@@ -340,58 +338,43 @@ func (suite *IntegrationTestSuite) TestChangeStream_Resume_NoSkip() {
340338 verifier2 := suite .BuildVerifier ()
341339 suite .startSrcChangeStreamReaderAndHandler (ctx , verifier2 )
342340
343- cancelInserts ( fmt . Errorf ( "verifier2 started" ) )
341+ close ( stopInserts )
344342 <- insertsDone
345343
346- lastIDRes := srcColl .Database ().Collection (
347- srcColl .Name (),
348- options .Collection ().SetReadConcern (readconcern .Linearizable ()),
349- ).FindOne (
350- ctx ,
351- bson.D {},
352- options .FindOne ().
353- SetSort (bson.D {{"_id" , - 1 }}),
354- )
355- require .NoError (suite .T (), lastIDRes .Err ())
356-
357- lastDocID := lo .Must (lo .Must (lastIDRes .Raw ()).LookupErr ("_id" )).Int32 ()
358-
344+ var foundIDs []any
359345 assert .Eventually (
360346 suite .T (),
361347 func () bool {
362348 rechecks := suite .fetchPendingVerifierRechecks (ctx , verifier2 )
363349
364- return lo .SomeBy (
350+ foundIDs = lo .Map (
365351 rechecks ,
366- func (cur bson.M ) bool {
352+ func (cur bson.M , _ int ) any {
367353 id := cur ["_id" ].(bson.D )
368354
369355 for _ , el := range id {
370- if el .Key ! = "docID" {
371- continue
356+ if el .Key = = "docID" {
357+ return el . Value
372358 }
373-
374- return el .Value .(int32 ) == lastDocID
375359 }
376360
377361 panic (fmt .Sprintf ("no docID in _id: %+v" , id ))
378362 },
379363 )
364+
365+ return len (foundIDs ) == len (insertedIDs )
380366 },
381367 time .Minute ,
382368 100 * time .Millisecond ,
383369 "last-inserted doc shows as recheck" ,
384370 )
385371
386- sess := lo .Must (verifier2 .verificationDatabase ().Client ().StartSession ())
387- sctx := mongo .NewSessionContext (ctx , sess )
388-
389- rechecks := suite .fetchPendingVerifierRechecks (sctx , verifier2 )
390- if ! assert .EqualValues (suite .T (), lastDocID , len (rechecks ), "all source docs should be rechecked" ) {
391- for _ , recheck := range rechecks {
392- suite .T ().Logf ("found recheck: %v" , recheck )
393- }
394- }
372+ assert .ElementsMatch (
373+ suite .T (),
374+ insertedIDs ,
375+ foundIDs ,
376+ "all source docs should be rechecked" ,
377+ )
395378}
396379
397380// TestChangeStreamResumability creates a verifier, starts its change stream,
@@ -1069,15 +1052,28 @@ func (suite *IntegrationTestSuite) TestRecheckDocsWithDstChangeEvents() {
10691052 require .Eventually (
10701053 suite .T (),
10711054 func () bool {
1072- recheckColl := verifier . getRecheckQueueCollection ( 1 + verifier . generation )
1073- cursor , err := recheckColl . Find ( ctx , bson. D {})
1074- if errors . Is ( err , mongo . ErrNoDocuments ) {
1055+ rechecksM := suite . fetchPendingVerifierRechecks ( ctx , verifier )
1056+
1057+ if len ( rechecksM ) < 3 {
10751058 return false
10761059 }
10771060
1078- suite .Require ().NoError (err )
1079- suite .Require ().NoError (cursor .All (ctx , & rechecks ))
1080- return len (rechecks ) == 3
1061+ require .Len (suite .T (), rechecksM , 3 )
1062+
1063+ rechecks = lo .Map (
1064+ rechecksM ,
1065+ func (m bson.M , _ int ) recheck.Doc {
1066+ raw , err := bson .Marshal (m )
1067+ require .NoError (suite .T (), err )
1068+
1069+ doc := recheck.Doc {}
1070+ require .NoError (suite .T (), (& doc ).UnmarshalFromBSON (raw ))
1071+
1072+ return doc
1073+ },
1074+ )
1075+
1076+ return true
10811077 },
10821078 time .Minute ,
10831079 500 * time .Millisecond ,
0 commit comments