@powersync/service-module-mongodb-storage 0.17.0 → 0.18.1

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 (185) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/dist/storage/MongoBucketStorage.d.ts +34 -16
  3. package/dist/storage/MongoBucketStorage.js +219 -70
  4. package/dist/storage/MongoBucketStorage.js.map +1 -1
  5. package/dist/storage/implementation/MongoBucketBatch.d.ts +42 -23
  6. package/dist/storage/implementation/MongoBucketBatch.js +61 -44
  7. package/dist/storage/implementation/MongoBucketBatch.js.map +1 -1
  8. package/dist/storage/implementation/MongoChecksums.d.ts +10 -9
  9. package/dist/storage/implementation/MongoChecksums.js +3 -111
  10. package/dist/storage/implementation/MongoChecksums.js.map +1 -1
  11. package/dist/storage/implementation/MongoCompactor.d.ts +2 -0
  12. package/dist/storage/implementation/MongoCompactor.js +18 -9
  13. package/dist/storage/implementation/MongoCompactor.js.map +1 -1
  14. package/dist/storage/implementation/MongoHydrationState.d.ts +11 -0
  15. package/dist/storage/implementation/MongoHydrationState.js +49 -0
  16. package/dist/storage/implementation/MongoHydrationState.js.map +1 -0
  17. package/dist/storage/implementation/MongoParameterCompactor.d.ts +6 -5
  18. package/dist/storage/implementation/MongoParameterCompactor.js +24 -1
  19. package/dist/storage/implementation/MongoParameterCompactor.js.map +1 -1
  20. package/dist/storage/implementation/MongoParsedSyncConfigSet.d.ts +13 -0
  21. package/dist/storage/implementation/MongoParsedSyncConfigSet.js +64 -0
  22. package/dist/storage/implementation/MongoParsedSyncConfigSet.js.map +1 -0
  23. package/dist/storage/implementation/MongoPersistedReplicationStream.d.ts +36 -0
  24. package/dist/storage/implementation/MongoPersistedReplicationStream.js +90 -0
  25. package/dist/storage/implementation/MongoPersistedReplicationStream.js.map +1 -0
  26. package/dist/storage/implementation/MongoPersistedSyncConfigContent.d.ts +25 -0
  27. package/dist/storage/implementation/MongoPersistedSyncConfigContent.js +123 -0
  28. package/dist/storage/implementation/MongoPersistedSyncConfigContent.js.map +1 -0
  29. package/dist/storage/implementation/MongoStorageProvider.js +5 -2
  30. package/dist/storage/implementation/MongoStorageProvider.js.map +1 -1
  31. package/dist/storage/implementation/MongoSyncBucketStorage.d.ts +41 -23
  32. package/dist/storage/implementation/MongoSyncBucketStorage.js +51 -43
  33. package/dist/storage/implementation/MongoSyncBucketStorage.js.map +1 -1
  34. package/dist/storage/implementation/MongoSyncRulesLock.d.ts +1 -1
  35. package/dist/storage/implementation/MongoSyncRulesLock.js +3 -3
  36. package/dist/storage/implementation/MongoSyncRulesLock.js.map +1 -1
  37. package/dist/storage/implementation/common/MongoSyncBucketStorageCheckpoint.d.ts +6 -0
  38. package/dist/storage/implementation/common/MongoSyncBucketStorageCheckpoint.js +2 -0
  39. package/dist/storage/implementation/common/MongoSyncBucketStorageCheckpoint.js.map +1 -0
  40. package/dist/storage/implementation/common/PersistedBatch.d.ts +1 -2
  41. package/dist/storage/implementation/common/PersistedBatch.js +5 -0
  42. package/dist/storage/implementation/common/PersistedBatch.js.map +1 -1
  43. package/dist/storage/implementation/common/VersionedPowerSyncMongoBase.js +1 -1
  44. package/dist/storage/implementation/common/VersionedPowerSyncMongoBase.js.map +1 -1
  45. package/dist/storage/implementation/createMongoSyncBucketStorage.d.ts +2 -2
  46. package/dist/storage/implementation/createMongoSyncBucketStorage.js +4 -4
  47. package/dist/storage/implementation/createMongoSyncBucketStorage.js.map +1 -1
  48. package/dist/storage/implementation/db.js +9 -14
  49. package/dist/storage/implementation/db.js.map +1 -1
  50. package/dist/storage/implementation/models.d.ts +4 -13
  51. package/dist/storage/implementation/models.js.map +1 -1
  52. package/dist/storage/implementation/v1/MongoBucketBatchV1.d.ts +9 -1
  53. package/dist/storage/implementation/v1/MongoBucketBatchV1.js +42 -26
  54. package/dist/storage/implementation/v1/MongoBucketBatchV1.js.map +1 -1
  55. package/dist/storage/implementation/v1/MongoChecksumsV1.js +114 -3
  56. package/dist/storage/implementation/v1/MongoChecksumsV1.js.map +1 -1
  57. package/dist/storage/implementation/v1/MongoSyncBucketStorageV1.d.ts +15 -17
  58. package/dist/storage/implementation/v1/MongoSyncBucketStorageV1.js +47 -45
  59. package/dist/storage/implementation/v1/MongoSyncBucketStorageV1.js.map +1 -1
  60. package/dist/storage/implementation/v1/VersionedPowerSyncMongoV1.d.ts +2 -1
  61. package/dist/storage/implementation/v1/VersionedPowerSyncMongoV1.js +3 -0
  62. package/dist/storage/implementation/v1/VersionedPowerSyncMongoV1.js.map +1 -1
  63. package/dist/storage/implementation/v1/models.d.ts +10 -1
  64. package/dist/storage/implementation/v3/MongoBucketBatchV3.d.ts +8 -4
  65. package/dist/storage/implementation/v3/MongoBucketBatchV3.js +286 -259
  66. package/dist/storage/implementation/v3/MongoBucketBatchV3.js.map +1 -1
  67. package/dist/storage/implementation/v3/MongoChecksumsV3.d.ts +27 -7
  68. package/dist/storage/implementation/v3/MongoChecksumsV3.js +202 -18
  69. package/dist/storage/implementation/v3/MongoChecksumsV3.js.map +1 -1
  70. package/dist/storage/implementation/v3/MongoCompactorV3.d.ts +19 -2
  71. package/dist/storage/implementation/v3/MongoCompactorV3.js +511 -22
  72. package/dist/storage/implementation/v3/MongoCompactorV3.js.map +1 -1
  73. package/dist/storage/implementation/v3/MongoStoppedSyncConfigCleanup.d.ts +62 -0
  74. package/dist/storage/implementation/v3/MongoStoppedSyncConfigCleanup.js +350 -0
  75. package/dist/storage/implementation/v3/MongoStoppedSyncConfigCleanup.js.map +1 -0
  76. package/dist/storage/implementation/v3/MongoSyncBucketStorageV3.d.ts +40 -28
  77. package/dist/storage/implementation/v3/MongoSyncBucketStorageV3.js +232 -116
  78. package/dist/storage/implementation/v3/MongoSyncBucketStorageV3.js.map +1 -1
  79. package/dist/storage/implementation/v3/PersistedBatchV3.d.ts +1 -1
  80. package/dist/storage/implementation/v3/PersistedBatchV3.js +43 -20
  81. package/dist/storage/implementation/v3/PersistedBatchV3.js.map +1 -1
  82. package/dist/storage/implementation/v3/SingleBucketStoreV3.js +52 -16
  83. package/dist/storage/implementation/v3/SingleBucketStoreV3.js.map +1 -1
  84. package/dist/storage/implementation/v3/SourceRecordStoreV3.d.ts +3 -3
  85. package/dist/storage/implementation/v3/SourceRecordStoreV3.js +13 -11
  86. package/dist/storage/implementation/v3/SourceRecordStoreV3.js.map +1 -1
  87. package/dist/storage/implementation/v3/VersionedPowerSyncMongoV3.d.ts +13 -12
  88. package/dist/storage/implementation/v3/VersionedPowerSyncMongoV3.js +29 -27
  89. package/dist/storage/implementation/v3/VersionedPowerSyncMongoV3.js.map +1 -1
  90. package/dist/storage/implementation/v3/bucket-format.d.ts +4 -0
  91. package/dist/storage/implementation/v3/bucket-format.js +58 -0
  92. package/dist/storage/implementation/v3/bucket-format.js.map +1 -0
  93. package/dist/storage/implementation/v3/chunking.d.ts +10 -0
  94. package/dist/storage/implementation/v3/chunking.js +28 -0
  95. package/dist/storage/implementation/v3/chunking.js.map +1 -0
  96. package/dist/storage/implementation/v3/models.d.ts +64 -21
  97. package/dist/storage/implementation/v3/models.js +11 -28
  98. package/dist/storage/implementation/v3/models.js.map +1 -1
  99. package/dist/storage/implementation/v3/source-table-utils.d.ts +55 -0
  100. package/dist/storage/implementation/v3/source-table-utils.js +214 -0
  101. package/dist/storage/implementation/v3/source-table-utils.js.map +1 -0
  102. package/dist/storage/storage-index.d.ts +4 -4
  103. package/dist/storage/storage-index.js +4 -4
  104. package/dist/storage/storage-index.js.map +1 -1
  105. package/dist/types/types.d.ts +2 -2
  106. package/dist/utils/test-utils.d.ts +1 -2
  107. package/dist/utils/test-utils.js +5 -1
  108. package/dist/utils/test-utils.js.map +1 -1
  109. package/dist/utils/util.d.ts +1 -1
  110. package/dist/utils/util.js +3 -2
  111. package/dist/utils/util.js.map +1 -1
  112. package/package.json +9 -19
  113. package/src/storage/MongoBucketStorage.ts +334 -87
  114. package/src/storage/implementation/MongoBucketBatch.ts +86 -58
  115. package/src/storage/implementation/MongoChecksums.ts +6 -138
  116. package/src/storage/implementation/MongoCompactor.ts +19 -9
  117. package/src/storage/implementation/MongoHydrationState.ts +61 -0
  118. package/src/storage/implementation/MongoParameterCompactor.ts +24 -5
  119. package/src/storage/implementation/MongoParsedSyncConfigSet.ts +88 -0
  120. package/src/storage/implementation/MongoPersistedReplicationStream.ts +118 -0
  121. package/src/storage/implementation/MongoPersistedSyncConfigContent.ts +154 -0
  122. package/src/storage/implementation/MongoStorageProvider.ts +5 -2
  123. package/src/storage/implementation/MongoSyncBucketStorage.ts +70 -56
  124. package/src/storage/implementation/MongoSyncRulesLock.ts +7 -4
  125. package/src/storage/implementation/common/MongoSyncBucketStorageCheckpoint.ts +7 -0
  126. package/src/storage/implementation/common/PersistedBatch.ts +7 -3
  127. package/src/storage/implementation/common/VersionedPowerSyncMongoBase.ts +1 -1
  128. package/src/storage/implementation/createMongoSyncBucketStorage.ts +21 -7
  129. package/src/storage/implementation/db.ts +11 -19
  130. package/src/storage/implementation/models.ts +4 -14
  131. package/src/storage/implementation/v1/MongoBucketBatchV1.ts +55 -34
  132. package/src/storage/implementation/v1/MongoChecksumsV1.ts +137 -4
  133. package/src/storage/implementation/v1/MongoSyncBucketStorageV1.ts +70 -64
  134. package/src/storage/implementation/v1/VersionedPowerSyncMongoV1.ts +11 -1
  135. package/src/storage/implementation/v1/models.ts +11 -1
  136. package/src/storage/implementation/v3/MongoBucketBatchV3.ts +358 -314
  137. package/src/storage/implementation/v3/MongoChecksumsV3.ts +262 -26
  138. package/src/storage/implementation/v3/MongoCompactorV3.ts +646 -29
  139. package/src/storage/implementation/v3/MongoStoppedSyncConfigCleanup.ts +480 -0
  140. package/src/storage/implementation/v3/MongoSyncBucketStorageV3.ts +315 -157
  141. package/src/storage/implementation/v3/PersistedBatchV3.ts +62 -36
  142. package/src/storage/implementation/v3/SingleBucketStoreV3.ts +59 -19
  143. package/src/storage/implementation/v3/SourceRecordStoreV3.ts +12 -12
  144. package/src/storage/implementation/v3/VersionedPowerSyncMongoV3.ts +41 -36
  145. package/src/storage/implementation/v3/bucket-format.ts +70 -0
  146. package/src/storage/implementation/v3/chunking.ts +38 -0
  147. package/src/storage/implementation/v3/models.ts +93 -55
  148. package/src/storage/implementation/v3/source-table-utils.ts +392 -0
  149. package/src/storage/storage-index.ts +12 -4
  150. package/src/utils/test-utils.ts +6 -3
  151. package/src/utils/util.ts +3 -2
  152. package/test/src/__snapshots__/storage.test.ts.snap +0 -75
  153. package/test/src/__snapshots__/storage_sync.test.ts.snap +48 -48
  154. package/test/src/cleanup-stopped-sync-configs.test.ts +648 -0
  155. package/test/src/storage.test.ts +11 -11
  156. package/test/src/storage_compacting.test.ts +1956 -6
  157. package/test/src/storage_sync.test.ts +1077 -68
  158. package/test/src/storeCurrentData.test.ts +17 -7
  159. package/test/src/util.ts +2 -1
  160. package/tsconfig.json +1 -4
  161. package/tsconfig.tsbuildinfo +1 -1
  162. package/dist/storage/implementation/BucketDefinitionMapping.d.ts +0 -15
  163. package/dist/storage/implementation/BucketDefinitionMapping.js +0 -58
  164. package/dist/storage/implementation/BucketDefinitionMapping.js.map +0 -1
  165. package/dist/storage/implementation/MongoPersistedSyncRules.d.ts +0 -14
  166. package/dist/storage/implementation/MongoPersistedSyncRules.js +0 -67
  167. package/dist/storage/implementation/MongoPersistedSyncRules.js.map +0 -1
  168. package/dist/storage/implementation/MongoPersistedSyncRulesContent.d.ts +0 -29
  169. package/dist/storage/implementation/MongoPersistedSyncRulesContent.js +0 -76
  170. package/dist/storage/implementation/MongoPersistedSyncRulesContent.js.map +0 -1
  171. package/dist/storage/implementation/common/MongoSyncBucketStorageContext.d.ts +0 -13
  172. package/dist/storage/implementation/common/MongoSyncBucketStorageContext.js +0 -2
  173. package/dist/storage/implementation/common/MongoSyncBucketStorageContext.js.map +0 -1
  174. package/dist/storage/implementation/v3/MongoParameterCompactorV3.d.ts +0 -9
  175. package/dist/storage/implementation/v3/MongoParameterCompactorV3.js +0 -18
  176. package/dist/storage/implementation/v3/MongoParameterCompactorV3.js.map +0 -1
  177. package/dist/storage/implementation/v3/MongoParameterLookupV3.d.ts +0 -4
  178. package/dist/storage/implementation/v3/MongoParameterLookupV3.js +0 -9
  179. package/dist/storage/implementation/v3/MongoParameterLookupV3.js.map +0 -1
  180. package/src/storage/implementation/BucketDefinitionMapping.ts +0 -75
  181. package/src/storage/implementation/MongoPersistedSyncRules.ts +0 -82
  182. package/src/storage/implementation/MongoPersistedSyncRulesContent.ts +0 -101
  183. package/src/storage/implementation/common/MongoSyncBucketStorageContext.ts +0 -15
  184. package/src/storage/implementation/v3/MongoParameterCompactorV3.ts +0 -24
  185. package/src/storage/implementation/v3/MongoParameterLookupV3.ts +0 -11
@@ -1,32 +1,45 @@
1
1
  import { mongo } from '@powersync/lib-service-mongodb';
2
- import { ReplicationAssertionError, ServiceAssertionError } from '@powersync/lib-services-framework';
2
+ import { logger, ReplicationAssertionError, ServiceAssertionError } from '@powersync/lib-services-framework';
3
+ import { addChecksums, utils } from '@powersync/service-core';
3
4
  import { MongoCompactor } from '../MongoCompactor.js';
5
+ import { cacheKey } from '../OperationBatch.js';
6
+ import { loadBucketDataDocument, serializeBucketData } from './bucket-format.js';
7
+ import { chunkBucketData } from './chunking.js';
4
8
  import { SingleBucketStoreV3 } from './SingleBucketStoreV3.js';
5
9
  export class MongoCompactorV3 extends MongoCompactor {
6
10
  async *dirtyBucketBatches(options) {
7
11
  if (options.minBucketChanges <= 0) {
8
12
  throw new ReplicationAssertionError('minBucketChanges must be >= 1');
9
13
  }
10
- // Same scan strategy as V1, but with the V3 bucket_state key shape.
11
- yield* this.dirtyBucketBatchesForCollection(this.db.bucketStateV3(this.group_id), { d: new mongo.MinKey(), b: new mongo.MinKey() }, { d: new mongo.MaxKey(), b: new mongo.MaxKey() }, options, (bucketState) => bucketState._id.d);
14
+ const collection = this.db.bucketState(this.group_id);
15
+ yield* this.dirtyBucketBatchesForCollection(collection, { d: new mongo.MinKey(), b: new mongo.MinKey() }, { d: new mongo.MaxKey(), b: new mongo.MaxKey() }, options, (bucketState) => bucketState._id.d);
12
16
  }
13
17
  async dirtyBucketBatchForChecksums(options) {
14
18
  if (options.minBucketChanges <= 0) {
15
19
  throw new ReplicationAssertionError('minBucketChanges must be >= 1');
16
20
  }
17
- return this.dirtyBucketBatchForChecksumsForCollection(this.db.bucketStateV3(this.group_id), {
21
+ return this.dirtyBucketBatchForChecksumsForCollection(this.db.bucketState(this.group_id), {
18
22
  'estimate_since_compact.count': { $gte: options.minBucketChanges }
19
23
  }, (bucketState) => bucketState._id.d);
20
24
  }
21
25
  async writeBucketStateUpdates() {
22
26
  await this.db
23
- .bucketStateV3(this.group_id)
24
- .bulkWrite(this.bucketStateUpdates, { ordered: false });
27
+ .bucketState(this.group_id)
28
+ .bulkWrite(this.bucketStateUpdates, {
29
+ ordered: false
30
+ });
31
+ }
32
+ /**
33
+ * The compactor operates on persisted definition ids only - never on parsed sources.
34
+ * This narrowed view makes the source-resolving checksum methods unreachable here.
35
+ */
36
+ get definitionChecksums() {
37
+ return this.storage.checksums;
25
38
  }
26
39
  async computeChecksumsForBuckets(buckets) {
27
- return this.storage.checksums.computePartialChecksumsDirectByDefinition(buckets.map(({ bucket, definitionId }) => {
40
+ return this.definitionChecksums.computePartialChecksumsDirectByDefinition(buckets.map(({ bucket, definitionId }) => {
28
41
  if (definitionId == null) {
29
- throw new ServiceAssertionError(`Missing definitionId for V3 bucket checksum update on bucket ${bucket}`);
42
+ throw new ServiceAssertionError(`Missing definitionId for bucket checksum update on bucket ${bucket}`);
30
43
  }
31
44
  return {
32
45
  bucket,
@@ -47,22 +60,498 @@ export class MongoCompactorV3 extends MongoCompactor {
47
60
  };
48
61
  }
49
62
  async getBucketDataContext(bucket, definitionId) {
50
- if (definitionId == null) {
51
- // Not the _most_ efficient approach, but this is not used often
52
- const allDefinitionIds = this.storage.mapping.allBucketDefinitionIds();
53
- if (allDefinitionIds.length == 0) {
54
- return null;
55
- }
56
- const potentialIds = allDefinitionIds.map((definitionId) => ({ d: definitionId, b: bucket }));
57
- const bucketState = await this.db.bucketStateV3(this.group_id).findOne({
58
- _id: { $in: potentialIds }
59
- });
60
- if (bucketState == null) {
61
- return null;
63
+ let resolvedDefinitionId = definitionId;
64
+ if (resolvedDefinitionId == null) {
65
+ const allDefinitionIds = this.storage.storageIds.bucketDefinitionIds;
66
+ if (allDefinitionIds.length > 0) {
67
+ const potentialIds = allDefinitionIds.map((id) => ({ d: id, b: bucket }));
68
+ const bucketState = await this.db.bucketState(this.group_id).findOne({
69
+ _id: { $in: potentialIds }
70
+ });
71
+ if (bucketState != null) {
72
+ resolvedDefinitionId = bucketState._id.d;
73
+ }
74
+ }
75
+ }
76
+ if (resolvedDefinitionId == null) {
77
+ return null;
78
+ }
79
+ return new SingleBucketStoreV3(this.db, {
80
+ bucket,
81
+ definitionId: resolvedDefinitionId,
82
+ replicationStreamId: this.group_id
83
+ });
84
+ }
85
+ async compactSingleBucket(bucket, definitionId = null) {
86
+ const bucketContext = await this.getBucketDataContext(bucket, definitionId);
87
+ if (bucketContext == null) {
88
+ return;
89
+ }
90
+ const resolvedDefinitionId = bucketContext.key.definitionId;
91
+ const collection = this.db.bucketData(this.group_id, resolvedDefinitionId);
92
+ const context = { replicationStreamId: this.group_id, definitionId: resolvedDefinitionId };
93
+ const lowerBound = bucketContext.minId;
94
+ let upperBound = bucketContext.maxId;
95
+ let totalChecksum = 0;
96
+ let totalOpCount = 0;
97
+ let totalOpBytes = 0;
98
+ let lastNotPut = null;
99
+ let opsSincePut = 0;
100
+ let clearBoundaryDocId = null;
101
+ const seen = new Map();
102
+ let trackingSize = 0;
103
+ // --- Read batch from MongoDB ---
104
+ while (true) {
105
+ this.signal?.throwIfAborted();
106
+ const pipeline = [
107
+ {
108
+ $match: {
109
+ '_id.b': bucket,
110
+ _id: {
111
+ $gte: lowerBound,
112
+ $lt: upperBound
113
+ }
114
+ }
115
+ },
116
+ { $sort: { _id: -1 } },
117
+ { $limit: this.moveBatchQueryLimit },
118
+ {
119
+ $project: {
120
+ _id: 1,
121
+ min_op: 1,
122
+ checksum: 1,
123
+ count: 1,
124
+ size: 1,
125
+ target_op: 1,
126
+ ops: 1,
127
+ bsonSize: { $bsonSize: '$$ROOT' }
128
+ }
129
+ }
130
+ ];
131
+ const rawBatch = await collection
132
+ .aggregate(pipeline, {
133
+ batchSize: this.moveBatchQueryLimit + 1
134
+ })
135
+ .toArray();
136
+ if (rawBatch.length == 0) {
137
+ // No more documents in this bucket — compaction complete.
138
+ break;
139
+ }
140
+ // --- Cut batch to byte limit ---
141
+ let cumulativeBytes = 0;
142
+ let batchCutIndex = rawBatch.length;
143
+ for (let i = 0; i < rawBatch.length; i++) {
144
+ cumulativeBytes += Number(rawBatch[i].bsonSize);
145
+ if (cumulativeBytes > this.moveBatchByteLimit && i > 0) {
146
+ // Byte limit exceeded; cut batch at current index. Always include
147
+ // at least one document (i > 0 guard) to guarantee forward progress.
148
+ batchCutIndex = i;
149
+ break;
150
+ }
151
+ }
152
+ const batchDocs = rawBatch.slice(0, batchCutIndex);
153
+ // --- Decode documents into individual ops ---
154
+ // Processable: document has at least one op <= maxOpId.
155
+ // Only processable docs are deleted and recreated; the rest survive untouched.
156
+ const batchOps = [];
157
+ const processableDocs = [];
158
+ for (const doc of batchDocs) {
159
+ let hasRelevantOp = false;
160
+ const candidateOps = [];
161
+ for (const op of loadBucketDataDocument(context, doc)) {
162
+ candidateOps.push(op);
163
+ if (op.o <= this.maxOpId) {
164
+ hasRelevantOp = true;
165
+ }
166
+ }
167
+ if (hasRelevantOp) {
168
+ processableDocs.push(doc);
169
+ batchOps.push(...candidateOps);
170
+ } // else: candidateOps discarded — document has no ops <= maxOpId
171
+ }
172
+ if (processableDocs.length == 0) {
173
+ // No documents with relevant ops in this batch; paginate to next batch
174
+ // without performing any writes. This handles batches where all documents
175
+ // contain only ops above maxOpId.
176
+ upperBound = batchDocs[batchDocs.length - 1]._id;
177
+ if (batchCutIndex >= rawBatch.length && rawBatch.length < this.moveBatchQueryLimit) {
178
+ // Entire remaining bucket is non-processable — compaction complete.
179
+ break;
180
+ }
181
+ // Skip dedup, rechunking, and transaction for this batch.
182
+ continue;
183
+ }
184
+ // Scoped replace in a bounded transaction.
185
+ // Delete by individual _id values instead of a continuous range.
186
+ // A continuous range could catch non-processable documents (all ops > maxOpId)
187
+ // that happen to fall between processable documents in _id.o sort order.
188
+ const idsToDelete = processableDocs.map((d) => d._id);
189
+ const expectedDocCount = processableDocs.length;
190
+ const expectedChecksum = processableDocs.reduce((sum, doc) => sum + doc.checksum, 0n);
191
+ const expectedOpCount = processableDocs.reduce((sum, doc) => sum + doc.count, 0);
192
+ // Sort ops by o descending for newest-first dedup
193
+ batchOps.sort((a, b) => (b.o > a.o ? 1 : b.o < a.o ? -1 : 0));
194
+ // --- Dedup: newest-first, superseded → MOVE ---
195
+ const surviving = [];
196
+ for (const op of batchOps) {
197
+ if (op.op == 'PUT' || op.op == 'REMOVE') {
198
+ if (op.o > this.maxOpId) {
199
+ surviving.push(op);
200
+ continue; // Do not dedup ops above compaction horizon
201
+ }
202
+ const key = `${op.table}/${op.row_id}/${cacheKey(op.source_table, op.source_key)}`;
203
+ const targetOp = seen.get(key);
204
+ if (targetOp != null) {
205
+ surviving.push({
206
+ ...op,
207
+ op: 'MOVE',
208
+ target_op: targetOp,
209
+ table: undefined,
210
+ row_id: undefined,
211
+ source_table: undefined,
212
+ source_key: undefined,
213
+ data: null
214
+ });
215
+ if (lastNotPut == null) {
216
+ lastNotPut = op.o;
217
+ }
218
+ opsSincePut += 1;
219
+ }
220
+ else {
221
+ if (trackingSize < this.idLimitBytes) {
222
+ seen.set(utils.flatstr(key), op.o);
223
+ trackingSize += key.length + 140;
224
+ }
225
+ surviving.push(op);
226
+ if (op.op == 'PUT') {
227
+ lastNotPut = null;
228
+ opsSincePut = 0;
229
+ }
230
+ else {
231
+ if (lastNotPut == null) {
232
+ lastNotPut = op.o;
233
+ }
234
+ opsSincePut += 1;
235
+ }
236
+ }
237
+ }
238
+ else {
239
+ surviving.push(op);
240
+ if (op.op != 'CLEAR') {
241
+ if (lastNotPut == null) {
242
+ lastNotPut = op.o;
243
+ }
244
+ opsSincePut += 1;
245
+ }
246
+ }
247
+ }
248
+ // Reverse back to ascending order for rechunking
249
+ surviving.reverse();
250
+ // --- Rechunk survivors into new V3 documents ---
251
+ const chunks = chunkBucketData(surviving);
252
+ const newDocs = chunks.map((chunk) => serializeBucketData(bucket, chunk));
253
+ if (lastNotPut == null) {
254
+ clearBoundaryDocId = null;
255
+ }
256
+ else {
257
+ const boundaryOp = lastNotPut;
258
+ const boundaryDoc = newDocs.find((doc) => doc.min_op <= boundaryOp && doc._id.o >= boundaryOp);
259
+ if (boundaryDoc != null) {
260
+ clearBoundaryDocId = boundaryDoc._id;
261
+ }
262
+ }
263
+ // --- Commit: scoped delete + insert in transaction ---
264
+ const session = this.db.client.startSession();
265
+ try {
266
+ await session.withTransaction(async () => {
267
+ // Verify documents haven't been modified since we read them.
268
+ // This aggregate anchors the transaction snapshot and catches
269
+ // concurrent compaction jobs that modified the same documents.
270
+ const verification = await bucketContext.collection
271
+ .aggregate([
272
+ { $match: { _id: { $in: idsToDelete } } },
273
+ {
274
+ $group: {
275
+ _id: null,
276
+ docCount: { $sum: 1 },
277
+ checksumSum: { $sum: '$checksum' },
278
+ opCountSum: { $sum: '$count' }
279
+ }
280
+ }
281
+ ], { session })
282
+ .next();
283
+ if (verification == null || // all docs deleted
284
+ verification.docCount !== expectedDocCount || // some docs deleted
285
+ verification.checksumSum !== expectedChecksum || // docs modified in-place
286
+ verification.opCountSum !== expectedOpCount // ops added/removed within docs
287
+ ) {
288
+ throw new Error(`Concurrent modification detected in bucket ${bucket}. Aborting compaction for this batch.`);
289
+ }
290
+ await bucketContext.collection.deleteMany({
291
+ _id: { $in: idsToDelete }
292
+ }, { session });
293
+ if (newDocs.length > 0) {
294
+ await bucketContext.collection.insertMany(newDocs, { session });
295
+ }
296
+ }, {
297
+ writeConcern: { w: 'majority' },
298
+ readConcern: { level: 'snapshot' }
299
+ });
300
+ }
301
+ finally {
302
+ await session.endSession();
303
+ }
304
+ // --- Accumulate bucket state ---
305
+ for (const chunk of chunks) {
306
+ for (const op of chunk) {
307
+ if (op.o <= this.maxOpId) {
308
+ totalChecksum = addChecksums(totalChecksum, Number(op.checksum));
309
+ totalOpBytes += op.data?.length ?? 0;
310
+ }
311
+ }
312
+ }
313
+ totalOpCount += surviving.filter((op) => op.o <= this.maxOpId).length;
314
+ // --- Advance to next batch ---
315
+ upperBound = (newDocs.length > 0 ? newDocs[0]._id : rawBatch[batchCutIndex - 1]._id);
316
+ if (batchCutIndex < rawBatch.length) {
317
+ // We cut the batch short due to byte limit — don't advance past cut point
318
+ // The upperBound is already set to the last doc we processed
319
+ }
320
+ else {
321
+ // Processed all docs in the raw batch. If we got fewer than the query
322
+ // limit, there are no more documents in this bucket — compaction complete.
323
+ if (rawBatch.length < this.moveBatchQueryLimit) {
324
+ break;
325
+ }
62
326
  }
63
- definitionId = bucketState._id.d;
327
+ this.logger.info(`Compacted batch of ${batchDocs.length} documents for bucket ${bucket}`);
64
328
  }
65
- return new SingleBucketStoreV3(this.db, { bucket, definitionId, replicationStreamId: this.group_id });
329
+ // --- Clear: collapse leading MOVE/REMOVE/CLEAR sequence ---
330
+ if (lastNotPut != null && opsSincePut >= 2) {
331
+ if (clearBoundaryDocId == null) {
332
+ throw new ReplicationAssertionError(`Missing CLEAR boundary document for bucket ${bucket}`);
333
+ }
334
+ totalOpCount += await this.clearBucketLeading(lastNotPut, clearBoundaryDocId, bucketContext, collection, context);
335
+ }
336
+ // --- Finalize: update bucket checksums and state ---
337
+ this.updateBucketChecksums({
338
+ bucket,
339
+ definitionId: resolvedDefinitionId,
340
+ seen: new Map(),
341
+ trackingSize: 0,
342
+ lastNotPut: lastNotPut,
343
+ opsSincePut: opsSincePut,
344
+ checksum: totalChecksum,
345
+ opCount: totalOpCount,
346
+ opBytes: totalOpBytes
347
+ });
348
+ if (this.bucketStateUpdates.length > 0) {
349
+ await this.writeBucketStateUpdates();
350
+ this.bucketStateUpdates = [];
351
+ }
352
+ logger.info(`Compacted bucket ${bucket}: ${totalOpCount} surviving ops`);
353
+ }
354
+ /**
355
+ * Collapse the leading sequence of MOVE/REMOVE/CLEAR ops at the start
356
+ * of the bucket into a single CLEAR op. Reads whole clearable documents
357
+ * before the known boundary document, then splits that boundary document
358
+ * if it contains ops on both sides of lastNotPut.
359
+ *
360
+ * Returns the op count diff after replacing cleared ops with CLEAR ops.
361
+ */
362
+ async clearBucketLeading(lastNotPut, boundaryDocId, bucketContext, collection, context) {
363
+ let opCountDiff = 0;
364
+ const session = this.db.client.startSession();
365
+ try {
366
+ let done = false;
367
+ // First step is to clear full chunks that contain only CLEAR/MOVE/REMOVE operations.
368
+ // There can be many of them, so we do one batch at a time.
369
+ while (!done) {
370
+ const batch = await this.clearLeadingFullDocuments(session, lastNotPut, boundaryDocId, bucketContext, collection, context);
371
+ done = batch.done;
372
+ opCountDiff += batch.opCountDiff;
373
+ }
374
+ // The final step is to process the "boundary" document: It may contain some CLEAR/MOVE/REMOVE operations,
375
+ // potentially followed by PUT operations. This is only a single document, so no need for batching.
376
+ opCountDiff += await this.clearBoundaryDocument(session, lastNotPut, boundaryDocId, bucketContext, collection, context);
377
+ }
378
+ finally {
379
+ await session.endSession();
380
+ }
381
+ return opCountDiff;
382
+ }
383
+ async clearLeadingFullDocuments(session, lastNotPut, boundaryDocId, bucketContext, collection, context) {
384
+ const bucket = bucketContext.key.bucket;
385
+ let done = false;
386
+ let opCountDiff = 0;
387
+ this.signal?.throwIfAborted();
388
+ await session.withTransaction(async () => {
389
+ const query = collection.find({
390
+ _id: {
391
+ $gte: bucketContext.minId,
392
+ $lt: boundaryDocId
393
+ }
394
+ }, {
395
+ session,
396
+ sort: { _id: 1 },
397
+ projection: {
398
+ _id: 1,
399
+ min_op: 1,
400
+ checksum: 1,
401
+ count: 1,
402
+ target_op: 1,
403
+ ops: 1
404
+ },
405
+ limit: this.clearBatchLimit
406
+ });
407
+ let combinedChecksum = 0;
408
+ let clearedOpCount = 0;
409
+ let maxTargetOp = null;
410
+ let lastDocId = null;
411
+ let clearOpCount = 0;
412
+ let gotNonClearOp = false;
413
+ for await (const doc of query.stream()) {
414
+ if (doc.min_op > lastNotPut) {
415
+ throw new ReplicationAssertionError(`Unexpected document before CLEAR boundary with min_op ${doc.min_op} > ${lastNotPut} in bucket ${bucket}`);
416
+ }
417
+ lastDocId = doc._id;
418
+ for (const op of loadBucketDataDocument(context, doc)) {
419
+ if (op.o > lastNotPut) {
420
+ throw new ReplicationAssertionError(`Unexpected op ${op.o} after CLEAR boundary ${lastNotPut} in bucket ${bucket}`);
421
+ }
422
+ if (op.op == 'PUT') {
423
+ throw new ReplicationAssertionError(`Unexpected PUT at op ${op.o} in CLEAR region for bucket ${bucket}`);
424
+ }
425
+ if (op.op == 'CLEAR') {
426
+ clearOpCount++;
427
+ if (clearOpCount > 1) {
428
+ throw new ReplicationAssertionError(`Unexpected multiple CLEAR operations in bucket ${bucket}`);
429
+ }
430
+ }
431
+ else {
432
+ gotNonClearOp = true;
433
+ }
434
+ combinedChecksum = addChecksums(combinedChecksum, Number(op.checksum));
435
+ clearedOpCount++;
436
+ if (op.target_op != null && (maxTargetOp == null || op.target_op > maxTargetOp)) {
437
+ maxTargetOp = op.target_op;
438
+ }
439
+ }
440
+ }
441
+ if (!gotNonClearOp) {
442
+ done = true;
443
+ return;
444
+ }
445
+ this.logger.info(`Flushing CLEAR for ${clearedOpCount} ops at ${lastDocId?.o}`);
446
+ await collection.deleteMany({
447
+ _id: {
448
+ $gte: bucketContext.minId,
449
+ $lte: lastDocId
450
+ }
451
+ }, { session });
452
+ const clearOp = {
453
+ bucketKey: { ...context, bucket },
454
+ o: lastDocId.o,
455
+ op: 'CLEAR',
456
+ checksum: BigInt(combinedChecksum),
457
+ data: null,
458
+ target_op: maxTargetOp
459
+ };
460
+ await collection.insertOne(serializeBucketData(bucket, [clearOp]), { session });
461
+ opCountDiff = -clearedOpCount + 1;
462
+ }, {
463
+ writeConcern: { w: 'majority' },
464
+ readConcern: { level: 'snapshot' }
465
+ });
466
+ return { done, opCountDiff };
467
+ }
468
+ async clearBoundaryDocument(session, lastNotPut, boundaryDocId, bucketContext, collection, context) {
469
+ const bucket = bucketContext.key.bucket;
470
+ let opCountDiff = 0;
471
+ await session.withTransaction(async () => {
472
+ const query = collection.find({
473
+ // This is a range query, but should only ever return two documents:
474
+ // 1. The CLEAR op from the previous clearLeadingFullDocuments.
475
+ // 2. The boundary document.
476
+ _id: {
477
+ $gte: bucketContext.minId,
478
+ $lte: boundaryDocId
479
+ }
480
+ }, {
481
+ session,
482
+ sort: { _id: 1 },
483
+ projection: {
484
+ _id: 1,
485
+ min_op: 1,
486
+ checksum: 1,
487
+ count: 1,
488
+ target_op: 1,
489
+ ops: 1
490
+ },
491
+ limit: 3
492
+ });
493
+ let docsRead = 0;
494
+ let combinedChecksum = 0;
495
+ let clearedOpCount = 0;
496
+ let maxTargetOp = null;
497
+ const boundarySurvivors = [];
498
+ for await (const doc of query.stream()) {
499
+ docsRead++;
500
+ if (docsRead > 2) {
501
+ throw new ReplicationAssertionError(`Unexpected extra document before CLEAR boundary in bucket ${bucket}`);
502
+ }
503
+ const isBoundaryDoc = doc._id.o == boundaryDocId.o;
504
+ for (const op of loadBucketDataDocument(context, doc)) {
505
+ if (!isBoundaryDoc && op.op != 'CLEAR') {
506
+ throw new ReplicationAssertionError(`Unexpected ${op.op} operation before CLEAR boundary in bucket ${bucket}`);
507
+ }
508
+ if (op.o <= lastNotPut) {
509
+ if (op.op == 'PUT') {
510
+ throw new ReplicationAssertionError(`Unexpected PUT at op ${op.o} in CLEAR region for bucket ${bucket}`);
511
+ }
512
+ combinedChecksum = addChecksums(combinedChecksum, Number(op.checksum));
513
+ clearedOpCount++;
514
+ if (op.target_op != null && (maxTargetOp == null || op.target_op > maxTargetOp)) {
515
+ maxTargetOp = op.target_op;
516
+ }
517
+ }
518
+ else if (isBoundaryDoc) {
519
+ boundarySurvivors.push(op);
520
+ }
521
+ else {
522
+ throw new ReplicationAssertionError(`Unexpected op ${op.o} after CLEAR boundary ${lastNotPut} in bucket ${bucket}`);
523
+ }
524
+ }
525
+ }
526
+ if (clearedOpCount == 0) {
527
+ throw new Error(`CLEAR boundary document not found for bucket ${bucket}`);
528
+ }
529
+ this.logger.info(`Flushing CLEAR for ${clearedOpCount} ops at ${lastNotPut}`);
530
+ await collection.deleteMany({
531
+ _id: {
532
+ $gte: bucketContext.minId,
533
+ $lte: boundaryDocId
534
+ }
535
+ }, { session });
536
+ const clearOp = {
537
+ bucketKey: { ...context, bucket },
538
+ o: lastNotPut,
539
+ op: 'CLEAR',
540
+ checksum: BigInt(combinedChecksum),
541
+ data: null,
542
+ target_op: maxTargetOp
543
+ };
544
+ await collection.insertOne(serializeBucketData(bucket, [clearOp]), { session });
545
+ if (boundarySurvivors.length > 0) {
546
+ const survivingDocs = chunkBucketData(boundarySurvivors).map((chunk) => serializeBucketData(bucket, chunk));
547
+ await collection.insertMany(survivingDocs, { session });
548
+ }
549
+ opCountDiff = -clearedOpCount + 1;
550
+ }, {
551
+ writeConcern: { w: 'majority' },
552
+ readConcern: { level: 'snapshot' }
553
+ });
554
+ return opCountDiff;
66
555
  }
67
556
  }
68
557
  //# sourceMappingURL=MongoCompactorV3.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"MongoCompactorV3.js","sourceRoot":"","sources":["../../../../src/storage/implementation/v3/MongoCompactorV3.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"MongoCompactorV3.js","sourceRoot":"","sources":["../../../../src/storage/implementation/v3/MongoCompactorV3.ts"],"names":[],"mappings":"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"}