Skip to content

Commit ae8fc6f

Browse files
committed
many retries
1 parent 7ef64fc commit ae8fc6f

File tree

7 files changed

+230
-131
lines changed

7 files changed

+230
-131
lines changed

internal/retry/retry.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,17 @@ import (
1111
"go.mongodb.org/mongo-driver/bson"
1212
)
1313

14+
// Retry is a convenience that creates a retryer and executes it.
15+
// See RunForTransientErrorsOnly for argument details.
16+
func Retry(
17+
ctx context.Context,
18+
logger *logger.Logger,
19+
f func(*Info) error,
20+
) error {
21+
retryer := New(DefaultDurationLimit)
22+
return retryer.RunForTransientErrorsOnly(ctx, logger, f)
23+
}
24+
1425
// RunForUUIDAndTransientErrors retries f() for the CollectionUUIDMismatch error and for transient errors.
1526
// This should be used to run a driver operation that optionally specifies the `collectionUUID` parameter
1627
// for a collection that may have been:

internal/verifier/change_stream_test.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -346,6 +346,7 @@ func (suite *IntegrationTestSuite) TestCursorKilledResilience() {
346346

347347
failedTasks, incompleteTasks, err := FetchFailedAndIncompleteTasks(
348348
ctx,
349+
verifier.logger,
349350
verifier.verificationTaskCollection(),
350351
verificationTaskVerifyDocuments,
351352
verifier.generation,
@@ -395,6 +396,7 @@ func (suite *IntegrationTestSuite) testInsertsBeforeWritesOff(docsCount int) {
395396
generation := verifier.generation
396397
failedTasks, incompleteTasks, err := FetchFailedAndIncompleteTasks(
397398
ctx,
399+
verifier.logger,
398400
verifier.verificationTaskCollection(),
399401
verificationTaskVerifyDocuments,
400402
generation,

internal/verifier/check.go

Lines changed: 51 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ import (
55
"fmt"
66
"time"
77

8+
"github.com/10gen/migration-verifier/internal/logger"
9+
"github.com/10gen/migration-verifier/internal/retry"
810
mapset "github.com/deckarep/golang-set/v2"
911
"github.com/pkg/errors"
1012
"go.mongodb.org/mongo-driver/bson"
@@ -178,19 +180,27 @@ func (verifier *Verifier) CheckDriver(ctx context.Context, filter map[string]any
178180
return err
179181
}
180182
}
181-
err = verifier.AddMetaIndexes(ctx)
182-
if err != nil {
183-
return err
184-
}
185183

186-
err = verifier.doInMetaTransaction(
187-
ctx,
188-
func(ctx context.Context, sCtx mongo.SessionContext) error {
189-
return verifier.ResetInProgressTasks(sCtx)
190-
},
191-
)
184+
err = retry.Retry(ctx, verifier.logger, func(_ *retry.Info) error {
185+
err := verifier.AddMetaIndexes(ctx)
186+
if err != nil {
187+
return errors.Wrap(err, "failed to create verifier metadata's indexes")
188+
}
189+
190+
err = verifier.doInMetaTransaction(
191+
ctx,
192+
func(ctx context.Context, sCtx mongo.SessionContext) error {
193+
return verifier.ResetInProgressTasks(sCtx)
194+
},
195+
)
196+
if err != nil {
197+
return errors.Wrap(err, "failed to reset any in-progress tasks")
198+
}
199+
200+
return nil
201+
})
192202
if err != nil {
193-
return errors.Wrap(err, "failed to reset any in-progress tasks")
203+
return err
194204
}
195205

196206
verifier.logger.Debug().Msg("Starting Check")
@@ -352,7 +362,7 @@ func (verifier *Verifier) CreateInitialTasks(ctx context.Context) error {
352362
)
353363
}
354364
}
355-
isPrimary, err := verifier.CheckIsPrimary(ctx)
365+
isPrimary, err := verifier.CreatePrimaryTaskIfNeeded(ctx)
356366
if err != nil {
357367
return err
358368
}
@@ -386,30 +396,40 @@ func (verifier *Verifier) CreateInitialTasks(ctx context.Context) error {
386396
return nil
387397
}
388398

389-
func FetchFailedAndIncompleteTasks(ctx context.Context, coll *mongo.Collection, taskType verificationTaskType, generation int) ([]VerificationTask, []VerificationTask, error) {
399+
func FetchFailedAndIncompleteTasks(
400+
ctx context.Context,
401+
logger *logger.Logger,
402+
coll *mongo.Collection,
403+
taskType verificationTaskType,
404+
generation int,
405+
) ([]VerificationTask, []VerificationTask, error) {
390406
var FailedTasks, allTasks, IncompleteTasks []VerificationTask
391407

392-
cur, err := coll.Find(ctx, bson.D{
393-
bson.E{Key: "type", Value: taskType},
394-
bson.E{Key: "generation", Value: generation},
395-
})
396-
if err != nil {
397-
return FailedTasks, IncompleteTasks, err
398-
}
408+
err := retry.Retry(ctx, logger, func(_ *retry.Info) error {
409+
cur, err := coll.Find(ctx, bson.D{
410+
bson.E{Key: "type", Value: taskType},
411+
bson.E{Key: "generation", Value: generation},
412+
})
413+
if err != nil {
414+
return err
415+
}
399416

400-
err = cur.All(ctx, &allTasks)
401-
if err != nil {
402-
return FailedTasks, IncompleteTasks, err
403-
}
404-
for _, t := range allTasks {
405-
if failedStatus.Contains(t.Status) {
406-
FailedTasks = append(FailedTasks, t)
407-
} else if t.Status != verificationTaskCompleted {
408-
IncompleteTasks = append(IncompleteTasks, t)
417+
err = cur.All(ctx, &allTasks)
418+
if err != nil {
419+
return err
409420
}
410-
}
421+
for _, t := range allTasks {
422+
if failedStatus.Contains(t.Status) {
423+
FailedTasks = append(FailedTasks, t)
424+
} else if t.Status != verificationTaskCompleted {
425+
IncompleteTasks = append(IncompleteTasks, t)
426+
}
427+
}
428+
429+
return nil
430+
})
411431

412-
return FailedTasks, IncompleteTasks, nil
432+
return FailedTasks, IncompleteTasks, err
413433
}
414434

415435
// work is the logic for an individual worker thread.

internal/verifier/migration_verifier.go

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1277,12 +1277,17 @@ func (verifier *Verifier) GetVerificationStatus(ctx context.Context) (*Verificat
12771277
},
12781278
},
12791279
}
1280-
cursor, err := taskCollection.Aggregate(ctx, aggregation)
1281-
if err != nil {
1282-
return nil, err
1283-
}
1280+
12841281
var results []bson.Raw
1285-
err = cursor.All(ctx, &results)
1282+
1283+
err := retry.Retry(ctx, verifier.logger, func(_ *retry.Info) error {
1284+
cursor, err := taskCollection.Aggregate(ctx, aggregation)
1285+
if err != nil {
1286+
return err
1287+
}
1288+
1289+
return cursor.All(ctx, &results)
1290+
})
12861291
if err != nil {
12871292
return nil, err
12881293
}

internal/verifier/reset_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ func (suite *IntegrationTestSuite) TestResetPrimaryTask() {
1515

1616
verifier := suite.BuildVerifier()
1717

18-
created, err := verifier.CheckIsPrimary(ctx)
18+
created, err := verifier.CreatePrimaryTaskIfNeeded(ctx)
1919
suite.Require().NoError(err)
2020
suite.Require().True(created)
2121

@@ -45,7 +45,7 @@ func (suite *IntegrationTestSuite) TestResetNonPrimaryTasks() {
4545
verifier := suite.BuildVerifier()
4646

4747
// Create a primary task, and set it to complete.
48-
created, err := verifier.CheckIsPrimary(ctx)
48+
created, err := verifier.CreatePrimaryTaskIfNeeded(ctx)
4949
suite.Require().NoError(err)
5050
suite.Require().True(created)
5151

internal/verifier/summary.go

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,13 @@ const changeEventsTableMaxSize = 10
2929
func (verifier *Verifier) reportCollectionMetadataMismatches(ctx context.Context, strBuilder *strings.Builder) (bool, bool, error) {
3030
generation, _ := verifier.getGeneration()
3131

32-
failedTasks, incompleteTasks, err :=
33-
FetchFailedAndIncompleteTasks(ctx, verifier.verificationTaskCollection(), verificationTaskVerifyCollection, generation)
32+
failedTasks, incompleteTasks, err := FetchFailedAndIncompleteTasks(
33+
ctx,
34+
verifier.logger,
35+
verifier.verificationTaskCollection(),
36+
verificationTaskVerifyCollection,
37+
generation,
38+
)
3439
if err != nil {
3540
return false, false, err
3641
}
@@ -58,7 +63,13 @@ func (verifier *Verifier) reportCollectionMetadataMismatches(ctx context.Context
5863
func (verifier *Verifier) reportDocumentMismatches(ctx context.Context, strBuilder *strings.Builder) (bool, bool, error) {
5964
generation, _ := verifier.getGeneration()
6065

61-
failedTasks, incompleteTasks, err := FetchFailedAndIncompleteTasks(ctx, verifier.verificationTaskCollection(), verificationTaskVerifyDocuments, generation)
66+
failedTasks, incompleteTasks, err := FetchFailedAndIncompleteTasks(
67+
ctx,
68+
verifier.logger,
69+
verifier.verificationTaskCollection(),
70+
verificationTaskVerifyDocuments,
71+
generation,
72+
)
6273

6374
if err != nil {
6475
return false, false, err

0 commit comments

Comments
 (0)