77
88 "github.com/10gen/migration-verifier/internal/keystring"
99 "github.com/10gen/migration-verifier/internal/logger"
10+ "github.com/10gen/migration-verifier/internal/replay"
1011 "github.com/10gen/migration-verifier/internal/retry"
1112 "github.com/10gen/migration-verifier/internal/util"
1213 "github.com/10gen/migration-verifier/msync"
@@ -68,7 +69,8 @@ type ChangeStreamReader struct {
6869
6970 changeStreamRunning bool
7071 changeEventBatchChan chan []ParsedEvent
71- writesOffTsChan chan primitive.Timestamp
72+ writesOffTsChan <- chan primitive.Timestamp
73+ writesOffTsWriteFunc func (primitive.Timestamp )
7274 errChan chan error
7375 doneChan chan struct {}
7476
@@ -77,7 +79,9 @@ type ChangeStreamReader struct {
7779 lag * msync.TypedAtomic [option.Option [time.Duration ]]
7880}
7981
80- func (verifier * Verifier ) initializeChangeStreamReaders () {
82+ func (verifier * Verifier ) initializeChangeStreamReaders (ctx context.Context ) {
83+ srcWritesOffReaderChan , srcWritesOffWriter := replay.CreateChannel [primitive.Timestamp ](ctx )
84+
8185 verifier .srcChangeStreamReader = & ChangeStreamReader {
8286 readerType : src ,
8387 logger : verifier .logger ,
@@ -87,11 +91,15 @@ func (verifier *Verifier) initializeChangeStreamReaders() {
8791 clusterInfo : * verifier .srcClusterInfo ,
8892 changeStreamRunning : false ,
8993 changeEventBatchChan : make (chan []ParsedEvent ),
90- writesOffTsChan : make (chan primitive.Timestamp ),
94+ writesOffTsChan : srcWritesOffReaderChan ,
95+ writesOffTsWriteFunc : srcWritesOffWriter ,
9196 errChan : make (chan error ),
9297 doneChan : make (chan struct {}),
9398 lag : msync .NewTypedAtomic (option .None [time.Duration ]()),
9499 }
100+
101+ dstWritesOffReaderChan , dstWritesOffWriter := replay.CreateChannel [primitive.Timestamp ](ctx )
102+
95103 verifier .dstChangeStreamReader = & ChangeStreamReader {
96104 readerType : dst ,
97105 logger : verifier .logger ,
@@ -101,7 +109,8 @@ func (verifier *Verifier) initializeChangeStreamReaders() {
101109 clusterInfo : * verifier .dstClusterInfo ,
102110 changeStreamRunning : false ,
103111 changeEventBatchChan : make (chan []ParsedEvent ),
104- writesOffTsChan : make (chan primitive.Timestamp ),
112+ writesOffTsChan : dstWritesOffReaderChan ,
113+ writesOffTsWriteFunc : dstWritesOffWriter ,
105114 errChan : make (chan error ),
106115 doneChan : make (chan struct {}),
107116 lag : msync .NewTypedAtomic (option .None [time.Duration ]()),
@@ -123,7 +132,6 @@ func (verifier *Verifier) StartChangeEventHandler(ctx context.Context, reader *C
123132 verifier .logger .Trace ().Msgf ("Verifier is handling a change event batch from %s: %v" , reader , batch )
124133 err := verifier .HandleChangeStreamEvents (ctx , batch , reader .readerType )
125134 if err != nil {
126- reader .errChan <- err
127135 return err
128136 }
129137 }
@@ -355,7 +363,10 @@ func (csr *ChangeStreamReader) iterateChangeStream(
355363 // source writes are ended and the migration tool is finished / committed.
356364 // This means we should exit rather than continue reading the change stream
357365 // since there should be no more events.
358- case writesOffTs := <- csr .writesOffTsChan :
366+ case writesOffTs , more := <- csr .writesOffTsChan :
367+ if ! more {
368+ panic (csr .String () + ": attempted read from already-closed writesOffTsChan" )
369+ }
359370 csr .logger .Debug ().
360371 Interface ("writesOffTimestamp" , writesOffTs ).
361372 Msgf ("%s thread received writesOff timestamp. Finalizing change stream." , csr )
@@ -408,7 +419,8 @@ func (csr *ChangeStreamReader) iterateChangeStream(
408419 }
409420 // since we have started Recheck, we must signal that we have
410421 // finished the change stream changes so that Recheck can continue.
411- csr .doneChan <- struct {}{}
422+ close (csr .doneChan )
423+
412424 break
413425 }
414426 }
0 commit comments