@powersync/service-module-mongodb 0.16.0 → 0.18.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (34) hide show
  1. package/CHANGELOG.md +51 -0
  2. package/dist/api/MongoRouteAPIAdapter.d.ts +2 -2
  3. package/dist/api/MongoRouteAPIAdapter.js +12 -21
  4. package/dist/api/MongoRouteAPIAdapter.js.map +1 -1
  5. package/dist/replication/ChangeStream.d.ts +19 -37
  6. package/dist/replication/ChangeStream.js +157 -362
  7. package/dist/replication/ChangeStream.js.map +1 -1
  8. package/dist/replication/ChangeStreamReplicationJob.js +1 -1
  9. package/dist/replication/ChangeStreamReplicationJob.js.map +1 -1
  10. package/dist/replication/ChangeStreamReplicator.js +1 -1
  11. package/dist/replication/ChangeStreamReplicator.js.map +1 -1
  12. package/dist/replication/MongoRelation.d.ts +1 -1
  13. package/dist/replication/MongoRelation.js +41 -21
  14. package/dist/replication/MongoRelation.js.map +1 -1
  15. package/dist/replication/MongoSnapshotter.d.ts +80 -0
  16. package/dist/replication/MongoSnapshotter.js +585 -0
  17. package/dist/replication/MongoSnapshotter.js.map +1 -0
  18. package/dist/types/types.d.ts +2 -2
  19. package/package.json +11 -21
  20. package/src/api/MongoRouteAPIAdapter.ts +14 -22
  21. package/src/replication/ChangeStream.ts +173 -439
  22. package/src/replication/ChangeStreamReplicationJob.ts +1 -1
  23. package/src/replication/ChangeStreamReplicator.ts +1 -1
  24. package/src/replication/MongoRelation.ts +51 -25
  25. package/src/replication/MongoSnapshotter.ts +719 -0
  26. package/test/src/change_stream.test.ts +214 -20
  27. package/test/src/change_stream_utils.ts +41 -34
  28. package/test/src/checkpoint_retry.test.ts +131 -0
  29. package/test/src/resume.test.ts +2 -2
  30. package/test/src/resuming_snapshots.test.ts +10 -6
  31. package/test/src/util.ts +2 -1
  32. package/tsconfig.json +1 -4
  33. package/tsconfig.scripts.json +1 -2
  34. package/tsconfig.tsbuildinfo +1 -1
@@ -0,0 +1,585 @@
1
+ import { container, ErrorCode, ReplicationAbortedError, ServiceError } from '@powersync/lib-services-framework';
2
+ import { PerformanceTracer, SaveOperationTag } from '@powersync/service-core';
3
+ import { ReplicationMetric } from '@powersync/service-types';
4
+ import { performance } from 'node:perf_hooks';
5
+ import { MongoLSN } from '../common/MongoLSN.js';
6
+ import { PostImagesOption } from '../types/types.js';
7
+ import { escapeRegExp } from '../utils.js';
8
+ import { createCheckpoint, getMongoRelation, STANDALONE_CHECKPOINT_ID } from './MongoRelation.js';
9
+ import { ChunkedSnapshotQuery } from './MongoSnapshotQuery.js';
10
+ import { parseChangeDocument, rawChangeStream } from './RawChangeStream.js';
11
+ import { CHECKPOINTS_COLLECTION } from './replication-utils.js';
12
+ import { DirectSourceRowConverter } from './SourceRowConverter.js';
13
+ export class MongoSnapshotter {
14
+ storage;
15
+ metrics;
16
+ connections;
17
+ client;
18
+ defaultDb;
19
+ syncRules;
20
+ sourceRowConverter;
21
+ maxAwaitTimeMS;
22
+ snapshotChunkLength;
23
+ abortSignal;
24
+ logger;
25
+ checkpointStreamId;
26
+ storageHooks;
27
+ snapshotHooks;
28
+ changeStreamTimeout;
29
+ connectionId = 1;
30
+ queue = new Set();
31
+ initialSnapshotDone = Promise.withResolvers();
32
+ nextItemQueued = null;
33
+ lastTouchedAt = performance.now();
34
+ constructor(options) {
35
+ this.storage = options.storage;
36
+ this.metrics = options.metrics;
37
+ this.connections = options.connections;
38
+ this.client = options.connections.client;
39
+ this.defaultDb = options.connections.db;
40
+ this.maxAwaitTimeMS = options.maxAwaitTimeMS ?? 10_000;
41
+ this.snapshotChunkLength = options.snapshotChunkLength ?? 6_000;
42
+ this.abortSignal = options.abortSignal;
43
+ this.logger = options.logger ?? options.storage.logger;
44
+ this.checkpointStreamId = options.checkpointStreamId;
45
+ this.storageHooks = options.storageHooks;
46
+ this.snapshotHooks = options.snapshotHooks;
47
+ this.changeStreamTimeout = Math.ceil(this.client.options.socketTimeoutMS * 0.9);
48
+ this.syncRules = options.storage.getParsedSyncRules({
49
+ defaultSchema: this.defaultDb.databaseName
50
+ });
51
+ this.sourceRowConverter = new DirectSourceRowConverter(this.syncRules.compatibility);
52
+ this.abortSignal.addEventListener('abort', () => {
53
+ this.nextItemQueued?.resolve();
54
+ });
55
+ }
56
+ get usePostImages() {
57
+ return this.connections.options.postImages != PostImagesOption.OFF;
58
+ }
59
+ get configurePostImages() {
60
+ return this.connections.options.postImages == PostImagesOption.AUTO_CONFIGURE;
61
+ }
62
+ get supportsConcurrentSnapshots() {
63
+ return this.storage.storageConfig.softDeleteCurrentData;
64
+ }
65
+ async checkSlot() {
66
+ const status = await this.storage.getStatus();
67
+ if (status.snapshotDone) {
68
+ this.logger.info(`Initial replication already done`);
69
+ return { needsInitialSync: false, snapshotLsn: null };
70
+ }
71
+ return { needsInitialSync: true, snapshotLsn: status.resumeLsn };
72
+ }
73
+ async setupCheckpointsCollection() {
74
+ const collection = await this.getCollectionInfo(this.defaultDb.databaseName, CHECKPOINTS_COLLECTION);
75
+ if (collection == null) {
76
+ await this.defaultDb.createCollection(CHECKPOINTS_COLLECTION, {
77
+ changeStreamPreAndPostImages: { enabled: true }
78
+ });
79
+ }
80
+ else if (this.usePostImages && collection.options?.changeStreamPreAndPostImages?.enabled != true) {
81
+ // Drop + create requires less permissions than collMod,
82
+ // and we don't care about the data in this collection.
83
+ await this.defaultDb.dropCollection(CHECKPOINTS_COLLECTION);
84
+ await this.defaultDb.createCollection(CHECKPOINTS_COLLECTION, {
85
+ changeStreamPreAndPostImages: { enabled: true }
86
+ });
87
+ }
88
+ else {
89
+ // Clear the collection on startup, to keep it clean
90
+ // We never query this collection directly, and don't want to keep the data around.
91
+ // We only use this to get data into the oplog/changestream.
92
+ await this.defaultDb.collection(CHECKPOINTS_COLLECTION).deleteMany({});
93
+ }
94
+ }
95
+ async queueSnapshotTables(snapshotLsn) {
96
+ await this.client.connect();
97
+ await using writer = await this.storage.createWriter({
98
+ zeroLSN: MongoLSN.ZERO.comparable,
99
+ defaultSchema: this.defaultDb.databaseName,
100
+ storeCurrentData: false,
101
+ skipExistingRows: true,
102
+ tracer: new PerformanceTracer('MongoDB initial snapshot setup')
103
+ });
104
+ if (snapshotLsn == null) {
105
+ // First replication attempt - get a snapshot and store the timestamp
106
+ snapshotLsn = await this.getSnapshotLsn();
107
+ await writer.setResumeLsn(snapshotLsn);
108
+ this.logger.info(`Marking snapshot at ${snapshotLsn}`);
109
+ }
110
+ else {
111
+ this.logger.info(`Resuming snapshot at ${snapshotLsn}`);
112
+ // Check that the snapshot is still valid.
113
+ await this.validateSnapshotLsn(snapshotLsn);
114
+ }
115
+ // Start by resolving all tables.
116
+ // This checks postImage configuration, and that should fail as
117
+ // early as possible.
118
+ const allSourceTables = [];
119
+ for (const tablePattern of this.syncRules.getSourceTables()) {
120
+ allSourceTables.push(...(await this.resolveQualifiedTableNames(writer, tablePattern)));
121
+ }
122
+ for (const table of allSourceTables) {
123
+ if (table.snapshotComplete) {
124
+ this.logger.info(`Skipping ${table.qualifiedName} - snapshot already done`);
125
+ continue;
126
+ }
127
+ const count = await this.estimatedCountNumber(table);
128
+ const updated = await writer.updateTableProgress(table, {
129
+ totalEstimatedCount: count
130
+ });
131
+ this.queueTable(updated);
132
+ this.logger.info(`To replicate: ${updated.qualifiedName}: ${updated.snapshotStatus?.replicatedCount}/~${updated.snapshotStatus?.totalEstimatedCount}`);
133
+ }
134
+ }
135
+ async waitForInitialSnapshot() {
136
+ await this.initialSnapshotDone.promise;
137
+ }
138
+ async replicationLoop() {
139
+ try {
140
+ if (this.queue.size == 0) {
141
+ // Special case where we start with no tables to snapshot
142
+ await this.markSnapshotDone();
143
+ }
144
+ while (!this.abortSignal.aborted) {
145
+ const item = this.queue.values().next().value;
146
+ if (item == null) {
147
+ this.initialSnapshotDone.resolve();
148
+ this.nextItemQueued = Promise.withResolvers();
149
+ await this.nextItemQueued.promise;
150
+ this.nextItemQueued = null;
151
+ continue;
152
+ }
153
+ await item.ready;
154
+ if (!item.cancelled) {
155
+ await this.replicateTable(item.table);
156
+ }
157
+ this.queue.delete(item);
158
+ if (this.queue.size == 0) {
159
+ await this.markSnapshotDone();
160
+ }
161
+ }
162
+ throw new ReplicationAbortedError(`Replication snapshotter aborted`, this.abortSignal.reason);
163
+ }
164
+ catch (e) {
165
+ // If initial snapshot already completed, this has no effect
166
+ this.initialSnapshotDone.reject(e);
167
+ throw e;
168
+ }
169
+ }
170
+ async queueSnapshot(batch, table) {
171
+ const ready = Promise.withResolvers();
172
+ const item = this.queueTable(table, ready.promise);
173
+ try {
174
+ await batch.markTableSnapshotRequired(table);
175
+ ready.resolve();
176
+ }
177
+ catch (e) {
178
+ item.cancelled = true;
179
+ ready.resolve();
180
+ throw e;
181
+ }
182
+ finally {
183
+ this.nextItemQueued?.resolve();
184
+ }
185
+ }
186
+ /**
187
+ * Snapshot tables.
188
+ *
189
+ * If concurrency is supported, the snapshots are queued and processed in the background.
190
+ * Otherwise, snapshots are processed inline.
191
+ */
192
+ async snapshotTables(batch, tables) {
193
+ if (this.supportsConcurrentSnapshots) {
194
+ // Queue concurrent snapshots
195
+ for (const tableToSnapshot of tables) {
196
+ await this.queueSnapshot(batch, tableToSnapshot);
197
+ }
198
+ }
199
+ else {
200
+ // No concurrency supported - snapshot inline
201
+ // Truncate in case a previous inline snapshot was interrupted after flushing rows, but before
202
+ // recording snapshot progress. Without this, resuming can replay already-flushed rows on v1/v2 storage.
203
+ await batch.truncate(tables);
204
+ for (const table of tables) {
205
+ await this.snapshotTable(batch, table);
206
+ }
207
+ const noCheckpointBefore = await createCheckpoint(this.client, this.defaultDb, STANDALONE_CHECKPOINT_ID);
208
+ await batch.markTableSnapshotDone(tables, noCheckpointBefore);
209
+ }
210
+ }
211
+ queueTable(table, ready = Promise.resolve()) {
212
+ const item = { table, ready, cancelled: false };
213
+ this.queue.add(item);
214
+ this.nextItemQueued?.resolve();
215
+ return item;
216
+ }
217
+ async markSnapshotDone() {
218
+ if (this.queue.size != 0) {
219
+ return;
220
+ }
221
+ const status = await this.storage.getStatus();
222
+ if (status.snapshotDone) {
223
+ return;
224
+ }
225
+ // Populate the cache _after_ initial replication, but _before_ we switch to this replication stream.
226
+ // Keeping snapshot_done false until this completes makes this resumable after interruption.
227
+ // No checkpoint exists yet - storage defaults to its highest persisted op id.
228
+ await this.storage.populatePersistentChecksumCache({
229
+ signal: this.abortSignal
230
+ });
231
+ if (this.queue.size != 0) {
232
+ return;
233
+ }
234
+ await using writer = await this.storage.createWriter({
235
+ logger: this.logger,
236
+ zeroLSN: MongoLSN.ZERO.comparable,
237
+ defaultSchema: this.defaultDb.databaseName,
238
+ storeCurrentData: false,
239
+ skipExistingRows: true
240
+ });
241
+ // The checkpoint here is a marker - we need to replicate up to at least this
242
+ // point before the data can be considered consistent.
243
+ const checkpoint = await createCheckpoint(this.client, this.defaultDb, STANDALONE_CHECKPOINT_ID);
244
+ if (this.queue.size != 0) {
245
+ return;
246
+ }
247
+ await writer.markSnapshotDone(checkpoint, {
248
+ // If there is a conflict, we'll try again after the next snapshot
249
+ throwOnConflict: false
250
+ });
251
+ // KLUDGE: We need to create an extra checkpoint _after_ marking the snapshot done, to fix
252
+ // issues with order of processing commits(). This is picked up by tests on postgres storage,
253
+ // the issue may be specific to that storage engine.
254
+ await createCheckpoint(this.client, this.defaultDb, STANDALONE_CHECKPOINT_ID);
255
+ }
256
+ async replicateTable(tableRequest) {
257
+ await this.snapshotHooks?.beforeSnapshotStarted?.(tableRequest);
258
+ await using writer = await this.storage.createWriter({
259
+ logger: this.logger,
260
+ zeroLSN: MongoLSN.ZERO.comparable,
261
+ defaultSchema: this.defaultDb.databaseName,
262
+ storeCurrentData: false,
263
+ skipExistingRows: true,
264
+ hooks: this.storageHooks,
265
+ tracer: new PerformanceTracer('MongoDB snapshot table')
266
+ });
267
+ // Get fresh table info, in case it was updated while queuing.
268
+ // This deliberately does not resolve by namespace, since that could recreate a replacement source table
269
+ // for a dropped/recreated collection and leave the original queued snapshot with no owner.
270
+ const table = await writer.getSourceTableStatus(tableRequest);
271
+ if (table == null || table.snapshotComplete) {
272
+ return;
273
+ }
274
+ await this.snapshotTable(writer, table);
275
+ const noCheckpointBefore = await createCheckpoint(this.client, this.defaultDb, STANDALONE_CHECKPOINT_ID);
276
+ await writer.markTableSnapshotDone([table], noCheckpointBefore);
277
+ // This commit durably records the persisted ops, so a later checkpoint covers them.
278
+ const resumeLsn = writer.resumeFromLsn ?? MongoLSN.ZERO.comparable;
279
+ await writer.commit(resumeLsn);
280
+ this.logger.info(`Flushed snapshot at ${writer.last_flushed_op}`);
281
+ }
282
+ async resolveQualifiedTableNames(batch, tablePattern) {
283
+ const schema = tablePattern.schema;
284
+ if (tablePattern.connectionTag != this.connections.connectionTag) {
285
+ return [];
286
+ }
287
+ const nameFilter = tablePattern.isWildcard
288
+ ? new RegExp('^' + escapeRegExp(tablePattern.tablePrefix))
289
+ : tablePattern.name;
290
+ // Check if the collection exists
291
+ const collections = await this.client
292
+ .db(schema)
293
+ .listCollections({ name: nameFilter }, { nameOnly: false })
294
+ .toArray();
295
+ if (!tablePattern.isWildcard && collections.length == 0) {
296
+ this.logger.warn(`Collection ${schema}.${tablePattern.name} not found`);
297
+ }
298
+ const result = [];
299
+ for (const collection of collections) {
300
+ result.push(...(await this.handleRelation(batch, getMongoRelation({ db: schema, coll: collection.name }, this.connections.connectionTag), {
301
+ collectionInfo: collection
302
+ })));
303
+ }
304
+ return result;
305
+ }
306
+ async snapshotTable(batch, table) {
307
+ const rowsReplicatedMetric = this.metrics.getCounter(ReplicationMetric.ROWS_REPLICATED);
308
+ const bytesReplicatedMetric = this.metrics.getCounter(ReplicationMetric.DATA_REPLICATED_BYTES);
309
+ const chunksReplicatedMetric = this.metrics.getCounter(ReplicationMetric.CHUNKS_REPLICATED);
310
+ const totalEstimatedCount = await this.estimatedCountNumber(table);
311
+ let at = table.snapshotStatus?.replicatedCount ?? 0;
312
+ const collection = this.client.db(table.schema).collection(table.name);
313
+ await using query = new ChunkedSnapshotQuery({
314
+ collection,
315
+ key: table.snapshotStatus?.lastKey,
316
+ batchSize: this.snapshotChunkLength
317
+ });
318
+ if (query.lastKey != null) {
319
+ this.logger.info(`Replicating ${table.qualifiedName} ${table.formatSnapshotProgress()} - resuming at _id > ${query.lastKey}`);
320
+ }
321
+ else {
322
+ this.logger.info(`Replicating ${table.qualifiedName} ${table.formatSnapshotProgress()}`);
323
+ }
324
+ let lastBatch = performance.now();
325
+ let nextChunkPromise = query.nextChunk();
326
+ while (true) {
327
+ const { docs: docBatch, lastKey, bytes: chunkBytes } = await nextChunkPromise;
328
+ if (docBatch.length == 0) {
329
+ // No more data - stop iterating
330
+ break;
331
+ }
332
+ bytesReplicatedMetric.add(chunkBytes);
333
+ chunksReplicatedMetric.add(1);
334
+ if (this.abortSignal.aborted) {
335
+ throw new ReplicationAbortedError(`Aborted initial replication`, this.abortSignal.reason);
336
+ }
337
+ // Pre-fetch next batch, so that we can read and write concurrently
338
+ nextChunkPromise = query.nextChunk();
339
+ for (const buffer of docBatch) {
340
+ const { row, replicaId } = this.sourceRowConverter.rawToSqliteRow(buffer);
341
+ // This auto-flushes when the batch reaches its size limit
342
+ await batch.save({
343
+ tag: SaveOperationTag.INSERT,
344
+ sourceTable: table,
345
+ before: undefined,
346
+ beforeReplicaId: undefined,
347
+ after: row,
348
+ afterReplicaId: replicaId
349
+ });
350
+ }
351
+ // Important: flush before marking progress
352
+ await batch.flush();
353
+ at += docBatch.length;
354
+ rowsReplicatedMetric.add(docBatch.length);
355
+ table = await batch.updateTableProgress(table, {
356
+ lastKey,
357
+ replicatedCount: at,
358
+ totalEstimatedCount
359
+ });
360
+ const duration = performance.now() - lastBatch;
361
+ lastBatch = performance.now();
362
+ this.logger.info(`Replicating ${table.qualifiedName} ${table.formatSnapshotProgress()} in ${duration.toFixed(0)}ms`);
363
+ this.touch();
364
+ }
365
+ // In case the loop was interrupted, make sure we await the last promise.
366
+ await nextChunkPromise;
367
+ }
368
+ async handleRelation(batch, descriptor, options) {
369
+ if (options.collectionInfo != null) {
370
+ await this.checkPostImages(descriptor.schema, options.collectionInfo);
371
+ }
372
+ else {
373
+ // If collectionInfo is null, the collection may have been dropped.
374
+ // Ignore the postImages check in this case.
375
+ }
376
+ // Note: resolveTables uses the batch's own parsed sync config set. Passing
377
+ // this.syncRules here would pair sources from one parse with the batch's mapping
378
+ // from another parse.
379
+ const result = await batch.resolveTables({
380
+ connection_id: this.connectionId,
381
+ source: descriptor
382
+ });
383
+ // Drop conflicting collections.
384
+ // This is generally not expected for MongoDB source dbs, so we log an error.
385
+ if (result.dropTables.length > 0) {
386
+ this.logger.error(`Conflicting collections found for ${JSON.stringify(descriptor)}. Dropping: ${result.dropTables.map((t) => t.id).join(', ')}`);
387
+ await batch.drop(result.dropTables);
388
+ }
389
+ return result.tables;
390
+ }
391
+ async estimatedCountNumber(table) {
392
+ return await this.client.db(table.schema).collection(table.name).estimatedDocumentCount();
393
+ }
394
+ async getCollectionInfo(db, name) {
395
+ return (await this.client.db(db).listCollections({ name }, { nameOnly: false }).toArray())[0];
396
+ }
397
+ async checkPostImages(db, collectionInfo) {
398
+ if (!this.usePostImages) {
399
+ // Nothing to check
400
+ return;
401
+ }
402
+ const enabled = collectionInfo.options?.changeStreamPreAndPostImages?.enabled == true;
403
+ if (!enabled && this.configurePostImages) {
404
+ await this.client.db(db).command({
405
+ collMod: collectionInfo.name,
406
+ changeStreamPreAndPostImages: { enabled: true }
407
+ });
408
+ this.logger.info(`Enabled postImages on ${db}.${collectionInfo.name}`);
409
+ }
410
+ else if (!enabled) {
411
+ throw new ServiceError(ErrorCode.PSYNC_S1343, `postImages not enabled on ${db}.${collectionInfo.name}`);
412
+ }
413
+ }
414
+ async getSnapshotLsn() {
415
+ const hello = await this.defaultDb.command({ hello: 1 });
416
+ // Basic sanity check
417
+ if (hello.msg == 'isdbgrid') {
418
+ throw new ServiceError(ErrorCode.PSYNC_S1341, 'Sharded MongoDB Clusters are not supported yet (including MongoDB Serverless instances).');
419
+ }
420
+ else if (hello.setName == null) {
421
+ throw new ServiceError(ErrorCode.PSYNC_S1342, 'Standalone MongoDB instances are not supported - use a replicaset.');
422
+ }
423
+ // Open a change stream just to get a resume token for later use.
424
+ // We could use clusterTime from the hello command, but that won't tell us if the
425
+ // snapshot isn't valid anymore.
426
+ // If we just use the first resumeToken from the stream, we get two potential issues:
427
+ // 1. The resumeToken may just be a wrapped clusterTime, which does not detect changes
428
+ // in source db or other stream issues.
429
+ // 2. The first actual change we get may have the same clusterTime, causing us to incorrect
430
+ // skip that event.
431
+ // Instead, we create a new checkpoint document, and wait until we get that document back in the stream.
432
+ // To avoid potential race conditions with the checkpoint creation, we create a new checkpoint document
433
+ // periodically until the timeout is reached.
434
+ const LSN_TIMEOUT_SECONDS = 60;
435
+ const LSN_CREATE_INTERVAL_SECONDS = 1;
436
+ const firstCheckpointLsn = await createCheckpoint(this.client, this.defaultDb, this.checkpointStreamId);
437
+ const filters = this.getSourceNamespaceFilters();
438
+ const iter = this.rawChangeStreamBatches({
439
+ lsn: firstCheckpointLsn,
440
+ maxAwaitTimeMS: 0,
441
+ signal: this.abortSignal,
442
+ filters
443
+ });
444
+ const startTime = performance.now();
445
+ let lastCheckpointCreated = performance.now();
446
+ let eventsSeen = 0;
447
+ let batchesSeen = 0;
448
+ for await (const { events } of iter) {
449
+ if (performance.now() - startTime >= LSN_TIMEOUT_SECONDS * 1000) {
450
+ break;
451
+ }
452
+ if (performance.now() - lastCheckpointCreated >= LSN_CREATE_INTERVAL_SECONDS * 1000) {
453
+ await createCheckpoint(this.client, this.defaultDb, this.checkpointStreamId);
454
+ lastCheckpointCreated = performance.now();
455
+ }
456
+ batchesSeen += 1;
457
+ for (const rawChangeDocument of events) {
458
+ const changeDocument = parseChangeDocument(rawChangeDocument);
459
+ const ns = 'ns' in changeDocument && 'coll' in changeDocument.ns ? changeDocument.ns : undefined;
460
+ if (ns?.coll == CHECKPOINTS_COLLECTION && 'documentKey' in changeDocument) {
461
+ const checkpointId = changeDocument.documentKey._id;
462
+ if (!this.checkpointStreamId.equals(checkpointId)) {
463
+ continue;
464
+ }
465
+ return new MongoLSN({
466
+ timestamp: changeDocument.clusterTime,
467
+ resume_token: changeDocument._id
468
+ }).comparable;
469
+ }
470
+ eventsSeen += 1;
471
+ }
472
+ }
473
+ // Could happen if there is a very large replication lag?
474
+ throw new ServiceError(ErrorCode.PSYNC_S1301, `Timeout after while waiting for checkpoint document for ${LSN_TIMEOUT_SECONDS}s. Streamed events = ${eventsSeen}, batches = ${batchesSeen}`);
475
+ }
476
+ /**
477
+ * Given a snapshot LSN, validate that we can read from it, by opening a change stream.
478
+ */
479
+ async validateSnapshotLsn(lsn) {
480
+ const stream = this.rawChangeStreamBatches({
481
+ lsn,
482
+ maxAwaitTimeMS: 0,
483
+ filters: this.getSourceNamespaceFilters()
484
+ });
485
+ for await (const _batch of stream) {
486
+ break;
487
+ }
488
+ }
489
+ getSourceNamespaceFilters() {
490
+ const sourceTables = this.syncRules.getSourceTables();
491
+ const inFilters = [
492
+ { db: this.defaultDb.databaseName, coll: CHECKPOINTS_COLLECTION }
493
+ ];
494
+ const regexFilters = [];
495
+ let multipleDatabases = false;
496
+ for (const tablePattern of sourceTables) {
497
+ if (tablePattern.connectionTag != this.connections.connectionTag) {
498
+ continue;
499
+ }
500
+ if (tablePattern.schema != this.defaultDb.databaseName) {
501
+ multipleDatabases = true;
502
+ }
503
+ if (tablePattern.isWildcard) {
504
+ regexFilters.push({
505
+ 'ns.db': tablePattern.schema,
506
+ 'ns.coll': new RegExp('^' + escapeRegExp(tablePattern.tablePrefix))
507
+ });
508
+ }
509
+ else {
510
+ inFilters.push({
511
+ db: tablePattern.schema,
512
+ coll: tablePattern.name
513
+ });
514
+ }
515
+ }
516
+ const nsFilter = multipleDatabases
517
+ ? { ns: { $in: inFilters } }
518
+ : { 'ns.coll': { $in: inFilters.map((ns) => ns.coll) } };
519
+ if (regexFilters.length > 0) {
520
+ return { $match: { $or: [nsFilter, ...regexFilters] }, multipleDatabases };
521
+ }
522
+ return { $match: nsFilter, multipleDatabases };
523
+ }
524
+ rawChangeStreamBatches(options) {
525
+ const lastLsn = options.lsn ? MongoLSN.fromSerialized(options.lsn) : null;
526
+ const startAfter = lastLsn?.timestamp;
527
+ const resumeAfter = lastLsn?.resumeToken;
528
+ let fullDocument;
529
+ if (this.usePostImages) {
530
+ // 'read_only' or 'auto_configure'
531
+ // Configuration happens during snapshot, or when we see new
532
+ // collections.
533
+ fullDocument = 'required';
534
+ }
535
+ else {
536
+ fullDocument = 'updateLookup';
537
+ }
538
+ const streamOptions = {
539
+ showExpandedEvents: true,
540
+ fullDocument
541
+ };
542
+ const pipeline = [
543
+ { $changeStream: streamOptions },
544
+ { $match: options.filters.$match },
545
+ { $changeStreamSplitLargeEvent: {} }
546
+ ];
547
+ // Only one of these options can be supplied at a time.
548
+ if (resumeAfter) {
549
+ streamOptions.resumeAfter = resumeAfter;
550
+ }
551
+ else {
552
+ // Legacy: We don't persist lsns without resumeTokens anymore, but we do still handle the
553
+ // case if we have an old one.
554
+ streamOptions.startAtOperationTime = startAfter;
555
+ }
556
+ let watchDb;
557
+ if (options.filters.multipleDatabases) {
558
+ // Requires readAnyDatabase@admin on Atlas
559
+ watchDb = this.client.db('admin');
560
+ streamOptions.allChangesForCluster = true;
561
+ }
562
+ else {
563
+ // Same general result, but requires less permissions than the above
564
+ watchDb = this.defaultDb;
565
+ }
566
+ return rawChangeStream(watchDb, pipeline, {
567
+ batchSize: options.batchSize ?? this.snapshotChunkLength,
568
+ maxAwaitTimeMS: options.maxAwaitTimeMS ?? this.maxAwaitTimeMS,
569
+ maxTimeMS: this.changeStreamTimeout,
570
+ signal: options.signal,
571
+ logger: this.logger,
572
+ tracer: options.tracer
573
+ });
574
+ }
575
+ touch() {
576
+ if (performance.now() - this.lastTouchedAt > 1_000) {
577
+ this.lastTouchedAt = performance.now();
578
+ // Update the probes, but don't wait for it
579
+ container.probes.touch().catch((e) => {
580
+ this.logger.error(`Failed to touch the container probe: ${e.message}`, e);
581
+ });
582
+ }
583
+ }
584
+ }
585
+ //# sourceMappingURL=MongoSnapshotter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MongoSnapshotter.js","sourceRoot":"","sources":["../../src/replication/MongoSnapshotter.ts"],"names":[],"mappings":"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"}
@@ -51,8 +51,8 @@ export declare const MongoConnectionConfig: t.Intersection<t.Codec<{
51
51
  tag?: string | undefined;
52
52
  debug_api?: boolean | undefined;
53
53
  } & {
54
- uri: string;
55
54
  type: "mongodb";
55
+ uri: string;
56
56
  database?: string | undefined;
57
57
  username?: string | undefined;
58
58
  password?: string | undefined;
@@ -63,8 +63,8 @@ export declare const MongoConnectionConfig: t.Intersection<t.Codec<{
63
63
  tag?: string | undefined;
64
64
  debug_api?: boolean | undefined;
65
65
  } & {
66
- uri: string;
67
66
  type: "mongodb";
67
+ uri: string;
68
68
  database?: string | undefined;
69
69
  username?: string | undefined;
70
70
  password?: string | undefined;