Skip to content

Commit 293d7b4

Browse files
committed
revert non-test changes to ensure that existing tests verify
1 parent 79d5675 commit 293d7b4

File tree

4 files changed

+91
-119
lines changed

4 files changed

+91
-119
lines changed

internal/verifier/change_stream.go

Lines changed: 48 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import (
1212
"go.mongodb.org/mongo-driver/bson/primitive"
1313
"go.mongodb.org/mongo-driver/mongo"
1414
"go.mongodb.org/mongo-driver/mongo/options"
15+
"golang.org/x/exp/constraints"
1516
)
1617

1718
const fauxDocSizeForDeleteEvents = 1024
@@ -104,11 +105,6 @@ func (verifier *Verifier) HandleChangeStreamEvents(ctx context.Context, batch []
104105
// GetChangeStreamFilter returns an aggregation pipeline that filters
105106
// namespaces as per configuration.
106107
//
107-
// Note that this omits verifier.globalFilter because we still need to
108-
// recheck any out-filter documents that may have changed in order to
109-
// account for filter traversals (i.e., updates that change whether a
110-
// document matches the filter).
111-
//
112108
// NB: Ideally we could make the change stream give $bsonSize(fullDocument)
113109
// and omit fullDocument, but $bsonSize was new in MongoDB 4.4, and we still
114110
// want to verify migrations from 4.2. fullDocument is unlikely to be a
@@ -126,60 +122,55 @@ func (verifier *Verifier) GetChangeStreamFilter() []bson.D {
126122
return []bson.D{stage}
127123
}
128124

129-
func (verifier *Verifier) readAndHandleOneChangeEventBatch(ctx context.Context, cs *mongo.ChangeStream) error {
130-
eventsRead := 0
131-
var changeEventBatch []ParsedEvent
132-
133-
for hasEventInBatch := true; hasEventInBatch; hasEventInBatch = cs.RemainingBatchLength() > 0 {
134-
gotEvent := cs.TryNext(ctx)
135-
136-
if cs.Err() != nil {
137-
return errors.Wrap(cs.Err(), "change stream iteration failed")
138-
}
125+
func (verifier *Verifier) iterateChangeStream(ctx context.Context, cs *mongo.ChangeStream) {
126+
defer cs.Close(ctx)
139127

140-
if !gotEvent {
141-
break
142-
}
128+
var lastPersistedTime time.Time
143129

144-
if changeEventBatch == nil {
145-
changeEventBatch = make([]ParsedEvent, cs.RemainingBatchLength()+1)
130+
persistResumeTokenIfNeeded := func() error {
131+
if time.Since(lastPersistedTime) <= minChangeStreamPersistInterval {
132+
return nil
146133
}
147134

148-
if err := cs.Decode(&changeEventBatch[eventsRead]); err != nil {
149-
return errors.Wrap(err, "failed to decode change event")
135+
err := verifier.persistChangeStreamResumeToken(ctx, cs)
136+
if err == nil {
137+
lastPersistedTime = time.Now()
150138
}
151139

152-
eventsRead++
140+
return err
153141
}
154142

155-
if eventsRead == 0 {
156-
return nil
157-
}
143+
readAndHandleOneChangeEventBatch := func() (bool, error) {
144+
eventsRead := 0
145+
var changeEventBatch []ParsedEvent
158146

159-
err := verifier.HandleChangeStreamEvents(ctx, changeEventBatch)
160-
if err != nil {
161-
return errors.Wrap(err, "failed to handle change events")
162-
}
147+
for hasEventInBatch := true; hasEventInBatch; hasEventInBatch = cs.RemainingBatchLength() > 0 {
148+
gotEvent := cs.TryNext(ctx)
163149

164-
return nil
165-
}
150+
if !gotEvent || cs.Err() != nil {
151+
break
152+
}
166153

167-
func (verifier *Verifier) iterateChangeStream(ctx context.Context, cs *mongo.ChangeStream) {
168-
defer cs.Close(ctx)
154+
if changeEventBatch == nil {
155+
changeEventBatch = make([]ParsedEvent, cs.RemainingBatchLength()+1)
156+
}
169157

170-
var lastPersistedTime time.Time
158+
if err := cs.Decode(&changeEventBatch[eventsRead]); err != nil {
159+
return false, errors.Wrap(err, "failed to decode change event")
160+
}
171161

172-
persistResumeTokenIfNeeded := func() error {
173-
if time.Since(lastPersistedTime) <= minChangeStreamPersistInterval {
174-
return nil
162+
eventsRead++
175163
}
176164

177-
err := verifier.persistChangeStreamResumeToken(ctx, cs)
178-
if err == nil {
179-
lastPersistedTime = time.Now()
165+
if eventsRead > 0 {
166+
verifier.logger.Debug().Int("eventsCount", eventsRead).Msgf("Received a batch of events.")
167+
err := verifier.HandleChangeStreamEvents(ctx, changeEventBatch)
168+
if err != nil {
169+
return false, errors.Wrap(err, "failed to handle change events")
170+
}
180171
}
181172

182-
return err
173+
return eventsRead > 0, errors.Wrap(cs.Err(), "change stream iteration failed")
183174
}
184175

185176
for {
@@ -198,45 +189,29 @@ func (verifier *Verifier) iterateChangeStream(ctx context.Context, cs *mongo.Cha
198189
// If the changeStreamEnderChan has a message, the user has indicated that
199190
// source writes are ended. This means we should exit rather than continue
200191
// reading the change stream since there should be no more events.
201-
case finalTs := <-verifier.changeStreamFinalTsChan:
192+
case <-verifier.changeStreamEnderChan:
202193
verifier.logger.Debug().
203-
Interface("finalTimestamp", finalTs).
204-
Msg("Change stream thread received final timestamp. Finalizing change stream.")
194+
Msg("Change stream thread received shutdown request.")
205195

206196
changeStreamEnded = true
207197

208198
// Read all change events until the source reports no events.
209199
// (i.e., the `getMore` call returns empty)
210200
for {
211-
var curTs primitive.Timestamp
212-
curTs, err = extractTimestampFromResumeToken(cs.ResumeToken())
213-
if err != nil {
214-
err = errors.Wrap(err, "failed to extract timestamp from change stream's resume token")
215-
break
216-
}
217-
218-
if curTs == finalTs || curTs.After(finalTs) {
219-
verifier.logger.Debug().
220-
Interface("currentTimestamp", curTs).
221-
Interface("finalTimestamp", finalTs).
222-
Msg("Change stream has reached the final timestamp. Shutting down.")
201+
var gotEvent bool
202+
gotEvent, err = readAndHandleOneChangeEventBatch()
223203

224-
break
225-
}
226-
227-
err = verifier.readAndHandleOneChangeEventBatch(ctx, cs)
228-
229-
if err != nil {
204+
if !gotEvent || err != nil {
230205
break
231206
}
232207
}
233208

234209
default:
235-
err = verifier.readAndHandleOneChangeEventBatch(ctx, cs)
210+
_, err = readAndHandleOneChangeEventBatch()
211+
}
236212

237-
if err == nil {
238-
err = persistResumeTokenIfNeeded()
239-
}
213+
if err == nil {
214+
err = persistResumeTokenIfNeeded()
240215
}
241216

242217
if err != nil && !errors.Is(err, context.Canceled) {
@@ -267,9 +242,9 @@ func (verifier *Verifier) iterateChangeStream(ctx context.Context, cs *mongo.Cha
267242

268243
infoLog := verifier.logger.Info()
269244
if verifier.lastChangeEventTime == nil {
270-
infoLog = infoLog.Str("lastEventTime", "none")
245+
infoLog = infoLog.Str("changeStreamStopTime", "none")
271246
} else {
272-
infoLog = infoLog.Interface("lastEventTime", *verifier.lastChangeEventTime)
247+
infoLog = infoLog.Interface("changeStreamStopTime", *verifier.lastChangeEventTime)
273248
}
274249

275250
infoLog.Msg("Change stream is done.")
@@ -295,7 +270,7 @@ func (verifier *Verifier) StartChangeStream(ctx context.Context) error {
295270

296271
ts, err := extractTimestampFromResumeToken(savedResumeToken)
297272
if err == nil {
298-
logEvent = addTimestampToLogEvent(ts, logEvent)
273+
logEvent = addUnixTimeToLogEvent(ts.T, logEvent)
299274
} else {
300275
verifier.logger.Warn().
301276
Err(err).
@@ -348,10 +323,8 @@ func (verifier *Verifier) StartChangeStream(ctx context.Context) error {
348323
return nil
349324
}
350325

351-
func addTimestampToLogEvent(ts primitive.Timestamp, event *zerolog.Event) *zerolog.Event {
352-
return event.
353-
Interface("timestamp", ts).
354-
Time("time", time.Unix(int64(ts.T), int64(0)))
326+
func addUnixTimeToLogEvent[T constraints.Integer](unixTime T, event *zerolog.Event) *zerolog.Event {
327+
return event.Time("timestampTime", time.Unix(int64(unixTime), int64(0)))
355328
}
356329

357330
func (v *Verifier) getChangeStreamMetadataCollection() *mongo.Collection {
@@ -390,7 +363,7 @@ func (verifier *Verifier) persistChangeStreamResumeToken(ctx context.Context, cs
390363
logEvent := verifier.logger.Debug()
391364

392365
if err == nil {
393-
logEvent = addTimestampToLogEvent(ts, logEvent)
366+
logEvent = addUnixTimeToLogEvent(ts.T, logEvent)
394367
} else {
395368
verifier.logger.Warn().Err(err).
396369
Msg("failed to extract resume token timestamp")

internal/verifier/change_stream_test.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,8 @@ func (suite *IntegrationTestSuite) TestStartAtTimeNoChanges() {
141141
err = verifier.StartChangeStream(ctx)
142142
suite.Require().NoError(err)
143143
suite.Require().Equal(verifier.srcStartAtTs, origStartTs)
144-
verifier.changeStreamFinalTsChan <- *origStartTs
144+
//verifier.changeStreamFinalTsChan <- *origStartTs
145+
verifier.changeStreamEnderChan <- struct{}{}
145146
<-verifier.changeStreamDoneChan
146147
suite.Require().Equal(verifier.srcStartAtTs, origStartTs)
147148
}
@@ -183,7 +184,8 @@ func (suite *IntegrationTestSuite) TestStartAtTimeWithChanges() {
183184
"session time after events should exceed the original",
184185
)
185186

186-
verifier.changeStreamFinalTsChan <- *postEventsSessionTime
187+
//verifier.changeStreamFinalTsChan <- *postEventsSessionTime
188+
verifier.changeStreamEnderChan <- struct{}{}
187189
<-verifier.changeStreamDoneChan
188190

189191
suite.Assert().Equal(

internal/verifier/check.go

Lines changed: 9 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -42,24 +42,13 @@ func (verifier *Verifier) Check(ctx context.Context, filter map[string]any) {
4242
verifier.MaybeStartPeriodicHeapProfileCollection(ctx)
4343
}
4444

45-
func (verifier *Verifier) waitForChangeStream(ctx context.Context) error {
45+
func (verifier *Verifier) waitForChangeStream() error {
4646
verifier.mux.RLock()
4747
csRunning := verifier.changeStreamRunning
4848
verifier.mux.RUnlock()
4949
if csRunning {
5050
verifier.logger.Debug().Msg("Changestream still running, signalling that writes are done and waiting for change stream to exit")
51-
52-
finalTs, err := GetNewClusterTime(
53-
ctx,
54-
verifier.logger,
55-
verifier.srcClient,
56-
)
57-
58-
if err != nil {
59-
return errors.Wrapf(err, "failed to fetch source's cluster time")
60-
}
61-
62-
verifier.changeStreamFinalTsChan <- finalTs
51+
verifier.changeStreamEnderChan <- struct{}{}
6352
select {
6453
case err := <-verifier.changeStreamErrChan:
6554
verifier.logger.Warn().Err(err).
@@ -77,7 +66,6 @@ func (verifier *Verifier) waitForChangeStream(ctx context.Context) error {
7766
func (verifier *Verifier) CheckWorker(ctx context.Context) error {
7867
verifier.logger.Debug().Msgf("Starting %d verification workers", verifier.numWorkers)
7968
ctx, cancel := context.WithCancel(ctx)
80-
8169
wg := sync.WaitGroup{}
8270
for i := 0; i < verifier.numWorkers; i++ {
8371
wg.Add(1)
@@ -186,9 +174,7 @@ func (verifier *Verifier) CheckDriver(ctx context.Context, filter map[string]any
186174
verifier.mux.RLock()
187175
csRunning := verifier.changeStreamRunning
188176
verifier.mux.RUnlock()
189-
if csRunning {
190-
verifier.logger.Debug().Msg("Check: Change stream already running.")
191-
} else {
177+
if !csRunning {
192178
verifier.logger.Debug().Msg("Change stream not running; starting change stream")
193179

194180
err = verifier.StartChangeStream(ctx)
@@ -256,7 +242,7 @@ func (verifier *Verifier) CheckDriver(ctx context.Context, filter map[string]any
256242
// It's necessary to wait for the change stream to finish before incrementing the
257243
// generation number, or the last changes will not be checked.
258244
verifier.mux.Unlock()
259-
err := verifier.waitForChangeStream(ctx)
245+
err := verifier.waitForChangeStream()
260246
if err != nil {
261247
return err
262248
}
@@ -402,15 +388,12 @@ func (verifier *Verifier) Work(ctx context.Context, workerNum int, wg *sync.Wait
402388
if errors.Is(err, mongo.ErrNoDocuments) {
403389
duration := verifier.workerSleepDelayMillis * time.Millisecond
404390

405-
if duration > 0 {
406-
verifier.logger.Debug().
407-
Int("workerNum", workerNum).
408-
Stringer("duration", duration).
409-
Msg("No tasks found. Sleeping.")
410-
411-
time.Sleep(duration)
412-
}
391+
verifier.logger.Debug().
392+
Int("workerNum", workerNum).
393+
Stringer("duration", duration).
394+
Msg("No tasks found. Sleeping.")
413395

396+
time.Sleep(duration)
414397
continue
415398
} else if err != nil {
416399
panic(err)

internal/verifier/migration_verifier.go

Lines changed: 30 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import (
2424
"github.com/10gen/migration-verifier/internal/uuidutil"
2525
"github.com/olekukonko/tablewriter"
2626
"github.com/pkg/errors"
27+
"github.com/rs/zerolog"
2728
"go.mongodb.org/mongo-driver/bson"
2829
"go.mongodb.org/mongo-driver/bson/primitive"
2930
"go.mongodb.org/mongo-driver/mongo"
@@ -48,6 +49,7 @@ const (
4849
SrcNamespaceField = "query_filter.namespace"
4950
DstNamespaceField = "query_filter.to"
5051
NumWorkers = 10
52+
refetch = "TODO_CHANGE_ME_REFETCH"
5153
Idle = "idle"
5254
Check = "check"
5355
Recheck = "recheck"
@@ -121,12 +123,12 @@ type Verifier struct {
121123
metaDBName string
122124
srcStartAtTs *primitive.Timestamp
123125

124-
mux sync.RWMutex
125-
changeStreamRunning bool
126-
changeStreamFinalTsChan chan primitive.Timestamp
127-
changeStreamErrChan chan error
128-
changeStreamDoneChan chan struct{}
129-
lastChangeEventTime *primitive.Timestamp
126+
mux sync.RWMutex
127+
changeStreamRunning bool
128+
changeStreamEnderChan chan struct{}
129+
changeStreamErrChan chan error
130+
changeStreamDoneChan chan struct{}
131+
lastChangeEventTime *primitive.Timestamp
130132

131133
readConcernSetting ReadConcernSetting
132134

@@ -186,15 +188,15 @@ func NewVerifier(settings VerifierSettings) *Verifier {
186188
}
187189

188190
return &Verifier{
189-
phase: Idle,
190-
numWorkers: NumWorkers,
191-
readPreference: readpref.Primary(),
192-
partitionSizeInBytes: 400 * 1024 * 1024,
193-
failureDisplaySize: DefaultFailureDisplaySize,
194-
changeStreamFinalTsChan: make(chan primitive.Timestamp),
195-
changeStreamErrChan: make(chan error),
196-
changeStreamDoneChan: make(chan struct{}),
197-
readConcernSetting: readConcern,
191+
phase: Idle,
192+
numWorkers: NumWorkers,
193+
readPreference: readpref.Primary(),
194+
partitionSizeInBytes: 400 * 1024 * 1024,
195+
failureDisplaySize: DefaultFailureDisplaySize,
196+
changeStreamEnderChan: make(chan struct{}),
197+
changeStreamErrChan: make(chan error),
198+
changeStreamDoneChan: make(chan struct{}),
199+
readConcernSetting: readConcern,
198200

199201
// This will get recreated once gen0 starts, but we want it
200202
// here in case the change streams gets an event before then.
@@ -313,7 +315,15 @@ func (verifier *Verifier) SetPartitionSizeMB(partitionSizeMB uint32) {
313315
}
314316

315317
func (verifier *Verifier) SetLogger(logPath string) {
316-
verifier.logger, verifier.writer = getLoggerAndWriter(logPath)
318+
writer := getLogWriter(logPath)
319+
verifier.writer = writer
320+
321+
consoleWriter := zerolog.ConsoleWriter{
322+
Out: writer,
323+
TimeFormat: timeFormat,
324+
}
325+
l := zerolog.New(consoleWriter).With().Timestamp().Logger()
326+
verifier.logger = logger.NewLogger(&l, writer)
317327
}
318328

319329
func (verifier *Verifier) SetSrcNamespaces(arg []string) {
@@ -1162,6 +1172,10 @@ func (verifier *Verifier) verificationTaskCollection() *mongo.Collection {
11621172
return verifier.verificationDatabase().Collection(verificationTasksCollection)
11631173
}
11641174

1175+
func (verifier *Verifier) refetchCollection() *mongo.Collection {
1176+
return verifier.verificationDatabase().Collection(refetch)
1177+
}
1178+
11651179
func (verifier *Verifier) srcClientDatabase(dbName string) *mongo.Database {
11661180
db := verifier.srcClient.Database(dbName)
11671181
// No need to check the write concern because we do not write to the source database.

0 commit comments

Comments
 (0)