@powersync/service-module-mongodb-storage 0.12.6 → 0.12.8

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 (29) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/dist/migrations/db/migrations/1760433882550-bucket-state-index2.d.ts +3 -0
  3. package/dist/migrations/db/migrations/1760433882550-bucket-state-index2.js +25 -0
  4. package/dist/migrations/db/migrations/1760433882550-bucket-state-index2.js.map +1 -0
  5. package/dist/storage/implementation/MongoCompactor.d.ts +13 -3
  6. package/dist/storage/implementation/MongoCompactor.js +86 -90
  7. package/dist/storage/implementation/MongoCompactor.js.map +1 -1
  8. package/dist/storage/implementation/MongoSyncBucketStorage.d.ts +2 -2
  9. package/dist/storage/implementation/MongoSyncBucketStorage.js +61 -18
  10. package/dist/storage/implementation/MongoSyncBucketStorage.js.map +1 -1
  11. package/dist/storage/implementation/MongoTestStorageFactoryGenerator.js +1 -0
  12. package/dist/storage/implementation/MongoTestStorageFactoryGenerator.js.map +1 -1
  13. package/dist/storage/implementation/MongoWriteCheckpointAPI.js +6 -2
  14. package/dist/storage/implementation/MongoWriteCheckpointAPI.js.map +1 -1
  15. package/dist/storage/implementation/db.d.ts +4 -0
  16. package/dist/storage/implementation/db.js +10 -0
  17. package/dist/storage/implementation/db.js.map +1 -1
  18. package/dist/storage/implementation/util.d.ts +1 -1
  19. package/dist/storage/implementation/util.js +1 -1
  20. package/package.json +9 -9
  21. package/src/migrations/db/migrations/1760433882550-bucket-state-index2.ts +34 -0
  22. package/src/storage/implementation/MongoCompactor.ts +100 -96
  23. package/src/storage/implementation/MongoSyncBucketStorage.ts +63 -19
  24. package/src/storage/implementation/MongoTestStorageFactoryGenerator.ts +1 -0
  25. package/src/storage/implementation/MongoWriteCheckpointAPI.ts +6 -2
  26. package/src/storage/implementation/db.ts +13 -0
  27. package/src/storage/implementation/util.ts +1 -1
  28. package/test/src/storage_compacting.test.ts +17 -2
  29. package/tsconfig.tsbuildinfo +1 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,28 @@
1
1
  # @powersync/service-module-mongodb-storage
2
2
 
3
+ ## 0.12.8
4
+
5
+ ### Patch Changes
6
+
7
+ - da7ecc6: Upgrade mongodb driver to improve stability.
8
+ - 5328802: [MongoDB Storage] Only compact modified buckets. Add index on bucket_state to handle large numbers of buckets when pre-calculating checksums or compacting, and skip small buckets.
9
+ - Updated dependencies [a98cecb]
10
+ - Updated dependencies [da7ecc6]
11
+ - Updated dependencies [5328802]
12
+ - Updated dependencies [704553e]
13
+ - @powersync/service-sync-rules@0.29.5
14
+ - @powersync/service-core@1.15.8
15
+ - @powersync/lib-services-framework@0.7.8
16
+ - @powersync/lib-service-mongodb@0.6.10
17
+
18
+ ## 0.12.7
19
+
20
+ ### Patch Changes
21
+
22
+ - d976830: Fix SnapshotTooOld on parameter queries in some cases.
23
+ - Updated dependencies [d976830]
24
+ - @powersync/service-core@1.15.7
25
+
3
26
  ## 0.12.6
4
27
 
5
28
  ### Patch Changes
@@ -0,0 +1,3 @@
1
+ import { migrations } from '@powersync/service-core';
2
+ export declare const up: migrations.PowerSyncMigrationFunction;
3
+ export declare const down: migrations.PowerSyncMigrationFunction;
@@ -0,0 +1,25 @@
1
+ import * as storage from '../../../storage/storage-index.js';
2
+ const INDEX_NAME = 'dirty_buckets';
3
+ export const up = async (context) => {
4
+ const { service_context: { configuration } } = context;
5
+ const db = storage.createPowerSyncMongo(configuration.storage);
6
+ try {
7
+ await db.createBucketStateIndex2();
8
+ }
9
+ finally {
10
+ await db.client.close();
11
+ }
12
+ };
13
+ export const down = async (context) => {
14
+ const { service_context: { configuration } } = context;
15
+ const db = storage.createPowerSyncMongo(configuration.storage);
16
+ try {
17
+ if (await db.bucket_state.indexExists(INDEX_NAME)) {
18
+ await db.bucket_state.dropIndex(INDEX_NAME);
19
+ }
20
+ }
21
+ finally {
22
+ await db.client.close();
23
+ }
24
+ };
25
+ //# sourceMappingURL=1760433882550-bucket-state-index2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"1760433882550-bucket-state-index2.js","sourceRoot":"","sources":["../../../../src/migrations/db/migrations/1760433882550-bucket-state-index2.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,OAAO,MAAM,mCAAmC,CAAC;AAG7D,MAAM,UAAU,GAAG,eAAe,CAAC;AAEnC,MAAM,CAAC,MAAM,EAAE,GAA0C,KAAK,EAAE,OAAO,EAAE,EAAE;IACzE,MAAM,EACJ,eAAe,EAAE,EAAE,aAAa,EAAE,EACnC,GAAG,OAAO,CAAC;IACZ,MAAM,EAAE,GAAG,OAAO,CAAC,oBAAoB,CAAC,aAAa,CAAC,OAA6B,CAAC,CAAC;IAErF,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,uBAAuB,EAAE,CAAC;IACrC,CAAC;YAAS,CAAC;QACT,MAAM,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;IAC1B,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,IAAI,GAA0C,KAAK,EAAE,OAAO,EAAE,EAAE;IAC3E,MAAM,EACJ,eAAe,EAAE,EAAE,aAAa,EAAE,EACnC,GAAG,OAAO,CAAC;IAEZ,MAAM,EAAE,GAAG,OAAO,CAAC,oBAAoB,CAAC,aAAa,CAAC,OAA6B,CAAC,CAAC;IAErF,IAAI,CAAC;QACH,IAAI,MAAM,EAAE,CAAC,YAAY,CAAC,WAAW,CAAC,UAAU,CAAC,EAAE,CAAC;YAClD,MAAM,EAAE,CAAC,YAAY,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC;YAAS,CAAC;QACT,MAAM,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;IAC1B,CAAC;AACH,CAAC,CAAC"}
@@ -1,4 +1,4 @@
1
- import { storage } from '@powersync/service-core';
1
+ import { PopulateChecksumCacheResults, storage } from '@powersync/service-core';
2
2
  import { PowerSyncMongo } from './db.js';
3
3
  import { MongoSyncBucketStorage } from './MongoSyncBucketStorage.js';
4
4
  /**
@@ -26,7 +26,8 @@ export declare class MongoCompactor {
26
26
  * See /docs/compacting-operations.md for details.
27
27
  */
28
28
  compact(): Promise<void>;
29
- compactInternal(bucket: string | undefined): Promise<void>;
29
+ private compactDirtyBuckets;
30
+ private compactSingleBucket;
30
31
  /**
31
32
  * Call when done with a bucket.
32
33
  */
@@ -43,6 +44,15 @@ export declare class MongoCompactor {
43
44
  /**
44
45
  * Subset of compact, only populating checksums where relevant.
45
46
  */
46
- populateChecksums(): Promise<void>;
47
+ populateChecksums(options: {
48
+ minBucketChanges: number;
49
+ }): Promise<PopulateChecksumCacheResults>;
50
+ /**
51
+ * Returns a batch of dirty buckets - buckets with most changes first.
52
+ *
53
+ * This cannot be used to iterate on its own - the client is expected to process these buckets and
54
+ * set estimate_since_compact.count: 0 when done, before fetching the next batch.
55
+ */
56
+ private dirtyBucketBatch;
47
57
  private updateChecksumsBatch;
48
58
  }
@@ -43,59 +43,50 @@ export class MongoCompactor {
43
43
  // We can make this more efficient later on by iterating
44
44
  // through the buckets in a single query.
45
45
  // That makes batching more tricky, so we leave for later.
46
- await this.compactInternal(bucket);
46
+ await this.compactSingleBucket(bucket);
47
47
  }
48
48
  }
49
49
  else {
50
- await this.compactInternal(undefined);
50
+ await this.compactDirtyBuckets();
51
51
  }
52
52
  }
53
- async compactInternal(bucket) {
54
- const idLimitBytes = this.idLimitBytes;
55
- let currentState = null;
56
- let bucketLower;
57
- let bucketUpper;
58
- if (bucket == null) {
59
- bucketLower = new mongo.MinKey();
60
- bucketUpper = new mongo.MaxKey();
61
- }
62
- else if (bucket.includes('[')) {
63
- // Exact bucket name
64
- bucketLower = bucket;
65
- bucketUpper = bucket;
66
- }
67
- else {
68
- // Bucket definition name
69
- bucketLower = `${bucket}[`;
70
- bucketUpper = `${bucket}[\uFFFF`;
53
+ async compactDirtyBuckets() {
54
+ while (!this.signal?.aborted) {
55
+ // Process all buckets with 1 or more changes since last time
56
+ const buckets = await this.dirtyBucketBatch({ minBucketChanges: 1 });
57
+ if (buckets.length == 0) {
58
+ // All done
59
+ break;
60
+ }
61
+ for (let bucket of buckets) {
62
+ await this.compactSingleBucket(bucket);
63
+ }
71
64
  }
65
+ }
66
+ async compactSingleBucket(bucket) {
67
+ const idLimitBytes = this.idLimitBytes;
68
+ let currentState = {
69
+ bucket,
70
+ seen: new Map(),
71
+ trackingSize: 0,
72
+ lastNotPut: null,
73
+ opsSincePut: 0,
74
+ checksum: 0,
75
+ opCount: 0,
76
+ opBytes: 0
77
+ };
72
78
  // Constant lower bound
73
79
  const lowerBound = {
74
80
  g: this.group_id,
75
- b: bucketLower,
81
+ b: bucket,
76
82
  o: new mongo.MinKey()
77
83
  };
78
84
  // Upper bound is adjusted for each batch
79
85
  let upperBound = {
80
86
  g: this.group_id,
81
- b: bucketUpper,
87
+ b: bucket,
82
88
  o: new mongo.MaxKey()
83
89
  };
84
- const doneWithBucket = async () => {
85
- if (currentState == null) {
86
- return;
87
- }
88
- // Free memory before clearing bucket
89
- currentState.seen.clear();
90
- if (currentState.lastNotPut != null && currentState.opsSincePut >= 1) {
91
- logger.info(`Inserting CLEAR at ${this.group_id}:${currentState.bucket}:${currentState.lastNotPut} to remove ${currentState.opsSincePut} operations`);
92
- // Need flush() before clear()
93
- await this.flush();
94
- await this.clearBucket(currentState);
95
- }
96
- // Do this _after_ clearBucket so that we have accurate counts.
97
- this.updateBucketChecksums(currentState);
98
- };
99
90
  while (!this.signal?.aborted) {
100
91
  // Query one batch at a time, to avoid cursor timeouts
101
92
  const cursor = this.db.bucket_data.aggregate([
@@ -121,7 +112,11 @@ export class MongoCompactor {
121
112
  size: { $bsonSize: '$$ROOT' }
122
113
  }
123
114
  }
124
- ], { batchSize: this.moveBatchQueryLimit });
115
+ ], {
116
+ // batchSize is 1 more than limit to auto-close the cursor.
117
+ // See https://github.com/mongodb/node-mongodb-native/pull/4580
118
+ batchSize: this.moveBatchQueryLimit + 1
119
+ });
125
120
  // We don't limit to a single batch here, since that often causes MongoDB to scan through more than it returns.
126
121
  // Instead, we load up to the limit.
127
122
  const batch = await cursor.toArray();
@@ -132,19 +127,6 @@ export class MongoCompactor {
132
127
  // Set upperBound for the next batch
133
128
  upperBound = batch[batch.length - 1]._id;
134
129
  for (let doc of batch) {
135
- if (currentState == null || doc._id.b != currentState.bucket) {
136
- await doneWithBucket();
137
- currentState = {
138
- bucket: doc._id.b,
139
- seen: new Map(),
140
- trackingSize: 0,
141
- lastNotPut: null,
142
- opsSincePut: 0,
143
- checksum: 0,
144
- opCount: 0,
145
- opBytes: 0
146
- };
147
- }
148
130
  if (doc._id.o > this.maxOpId) {
149
131
  continue;
150
132
  }
@@ -210,11 +192,18 @@ export class MongoCompactor {
210
192
  await this.flush();
211
193
  }
212
194
  }
213
- if (currentState != null) {
214
- logger.info(`Processed batch of length ${batch.length} current bucket: ${currentState.bucket}`);
215
- }
195
+ logger.info(`Processed batch of length ${batch.length} current bucket: ${bucket}`);
196
+ }
197
+ // Free memory before clearing bucket
198
+ currentState.seen.clear();
199
+ if (currentState.lastNotPut != null && currentState.opsSincePut >= 1) {
200
+ logger.info(`Inserting CLEAR at ${this.group_id}:${bucket}:${currentState.lastNotPut} to remove ${currentState.opsSincePut} operations`);
201
+ // Need flush() before clear()
202
+ await this.flush();
203
+ await this.clearBucket(currentState);
216
204
  }
217
- await doneWithBucket();
205
+ // Do this _after_ clearBucket so that we have accurate counts.
206
+ this.updateBucketChecksums(currentState);
218
207
  // Need another flush after updateBucketChecksums()
219
208
  await this.flush();
220
209
  }
@@ -381,46 +370,49 @@ export class MongoCompactor {
381
370
  /**
382
371
  * Subset of compact, only populating checksums where relevant.
383
372
  */
384
- async populateChecksums() {
385
- // This is updated after each batch
386
- let lowerBound = {
387
- g: this.group_id,
388
- b: new mongo.MinKey()
389
- };
390
- // This is static
391
- const upperBound = {
392
- g: this.group_id,
393
- b: new mongo.MaxKey()
394
- };
373
+ async populateChecksums(options) {
374
+ let count = 0;
395
375
  while (!this.signal?.aborted) {
396
- // By filtering buckets, we effectively make this "resumeable".
397
- const filter = {
398
- _id: {
399
- $gt: lowerBound,
400
- $lt: upperBound
401
- },
402
- compacted_state: { $exists: false }
403
- };
404
- const bucketsWithoutChecksums = await this.db.bucket_state
405
- .find(filter, {
406
- projection: {
407
- _id: 1
408
- },
409
- sort: {
410
- _id: 1
411
- },
412
- limit: 5_000,
413
- maxTimeMS: MONGO_OPERATION_TIMEOUT_MS
414
- })
415
- .toArray();
416
- if (bucketsWithoutChecksums.length == 0) {
376
+ const buckets = await this.dirtyBucketBatch(options);
377
+ if (buckets.length == 0) {
417
378
  // All done
418
379
  break;
419
380
  }
420
- logger.info(`Calculating checksums for batch of ${bucketsWithoutChecksums.length} buckets`);
421
- await this.updateChecksumsBatch(bucketsWithoutChecksums.map((b) => b._id.b));
422
- lowerBound = bucketsWithoutChecksums[bucketsWithoutChecksums.length - 1]._id;
381
+ const start = Date.now();
382
+ logger.info(`Calculating checksums for batch of ${buckets.length} buckets, starting at ${buckets[0]}`);
383
+ await this.updateChecksumsBatch(buckets);
384
+ logger.info(`Updated checksums for batch of ${buckets.length} buckets in ${Date.now() - start}ms`);
385
+ count += buckets.length;
386
+ }
387
+ return { buckets: count };
388
+ }
389
+ /**
390
+ * Returns a batch of dirty buckets - buckets with most changes first.
391
+ *
392
+ * This cannot be used to iterate on its own - the client is expected to process these buckets and
393
+ * set estimate_since_compact.count: 0 when done, before fetching the next batch.
394
+ */
395
+ async dirtyBucketBatch(options) {
396
+ if (options.minBucketChanges <= 0) {
397
+ throw new ReplicationAssertionError('minBucketChanges must be >= 1');
423
398
  }
399
+ // We make use of an index on {_id.g: 1, 'estimate_since_compact.count': -1}
400
+ const dirtyBuckets = await this.db.bucket_state
401
+ .find({
402
+ '_id.g': this.group_id,
403
+ 'estimate_since_compact.count': { $gte: options.minBucketChanges }
404
+ }, {
405
+ projection: {
406
+ _id: 1
407
+ },
408
+ sort: {
409
+ 'estimate_since_compact.count': -1
410
+ },
411
+ limit: 5_000,
412
+ maxTimeMS: MONGO_OPERATION_TIMEOUT_MS
413
+ })
414
+ .toArray();
415
+ return dirtyBuckets.map((bucket) => bucket._id.b);
424
416
  }
425
417
  async updateChecksumsBatch(buckets) {
426
418
  const checksums = await this.storage.checksums.computePartialChecksumsDirect(buckets.map((bucket) => {
@@ -449,6 +441,10 @@ export class MongoCompactor {
449
441
  count: bucketChecksum.count,
450
442
  checksum: BigInt(bucketChecksum.checksum),
451
443
  bytes: null
444
+ },
445
+ estimate_since_compact: {
446
+ count: 0,
447
+ bytes: 0
452
448
  }
453
449
  }
454
450
  },
@@ -1 +1 @@
1
- {"version":3,"file":"MongoCompactor.js","sourceRoot":"","sources":["../../../src/storage/implementation/MongoCompactor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"MongoCompactor.js","sourceRoot":"","sources":["../../../src/storage/implementation/MongoCompactor.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { mongo } from '@powersync/lib-service-mongodb';
2
2
  import { BaseObserver } from '@powersync/lib-services-framework';
3
- import { CheckpointChanges, CompactOptions, GetCheckpointChangesOptions, InternalOpId, ReplicationCheckpoint, storage, utils, WatchWriteCheckpointOptions } from '@powersync/service-core';
3
+ import { CheckpointChanges, GetCheckpointChangesOptions, InternalOpId, PopulateChecksumCacheOptions, PopulateChecksumCacheResults, ReplicationCheckpoint, storage, utils, WatchWriteCheckpointOptions } from '@powersync/service-core';
4
4
  import { ParameterLookup, SqliteJsonRow, SqlSyncRules } from '@powersync/service-sync-rules';
5
5
  import { MongoBucketStorage } from '../MongoBucketStorage.js';
6
6
  import { MongoChecksumOptions, MongoChecksums } from './MongoChecksums.js';
@@ -36,7 +36,7 @@ export declare class MongoSyncBucketStorage extends BaseObserver<storage.SyncRul
36
36
  private clearIteration;
37
37
  reportError(e: any): Promise<void>;
38
38
  compact(options?: storage.CompactOptions): Promise<void>;
39
- populatePersistentChecksumCache(options: Required<Pick<CompactOptions, 'signal' | 'maxOpId'>>): Promise<void>;
39
+ populatePersistentChecksumCache(options: PopulateChecksumCacheOptions): Promise<PopulateChecksumCacheResults>;
40
40
  /**
41
41
  * Instance-wide watch on the latest available checkpoint (op_id + lsn).
42
42
  */
@@ -63,6 +63,16 @@ import { MongoCompactor } from './MongoCompactor.js';
63
63
  import { MongoParameterCompactor } from './MongoParameterCompactor.js';
64
64
  import { MongoWriteCheckpointAPI } from './MongoWriteCheckpointAPI.js';
65
65
  import { idPrefixFilter, mapOpEntry, readSingleBatch, setSessionSnapshotTime } from './util.js';
66
+ /**
67
+ * Only keep checkpoints around for a minute, before fetching a fresh one.
68
+ *
69
+ * The reason is that we keep a MongoDB snapshot reference (clusterTime) with the checkpoint,
70
+ * and they expire after 5 minutes by default. This is an issue if the checkpoint stream is idle,
71
+ * but new clients connect and use an outdated checkpoint snapshot for parameter queries.
72
+ *
73
+ * These will be filtered out for existing clients, so should not create significant overhead.
74
+ */
75
+ const CHECKPOINT_TIMEOUT_MS = 60_000;
66
76
  export class MongoSyncBucketStorage extends BaseObserver {
67
77
  factory;
68
78
  group_id;
@@ -370,7 +380,9 @@ export class MongoSyncBucketStorage extends BaseObserver {
370
380
  limit: batchLimit,
371
381
  // Increase batch size above the default 101, so that we can fill an entire batch in
372
382
  // one go.
373
- batchSize: batchLimit,
383
+ // batchSize is 1 more than limit to auto-close the cursor.
384
+ // See https://github.com/mongodb/node-mongodb-native/pull/4580
385
+ batchSize: batchLimit + 1,
374
386
  // Raw mode is returns an array of Buffer instead of parsed documents.
375
387
  // We use it so that:
376
388
  // 1. We can calculate the document size accurately without serializing again.
@@ -583,9 +595,14 @@ export class MongoSyncBucketStorage extends BaseObserver {
583
595
  // Don't track updates for MOVE compacting
584
596
  memoryLimitMB: 0
585
597
  });
586
- await compactor.populateChecksums();
598
+ const result = await compactor.populateChecksums({
599
+ // There are cases with millions of small buckets, in which case it can take very long to
600
+ // populate the checksums, with minimal benefit. We skip the small buckets here.
601
+ minBucketChanges: options.minBucketChanges ?? 10
602
+ });
587
603
  const duration = Date.now() - start;
588
604
  logger.info(`Populated persistent checksum cache in ${(duration / 1000).toFixed(1)}s`);
605
+ return result;
589
606
  }
590
607
  /**
591
608
  * Instance-wide watch on the latest available checkpoint (op_id + lsn).
@@ -597,23 +614,45 @@ export class MongoSyncBucketStorage extends BaseObserver {
597
614
  }
598
615
  // We only watch changes to the active sync rules.
599
616
  // If it changes to inactive, we abort and restart with the new sync rules.
600
- let lastOp = null;
601
- for await (const _ of stream) {
602
- if (signal.aborted) {
603
- break;
604
- }
605
- const op = await this.getCheckpointInternal();
606
- if (op == null) {
607
- // Sync rules have changed - abort and restart.
608
- // We do a soft close of the stream here - no error
609
- break;
610
- }
611
- // Check for LSN / checkpoint changes - ignore other metadata changes
612
- if (lastOp == null || op.lsn != lastOp.lsn || op.checkpoint != lastOp.checkpoint) {
613
- lastOp = op;
617
+ try {
618
+ while (true) {
619
+ // If the stream is idle, we wait a max of a minute (CHECKPOINT_TIMEOUT_MS)
620
+ // before we get another checkpoint, to avoid stale checkpoint snapshots.
621
+ const timeout = timers
622
+ .setTimeout(CHECKPOINT_TIMEOUT_MS, { done: false }, { signal })
623
+ .catch(() => ({ done: true }));
624
+ try {
625
+ const result = await Promise.race([stream.next(), timeout]);
626
+ if (result.done) {
627
+ break;
628
+ }
629
+ }
630
+ catch (e) {
631
+ if (e.name == 'AbortError') {
632
+ break;
633
+ }
634
+ throw e;
635
+ }
636
+ if (signal.aborted) {
637
+ // Would likely have been caught by the signal on the timeout or the upstream stream, but we check here anyway
638
+ break;
639
+ }
640
+ const op = await this.getCheckpointInternal();
641
+ if (op == null) {
642
+ // Sync rules have changed - abort and restart.
643
+ // We do a soft close of the stream here - no error
644
+ break;
645
+ }
646
+ // Previously, we only yielded when the checkpoint or lsn changed.
647
+ // However, we always want to use the latest snapshotTime, so we skip that filtering here.
648
+ // That filtering could be added in the per-user streams if needed, but in general the capped collection
649
+ // should already only contain useful changes in most cases.
614
650
  yield op;
615
651
  }
616
652
  }
653
+ finally {
654
+ await stream.return(null);
655
+ }
617
656
  }
618
657
  // Nothing is done here until a subscriber starts to iterate
619
658
  sharedIter = new BroadcastIterable((signal) => {
@@ -765,7 +804,9 @@ export class MongoSyncBucketStorage extends BaseObserver {
765
804
  '_id.b': 1
766
805
  },
767
806
  limit: limit + 1,
768
- batchSize: limit + 1,
807
+ // batchSize is 1 more than limit to auto-close the cursor.
808
+ // See https://github.com/mongodb/node-mongodb-native/pull/4580
809
+ batchSize: limit + 2,
769
810
  singleBatch: true
770
811
  })
771
812
  .toArray();
@@ -787,7 +828,9 @@ export class MongoSyncBucketStorage extends BaseObserver {
787
828
  lookup: 1
788
829
  },
789
830
  limit: limit + 1,
790
- batchSize: limit + 1,
831
+ // batchSize is 1 more than limit to auto-close the cursor.
832
+ // See https://github.com/mongodb/node-mongodb-native/pull/4580
833
+ batchSize: limit + 2,
791
834
  singleBatch: true
792
835
  })
793
836
  .toArray();