Skip to content

Commit 9904357

Browse files
committed
Merge branch 'main' into REP-5274-index-comparison
2 parents 1a99b12 + a85f5a6 commit 9904357

File tree

4 files changed

+118
-14
lines changed

4 files changed

+118
-14
lines changed

internal/verifier/migration_verifier.go

Lines changed: 17 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1208,22 +1208,25 @@ func (verifier *Verifier) verifyMetadataAndPartitionCollection(ctx context.Conte
12081208
task.Status = verificationTaskMetadataMismatch
12091209
}
12101210

1211-
partitions, shardKeys, docsCount, bytesCount, err := verifier.partitionAndInspectNamespace(ctx, srcNs)
1212-
if err != nil {
1213-
task.Status = verificationTaskFailed
1214-
verifier.logger.Error().Msgf("[Worker %d] Error partitioning collection: %+v", workerNum, err)
1215-
return
1216-
}
1217-
verifier.logger.Debug().Msgf("[Worker %d] split collection “%s” into %d partitions", workerNum, srcNs, len(partitions))
1218-
1219-
task.SourceDocumentCount = docsCount
1220-
task.SourceByteCount = bytesCount
1221-
1222-
for _, partition := range partitions {
1223-
_, err := verifier.InsertPartitionVerificationTask(partition, shardKeys, dstNs)
1211+
if task.Generation == 0 {
1212+
partitions, shardKeys, docsCount, bytesCount, err := verifier.partitionAndInspectNamespace(ctx, srcNs)
12241213
if err != nil {
12251214
task.Status = verificationTaskFailed
1226-
verifier.logger.Error().Msgf("[Worker %d] Error inserting verifier tasks: %+v", workerNum, err)
1215+
1216+
verifier.logger.Error().Msgf("[Worker %d] Error partitioning collection: %+v", workerNum, err)
1217+
return
1218+
}
1219+
verifier.logger.Debug().Msgf("[Worker %d] split collection “%s” into %d partitions", workerNum, srcNs, len(partitions))
1220+
1221+
task.SourceDocumentCount = docsCount
1222+
task.SourceByteCount = bytesCount
1223+
1224+
for _, partition := range partitions {
1225+
_, err := verifier.InsertPartitionVerificationTask(partition, shardKeys, dstNs)
1226+
if err != nil {
1227+
task.Status = verificationTaskFailed
1228+
verifier.logger.Error().Msgf("[Worker %d] Error inserting verifier tasks: %+v", workerNum, err)
1229+
}
12271230
}
12281231
}
12291232

internal/verifier/migration_verifier_test.go

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import (
1818

1919
"github.com/10gen/migration-verifier/internal/partitions"
2020
"github.com/10gen/migration-verifier/internal/testutil"
21+
"github.com/10gen/migration-verifier/mslices"
2122
"github.com/cespare/permute/v2"
2223
"github.com/rs/zerolog"
2324
"github.com/samber/lo"
@@ -1202,6 +1203,68 @@ func (suite *IntegrationTestSuite) TestVerificationStatus() {
12021203
suite.Equal(1, status.CompletedTasks, "completed tasks not equal")
12031204
}
12041205

1206+
func (suite *IntegrationTestSuite) TestMetadataMismatchAndPartitioning() {
1207+
ctx := suite.Context()
1208+
1209+
srcColl := suite.srcMongoClient.Database(suite.DBNameForTest()).Collection("coll")
1210+
dstColl := suite.dstMongoClient.Database(suite.DBNameForTest()).Collection("coll")
1211+
1212+
verifier := suite.BuildVerifier()
1213+
1214+
ns := srcColl.Database().Name() + "." + srcColl.Name()
1215+
verifier.SetSrcNamespaces([]string{ns})
1216+
verifier.SetDstNamespaces([]string{ns})
1217+
verifier.SetNamespaceMap()
1218+
1219+
for _, coll := range mslices.Of(srcColl, dstColl) {
1220+
_, err := coll.InsertOne(ctx, bson.M{"_id": 1, "x": 42})
1221+
suite.Require().NoError(err)
1222+
}
1223+
1224+
_, err := srcColl.Indexes().CreateOne(
1225+
ctx,
1226+
mongo.IndexModel{
1227+
Keys: bson.D{{"foo", 1}},
1228+
},
1229+
)
1230+
suite.Require().NoError(err)
1231+
1232+
runner := RunVerifierCheck(ctx, suite.T(), verifier)
1233+
runner.AwaitGenerationEnd()
1234+
1235+
cursor, err := verifier.verificationTaskCollection().Find(
1236+
ctx,
1237+
bson.M{"generation": 0},
1238+
options.Find().SetSort(bson.M{"type": 1}),
1239+
)
1240+
suite.Require().NoError(err)
1241+
1242+
var tasks []VerificationTask
1243+
suite.Require().NoError(cursor.All(ctx, &tasks))
1244+
1245+
suite.Require().Len(tasks, 2)
1246+
suite.Require().Equal(verificationTaskVerifyDocuments, tasks[0].Type)
1247+
suite.Require().Equal(verificationTaskCompleted, tasks[0].Status)
1248+
suite.Require().Equal(verificationTaskVerifyCollection, tasks[1].Type)
1249+
suite.Require().Equal(verificationTaskMetadataMismatch, tasks[1].Status)
1250+
1251+
runner.StartNextGeneration()
1252+
runner.AwaitGenerationEnd()
1253+
1254+
cursor, err = verifier.verificationTaskCollection().Find(
1255+
ctx,
1256+
bson.M{"generation": 1},
1257+
options.Find().SetSort(bson.M{"type": 1}),
1258+
)
1259+
suite.Require().NoError(err)
1260+
1261+
suite.Require().NoError(cursor.All(ctx, &tasks))
1262+
1263+
suite.Require().Len(tasks, 1, "generation 1 should only have done 1 task")
1264+
suite.Require().Equal(verificationTaskVerifyCollection, tasks[0].Type)
1265+
suite.Require().Equal(verificationTaskMetadataMismatch, tasks[0].Status)
1266+
}
1267+
12051268
func (suite *IntegrationTestSuite) TestGenerationalRechecking() {
12061269
zerolog.SetGlobalLevel(zerolog.DebugLevel)
12071270
verifier := suite.BuildVerifier()

mslices/slices.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package mslices
2+
3+
// This package complements the Go standard library’s package of the
4+
// same name with broadly-useful tools that the standard library lacks.
5+
6+
// Of returns a slice out of the given arguments. It’s syntactic sugar
7+
// to capitalize on Go’s type inference, similar to
8+
// [this declined feature proposal](https://github.com/golang/go/issues/47709).
9+
func Of[T any](pieces ...T) []T {
10+
return append([]T{}, pieces...)
11+
}

mslices/slices_test.go

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package mslices
2+
3+
import (
4+
"testing"
5+
6+
"github.com/stretchr/testify/suite"
7+
)
8+
9+
type mySuite struct {
10+
suite.Suite
11+
}
12+
13+
func TestUnitTestSuite(t *testing.T) {
14+
suite.Run(t, &mySuite{})
15+
}
16+
17+
func (s *mySuite) Test_Of() {
18+
slc := Of(12, 23, 34)
19+
20+
s.Assert().IsType([]int{}, slc, "expected type")
21+
22+
a := []int{1, 2, 3}
23+
b := Of(a...)
24+
a[0] = 4
25+
26+
s.Assert().Equal(1, b[0], "should copy slice")
27+
}

0 commit comments

Comments
 (0)