@powersync/service-module-mongodb-storage 0.20.0 → 0.21.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.
- package/CHANGELOG.md +45 -0
- package/dist/storage/MongoBucketStorage.d.ts +31 -3
- package/dist/storage/MongoBucketStorage.js +365 -206
- package/dist/storage/MongoBucketStorage.js.map +1 -1
- package/dist/storage/implementation/MongoBucketBatch.d.ts +15 -4
- package/dist/storage/implementation/MongoBucketBatch.js +35 -9
- package/dist/storage/implementation/MongoBucketBatch.js.map +1 -1
- package/dist/storage/implementation/MongoCompactor.d.ts +19 -79
- package/dist/storage/implementation/MongoCompactor.js +27 -238
- package/dist/storage/implementation/MongoCompactor.js.map +1 -1
- package/dist/storage/implementation/MongoParameterCompactor.d.ts +83 -10
- package/dist/storage/implementation/MongoParameterCompactor.js +309 -96
- package/dist/storage/implementation/MongoParameterCompactor.js.map +1 -1
- package/dist/storage/implementation/MongoParsedSyncConfigSet.d.ts +9 -1
- package/dist/storage/implementation/MongoParsedSyncConfigSet.js +29 -0
- package/dist/storage/implementation/MongoParsedSyncConfigSet.js.map +1 -1
- package/dist/storage/implementation/MongoPersistedSyncConfigContent.js +4 -2
- package/dist/storage/implementation/MongoPersistedSyncConfigContent.js.map +1 -1
- package/dist/storage/implementation/MongoStorageProvider.js +3 -1
- package/dist/storage/implementation/MongoStorageProvider.js.map +1 -1
- package/dist/storage/implementation/MongoSyncBucketStorage.d.ts +27 -11
- package/dist/storage/implementation/MongoSyncBucketStorage.js +78 -31
- package/dist/storage/implementation/MongoSyncBucketStorage.js.map +1 -1
- package/dist/storage/implementation/MongoSyncRulesLock.js +21 -9
- package/dist/storage/implementation/MongoSyncRulesLock.js.map +1 -1
- package/dist/storage/implementation/MongoWriteCheckpointAPI.d.ts +9 -7
- package/dist/storage/implementation/MongoWriteCheckpointAPI.js +7 -28
- package/dist/storage/implementation/MongoWriteCheckpointAPI.js.map +1 -1
- package/dist/storage/implementation/SyncRuleStateUpdate.d.ts +11 -5
- package/dist/storage/implementation/SyncRuleStateUpdate.js +14 -6
- package/dist/storage/implementation/SyncRuleStateUpdate.js.map +1 -1
- package/dist/storage/implementation/common/MongoSyncBucketStorageCheckpoint.d.ts +22 -2
- package/dist/storage/implementation/common/PersistedBatch.d.ts +27 -0
- package/dist/storage/implementation/common/PersistedBatch.js +43 -2
- package/dist/storage/implementation/common/PersistedBatch.js.map +1 -1
- package/dist/storage/implementation/db.d.ts +4 -1
- package/dist/storage/implementation/db.js +14 -1
- package/dist/storage/implementation/db.js.map +1 -1
- package/dist/storage/implementation/models.d.ts +31 -0
- package/dist/storage/implementation/models.js.map +1 -1
- package/dist/storage/implementation/v1/MongoBucketBatchV1.d.ts +2 -0
- package/dist/storage/implementation/v1/MongoBucketBatchV1.js +22 -0
- package/dist/storage/implementation/v1/MongoBucketBatchV1.js.map +1 -1
- package/dist/storage/implementation/v1/MongoCompactorV1.d.ts +36 -5
- package/dist/storage/implementation/v1/MongoCompactorV1.js +229 -8
- package/dist/storage/implementation/v1/MongoCompactorV1.js.map +1 -1
- package/dist/storage/implementation/v1/MongoParameterCompactorV1.d.ts +16 -2
- package/dist/storage/implementation/v1/MongoParameterCompactorV1.js +20 -9
- package/dist/storage/implementation/v1/MongoParameterCompactorV1.js.map +1 -1
- package/dist/storage/implementation/v1/MongoSyncBucketStorageV1.d.ts +18 -11
- package/dist/storage/implementation/v1/MongoSyncBucketStorageV1.js +65 -16
- package/dist/storage/implementation/v1/MongoSyncBucketStorageV1.js.map +1 -1
- package/dist/storage/implementation/v1/models.js +1 -0
- package/dist/storage/implementation/v1/models.js.map +1 -1
- package/dist/storage/implementation/v3/CompactionLease.d.ts +50 -0
- package/dist/storage/implementation/v3/CompactionLease.js +131 -0
- package/dist/storage/implementation/v3/CompactionLease.js.map +1 -0
- package/dist/storage/implementation/v3/MongoBucketBatchV3.d.ts +8 -1
- package/dist/storage/implementation/v3/MongoBucketBatchV3.js +90 -19
- package/dist/storage/implementation/v3/MongoBucketBatchV3.js.map +1 -1
- package/dist/storage/implementation/v3/MongoCompactorV3.d.ts +77 -25
- package/dist/storage/implementation/v3/MongoCompactorV3.js +585 -141
- package/dist/storage/implementation/v3/MongoCompactorV3.js.map +1 -1
- package/dist/storage/implementation/v3/MongoParameterCompactorV3.d.ts +18 -0
- package/dist/storage/implementation/v3/MongoParameterCompactorV3.js +23 -0
- package/dist/storage/implementation/v3/MongoParameterCompactorV3.js.map +1 -0
- package/dist/storage/implementation/v3/MongoStoppedSyncConfigCleanup.d.ts +2 -15
- package/dist/storage/implementation/v3/MongoStoppedSyncConfigCleanup.js +60 -92
- package/dist/storage/implementation/v3/MongoStoppedSyncConfigCleanup.js.map +1 -1
- package/dist/storage/implementation/v3/MongoSyncBucketStorageV3.d.ts +19 -9
- package/dist/storage/implementation/v3/MongoSyncBucketStorageV3.js +91 -31
- package/dist/storage/implementation/v3/MongoSyncBucketStorageV3.js.map +1 -1
- package/dist/storage/implementation/v3/MongoWriteCheckpointAPIV3.d.ts +26 -0
- package/dist/storage/implementation/v3/MongoWriteCheckpointAPIV3.js +82 -0
- package/dist/storage/implementation/v3/MongoWriteCheckpointAPIV3.js.map +1 -0
- package/dist/storage/implementation/v3/PersistedBatchV3.d.ts +2 -0
- package/dist/storage/implementation/v3/PersistedBatchV3.js +52 -11
- package/dist/storage/implementation/v3/PersistedBatchV3.js.map +1 -1
- package/dist/storage/implementation/v3/VersionedPowerSyncMongoV3.d.ts +12 -2
- package/dist/storage/implementation/v3/VersionedPowerSyncMongoV3.js +42 -3
- package/dist/storage/implementation/v3/VersionedPowerSyncMongoV3.js.map +1 -1
- package/dist/storage/implementation/v3/bucket-format.js +2 -0
- package/dist/storage/implementation/v3/bucket-format.js.map +1 -1
- package/dist/storage/implementation/v3/compact-utils.d.ts +107 -0
- package/dist/storage/implementation/v3/compact-utils.js +216 -0
- package/dist/storage/implementation/v3/compact-utils.js.map +1 -0
- package/dist/storage/implementation/v3/compaction-constants.d.ts +5 -0
- package/dist/storage/implementation/v3/compaction-constants.js +6 -0
- package/dist/storage/implementation/v3/compaction-constants.js.map +1 -0
- package/dist/storage/implementation/v3/models.d.ts +84 -4
- package/dist/storage/implementation/v3/models.js.map +1 -1
- package/dist/storage/implementation/v3/object-storage/BucketDataObjectStorage.d.ts +7 -8
- package/dist/storage/implementation/v3/object-storage/BucketDataObjectStorage.js +8 -4
- package/dist/storage/implementation/v3/object-storage/BucketDataObjectStorage.js.map +1 -1
- package/dist/storage/implementation/v3/object-storage/ObjectStorage.d.ts +14 -11
- package/dist/storage/implementation/v3/object-storage/ObjectStorageLifecycle.d.ts +3 -5
- package/dist/storage/implementation/v3/object-storage/ObjectStorageLifecycle.js +10 -2
- package/dist/storage/implementation/v3/object-storage/ObjectStorageLifecycle.js.map +1 -1
- package/dist/storage/implementation/v3/object-storage/ObjectStorageUsage.d.ts +37 -0
- package/dist/storage/implementation/v3/object-storage/ObjectStorageUsage.js +167 -0
- package/dist/storage/implementation/v3/object-storage/ObjectStorageUsage.js.map +1 -0
- package/dist/storage/implementation/v3/object-storage/S3ObjectStorage.d.ts +37 -12
- package/dist/storage/implementation/v3/object-storage/S3ObjectStorage.js +177 -23
- package/dist/storage/implementation/v3/object-storage/S3ObjectStorage.js.map +1 -1
- package/dist/storage/implementation/v3/source-table-utils.d.ts +6 -6
- package/dist/storage/implementation/v3/source-table-utils.js +30 -37
- package/dist/storage/implementation/v3/source-table-utils.js.map +1 -1
- package/dist/storage/storage-index.d.ts +2 -1
- package/dist/storage/storage-index.js +1 -0
- package/dist/storage/storage-index.js.map +1 -1
- package/dist/types/types.d.ts +23 -1
- package/dist/types/types.js +16 -7
- package/dist/types/types.js.map +1 -1
- package/dist/utils/util.js +3 -1
- package/dist/utils/util.js.map +1 -1
- package/package.json +10 -9
- package/src/storage/MongoBucketStorage.ts +495 -268
- package/src/storage/implementation/MongoBucketBatch.ts +54 -14
- package/src/storage/implementation/MongoCompactor.ts +35 -346
- package/src/storage/implementation/MongoParameterCompactor.ts +388 -102
- package/src/storage/implementation/MongoParsedSyncConfigSet.ts +34 -0
- package/src/storage/implementation/MongoPersistedSyncConfigContent.ts +4 -2
- package/src/storage/implementation/MongoStorageProvider.ts +3 -1
- package/src/storage/implementation/MongoSyncBucketStorage.ts +114 -40
- package/src/storage/implementation/MongoSyncRulesLock.ts +22 -9
- package/src/storage/implementation/MongoWriteCheckpointAPI.ts +12 -44
- package/src/storage/implementation/SyncRuleStateUpdate.ts +13 -6
- package/src/storage/implementation/common/MongoSyncBucketStorageCheckpoint.ts +24 -2
- package/src/storage/implementation/common/PersistedBatch.ts +54 -2
- package/src/storage/implementation/db.ts +21 -2
- package/src/storage/implementation/models.ts +34 -0
- package/src/storage/implementation/v1/MongoBucketBatchV1.ts +31 -0
- package/src/storage/implementation/v1/MongoCompactorV1.ts +303 -19
- package/src/storage/implementation/v1/MongoParameterCompactorV1.ts +25 -9
- package/src/storage/implementation/v1/MongoSyncBucketStorageV1.ts +87 -27
- package/src/storage/implementation/v1/models.ts +1 -0
- package/src/storage/implementation/v3/CompactionLease.ts +152 -0
- package/src/storage/implementation/v3/MongoBucketBatchV3.ts +124 -22
- package/src/storage/implementation/v3/MongoCompactorV3.ts +744 -190
- package/src/storage/implementation/v3/MongoParameterCompactorV3.ts +34 -0
- package/src/storage/implementation/v3/MongoStoppedSyncConfigCleanup.ts +100 -109
- package/src/storage/implementation/v3/MongoSyncBucketStorageV3.ts +111 -41
- package/src/storage/implementation/v3/MongoWriteCheckpointAPIV3.ts +111 -0
- package/src/storage/implementation/v3/PersistedBatchV3.ts +57 -12
- package/src/storage/implementation/v3/VersionedPowerSyncMongoV3.ts +55 -4
- package/src/storage/implementation/v3/bucket-format.ts +2 -0
- package/src/storage/implementation/v3/compact-utils.ts +320 -0
- package/src/storage/implementation/v3/compaction-constants.ts +5 -0
- package/src/storage/implementation/v3/models.ts +91 -3
- package/src/storage/implementation/v3/object-storage/BucketDataObjectStorage.ts +16 -8
- package/src/storage/implementation/v3/object-storage/ObjectStorage.ts +20 -5
- package/src/storage/implementation/v3/object-storage/ObjectStorageLifecycle.ts +15 -4
- package/src/storage/implementation/v3/object-storage/ObjectStorageUsage.ts +230 -0
- package/src/storage/implementation/v3/object-storage/S3ObjectStorage.ts +257 -27
- package/src/storage/implementation/v3/source-table-utils.ts +39 -41
- package/src/storage/storage-index.ts +2 -0
- package/src/types/types.ts +24 -7
- package/src/utils/util.ts +3 -1
- package/test/src/__snapshots__/storage.test.ts.snap +25 -0
- package/test/src/__snapshots__/storage_sync.test.ts.snap +605 -16
- package/test/src/cleanup-stopped-sync-configs.test.ts +40 -13
- package/test/src/compact-utils.test.ts +226 -0
- package/test/src/helpers/MemoryObjectStorage.ts +14 -6
- package/test/src/object_storage_usage.test.ts +255 -0
- package/test/src/parameter_compacting_v1.test.ts +120 -0
- package/test/src/parameter_compacting_v3.test.ts +192 -0
- package/test/src/parameter_compaction_fence.test.ts +276 -0
- package/test/src/storage.test.ts +273 -22
- package/test/src/storage_compacting.test.ts +714 -244
- package/test/src/storage_s3_checksums.test.ts +3 -4
- package/test/src/storage_s3_compaction_lifecycle.test.ts +138 -12
- package/test/src/storage_s3_reading.test.ts +243 -1
- package/test/src/storage_s3_writing.test.ts +1 -0
- package/test/src/storage_sync.test.ts +336 -41
- package/test/src/util.ts +1 -1
- package/tsconfig.tsbuildinfo +1 -1
|
@@ -4,16 +4,20 @@ import { mongoTableId } from '../../../utils/util.js';
|
|
|
4
4
|
import { PersistedBatch } from '../common/PersistedBatch.js';
|
|
5
5
|
import { serializeBucketData } from './bucket-format.js';
|
|
6
6
|
import { chunkBucketData } from './chunking.js';
|
|
7
|
+
import { DEFAULT_MIN_COMPACT_CHUNK_INTERVAL_MS } from './compaction-constants.js';
|
|
7
8
|
import { serializeParameterLookup, taggedBucketParameterDocumentToTagged } from './models.js';
|
|
8
9
|
import { ObjectStorageLifecycle } from './object-storage/ObjectStorageLifecycle.js';
|
|
10
|
+
import { ObjectStorageUsage } from './object-storage/ObjectStorageUsage.js';
|
|
9
11
|
export class PersistedBatchV3 extends PersistedBatch {
|
|
10
12
|
currentData = [];
|
|
11
13
|
sourceTablePendingDeletes = new Map();
|
|
12
14
|
objectStorageLifecycle;
|
|
15
|
+
objectStorageUsage;
|
|
13
16
|
constructor(db, group_id, mapping, writtenSize, options) {
|
|
14
17
|
super(db, group_id, mapping, writtenSize, options);
|
|
15
18
|
if (this.objectStorage) {
|
|
16
19
|
this.objectStorageLifecycle = new ObjectStorageLifecycle(this.db, this.group_id, this.objectStorage);
|
|
20
|
+
this.objectStorageUsage = new ObjectStorageUsage(this.db, this.group_id, this.objectStorageUsageWriterId);
|
|
17
21
|
}
|
|
18
22
|
}
|
|
19
23
|
// Abstract override from PersistedBatch (V3-specific error message)
|
|
@@ -172,14 +176,15 @@ export class PersistedBatchV3 extends PersistedBatch {
|
|
|
172
176
|
existing.push(document);
|
|
173
177
|
operationsByDefinition.set(document.bucketKey.definitionId, existing);
|
|
174
178
|
}
|
|
175
|
-
let uploadCount = 0;
|
|
176
179
|
const plans = Array.from(operationsByDefinition, ([definitionId, documents]) => {
|
|
177
180
|
const operationsByBucket = Map.groupBy(documents, (document) => document.bucketKey.bucket);
|
|
178
181
|
const lifecycle = this.objectStorageLifecycle;
|
|
179
182
|
const createInserts = [];
|
|
180
183
|
for (const [bucket, ops] of operationsByBucket) {
|
|
184
|
+
this.resetBucketPersistedBytes(definitionId, bucket);
|
|
181
185
|
for (const chunk of chunkBucketData(ops)) {
|
|
182
186
|
const serialized = serializeBucketData(bucket, chunk);
|
|
187
|
+
this.incrementBucketPersistedChunk(definitionId, bucket, serialized.size);
|
|
183
188
|
if (lifecycle == null || serialized.size <= this.inlineThresholdBytes) {
|
|
184
189
|
createInserts.push(async () => ({
|
|
185
190
|
insertOne: {
|
|
@@ -188,13 +193,12 @@ export class PersistedBatchV3 extends PersistedBatch {
|
|
|
188
193
|
}));
|
|
189
194
|
continue;
|
|
190
195
|
}
|
|
191
|
-
uploadCount += 1;
|
|
192
196
|
createInserts.push(async () => {
|
|
193
197
|
const minOp = chunk[0].o;
|
|
194
198
|
const maxOp = chunk[chunk.length - 1].o;
|
|
195
199
|
const { ops: bucketOps, ...metadata } = serialized;
|
|
196
200
|
const path = lifecycle.allocatePath(definitionId, bucket, minOp, maxOp);
|
|
197
|
-
const { fileSize } = await lifecycle.bucketData.store(path, bucketOps);
|
|
201
|
+
const { fileSize } = await lifecycle.bucketData.store(path, bucketOps, { signal: this.signal });
|
|
198
202
|
return {
|
|
199
203
|
insertOne: {
|
|
200
204
|
document: {
|
|
@@ -219,7 +223,14 @@ export class PersistedBatchV3 extends PersistedBatch {
|
|
|
219
223
|
// so replication can schedule its uploads together without creating a
|
|
220
224
|
// separate limiter here.
|
|
221
225
|
const writes = await createAllInserts();
|
|
226
|
+
const usageDeltas = this.objectStorageUsage == null ? undefined : new Map();
|
|
222
227
|
for (const { definitionId, inserts } of writes) {
|
|
228
|
+
if (usageDeltas != null) {
|
|
229
|
+
const delta = inserts.reduce((sum, operation) => sum + ObjectStorageUsage.bytes(operation.insertOne.document), 0n);
|
|
230
|
+
if (delta !== 0n) {
|
|
231
|
+
usageDeltas.set(definitionId, delta);
|
|
232
|
+
}
|
|
233
|
+
}
|
|
223
234
|
if (inserts.length > 0) {
|
|
224
235
|
await this.db.bucketData(this.group_id, definitionId).bulkWrite(inserts, {
|
|
225
236
|
session,
|
|
@@ -227,6 +238,9 @@ export class PersistedBatchV3 extends PersistedBatch {
|
|
|
227
238
|
});
|
|
228
239
|
}
|
|
229
240
|
}
|
|
241
|
+
if (usageDeltas != null) {
|
|
242
|
+
await this.objectStorageUsage.applyDeltas(usageDeltas, session);
|
|
243
|
+
}
|
|
230
244
|
}
|
|
231
245
|
async flushBucketParameters(session) {
|
|
232
246
|
const operationsByIndex = new Map();
|
|
@@ -302,15 +316,42 @@ export class PersistedBatchV3 extends PersistedBatch {
|
|
|
302
316
|
b: state.bucket
|
|
303
317
|
}
|
|
304
318
|
},
|
|
305
|
-
update
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
319
|
+
// A pipeline update makes initialisation and scheduling one atomic
|
|
320
|
+
// writer operation. In particular, a later write cannot move an
|
|
321
|
+
// already-due compact check into the future.
|
|
322
|
+
update: [
|
|
323
|
+
{
|
|
324
|
+
$set: {
|
|
325
|
+
last_op: state.lastOp,
|
|
326
|
+
bucket_stats: {
|
|
327
|
+
count: { $add: [{ $ifNull: ['$bucket_stats.count', 0] }, state.incrementCount] },
|
|
328
|
+
bytes: { $add: [{ $ifNull: ['$bucket_stats.bytes', 0n] }, BigInt(state.incrementBytes)] },
|
|
329
|
+
chunks: { $add: [{ $ifNull: ['$bucket_stats.chunks', 0] }, state.incrementChunks] }
|
|
330
|
+
},
|
|
331
|
+
first_uncompacted_write: { $ifNull: ['$first_uncompacted_write', '$$NOW'] },
|
|
332
|
+
next_compact_check: {
|
|
333
|
+
$let: {
|
|
334
|
+
vars: {
|
|
335
|
+
requested: {
|
|
336
|
+
$dateAdd: {
|
|
337
|
+
startDate: '$$NOW',
|
|
338
|
+
unit: 'millisecond',
|
|
339
|
+
amount: DEFAULT_MIN_COMPACT_CHUNK_INTERVAL_MS
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
},
|
|
343
|
+
in: {
|
|
344
|
+
$cond: [
|
|
345
|
+
{ $lt: [{ $ifNull: ['$next_compact_check', '$$requested'] }, '$$requested'] },
|
|
346
|
+
'$next_compact_check',
|
|
347
|
+
'$$requested'
|
|
348
|
+
]
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
}
|
|
312
353
|
}
|
|
313
|
-
|
|
354
|
+
],
|
|
314
355
|
upsert: true
|
|
315
356
|
}
|
|
316
357
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PersistedBatchV3.js","sourceRoot":"","sources":["../../../../src/storage/implementation/v3/PersistedBatchV3.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"PersistedBatchV3.js","sourceRoot":"","sources":["../../../../src/storage/implementation/v3/PersistedBatchV3.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,13 @@
|
|
|
1
1
|
import { mongo } from '@powersync/lib-service-mongodb';
|
|
2
|
-
import { BucketDefinitionId, ParameterIndexId } from '@powersync/service-sync-rules';
|
|
2
|
+
import { BucketDefinitionId, EventDefinitionId, ParameterIndexId } from '@powersync/service-sync-rules';
|
|
3
3
|
import { BaseVersionedPowerSyncMongo } from '../common/VersionedPowerSyncMongoBase.js';
|
|
4
4
|
import { CommonSourceTableDocument } from '../models.js';
|
|
5
|
-
import { BucketDataDocumentV3, BucketParameterDocumentV3, BucketStateDocumentV3, CurrentDataDocumentV3, ObjectStorageDeletionMarker, SourceTableDocumentV3, SyncConfigDefinition } from './models.js';
|
|
5
|
+
import { BucketDataDocumentV3, BucketParameterDocumentV3, BucketStateDocumentV3, CurrentDataDocumentV3, CustomCheckpointRequestDocumentV3, ObjectStorageDeletionMarker, ObjectStorageUsageDocument, SourceTableDocumentV3, SyncConfigDefinition } from './models.js';
|
|
6
|
+
export declare const OBJECT_STORAGE_USAGE_COLLECTION = "object_storage_usage";
|
|
7
|
+
export type CustomCheckpointRequestCollectionSpecifier = {
|
|
8
|
+
replicationStreamId: number;
|
|
9
|
+
eventId: EventDefinitionId;
|
|
10
|
+
};
|
|
6
11
|
export declare class VersionedPowerSyncMongoV3 extends BaseVersionedPowerSyncMongo {
|
|
7
12
|
constructor(upstream: ConstructorParameters<typeof BaseVersionedPowerSyncMongo>[0], storageConfig: ConstructorParameters<typeof BaseVersionedPowerSyncMongo>[1]);
|
|
8
13
|
get syncConfigDefinitions(): mongo.Collection<SyncConfigDefinition>;
|
|
@@ -15,10 +20,15 @@ export declare class VersionedPowerSyncMongoV3 extends BaseVersionedPowerSyncMon
|
|
|
15
20
|
sourceTables(replicationStreamId: number): mongo.Collection<SourceTableDocumentV3>;
|
|
16
21
|
bucketData(replicationStreamId: number, definitionId: BucketDefinitionId): mongo.Collection<BucketDataDocumentV3>;
|
|
17
22
|
pendingObjectStorageDeletes(replicationStreamId: number): mongo.Collection<ObjectStorageDeletionMarker>;
|
|
23
|
+
get objectStorageUsage(): mongo.Collection<ObjectStorageUsageDocument>;
|
|
24
|
+
customCheckpointRequests(options: CustomCheckpointRequestCollectionSpecifier): mongo.Collection<CustomCheckpointRequestDocumentV3>;
|
|
25
|
+
initializeCustomCheckpointRequestsCollection(options: CustomCheckpointRequestCollectionSpecifier): Promise<void>;
|
|
26
|
+
listCustomCheckpointRequestCollections(replicationStreamId: number): Promise<mongo.Collection<CustomCheckpointRequestDocumentV3>[]>;
|
|
18
27
|
listBucketDataCollections(replicationStreamId: number): Promise<mongo.Collection<mongo.BSON.Document>[]>;
|
|
19
28
|
listParameterIndexCollections(replicationStreamId: number): Promise<{
|
|
20
29
|
collection: mongo.Collection<mongo.BSON.Document>;
|
|
21
30
|
indexId: string;
|
|
22
31
|
}[]>;
|
|
23
32
|
initializeStreamStorage(replicationStreamId: number): Promise<void>;
|
|
33
|
+
customCheckpointRequestCollectionName(options: CustomCheckpointRequestCollectionSpecifier): string;
|
|
24
34
|
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { BaseVersionedPowerSyncMongo } from '../common/VersionedPowerSyncMongoBase.js';
|
|
2
|
+
export const OBJECT_STORAGE_USAGE_COLLECTION = 'object_storage_usage';
|
|
2
3
|
export class VersionedPowerSyncMongoV3 extends BaseVersionedPowerSyncMongo {
|
|
3
4
|
constructor(upstream, storageConfig) {
|
|
4
5
|
super(upstream, storageConfig);
|
|
@@ -40,6 +41,38 @@ export class VersionedPowerSyncMongoV3 extends BaseVersionedPowerSyncMongo {
|
|
|
40
41
|
pendingObjectStorageDeletes(replicationStreamId) {
|
|
41
42
|
return this.db.collection(`pending_object_storage_deletes_${replicationStreamId}`);
|
|
42
43
|
}
|
|
44
|
+
get objectStorageUsage() {
|
|
45
|
+
return this.db.collection(OBJECT_STORAGE_USAGE_COLLECTION);
|
|
46
|
+
}
|
|
47
|
+
customCheckpointRequests(options) {
|
|
48
|
+
const collectionName = this.customCheckpointRequestCollectionName(options);
|
|
49
|
+
return this.db.collection(collectionName);
|
|
50
|
+
}
|
|
51
|
+
async initializeCustomCheckpointRequestsCollection(options) {
|
|
52
|
+
// createIndexes also creates the collection on first use. Callers invoke
|
|
53
|
+
// this lazily before the transaction which writes the first checkpoint.
|
|
54
|
+
await this.customCheckpointRequests(options).createIndexes([
|
|
55
|
+
{
|
|
56
|
+
key: { user_id: 1 },
|
|
57
|
+
name: 'user_unique',
|
|
58
|
+
unique: true
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
// Find checkpoint changes over an operation-id range.
|
|
62
|
+
key: { op_id: 1 },
|
|
63
|
+
name: 'op_id'
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
// Limit retention scans to temporary client-requested checkpoints.
|
|
67
|
+
key: { checkpoint_requested_at: 1 },
|
|
68
|
+
name: 'checkpoint_requested_at',
|
|
69
|
+
partialFilterExpression: { checkpoint_requested_at: { $exists: true } }
|
|
70
|
+
}
|
|
71
|
+
]);
|
|
72
|
+
}
|
|
73
|
+
listCustomCheckpointRequestCollections(replicationStreamId) {
|
|
74
|
+
return this.upstream.listCustomCheckpointRequestCollections(replicationStreamId);
|
|
75
|
+
}
|
|
43
76
|
listBucketDataCollections(replicationStreamId) {
|
|
44
77
|
return this.listCollectionsByPrefix(`bucket_data_${replicationStreamId}_`);
|
|
45
78
|
}
|
|
@@ -71,9 +104,15 @@ export class VersionedPowerSyncMongoV3 extends BaseVersionedPowerSyncMongo {
|
|
|
71
104
|
await bucketState.createIndex({
|
|
72
105
|
last_op: 1
|
|
73
106
|
}, { name: 'bucket_updates', unique: true });
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
107
|
+
// V3 workers claim only buckets that have reached their scheduled check
|
|
108
|
+
// time, keeping scheduled scans proportional to pending work.
|
|
109
|
+
await bucketState.createIndex({ next_compact_check: 1 }, {
|
|
110
|
+
name: 'next_compact_check',
|
|
111
|
+
partialFilterExpression: { next_compact_check: { $exists: true } }
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
customCheckpointRequestCollectionName(options) {
|
|
115
|
+
return this.upstream.customCheckpointRequestCollectionName(options);
|
|
77
116
|
}
|
|
78
117
|
}
|
|
79
118
|
//# sourceMappingURL=VersionedPowerSyncMongoV3.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VersionedPowerSyncMongoV3.js","sourceRoot":"","sources":["../../../../src/storage/implementation/v3/VersionedPowerSyncMongoV3.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,2BAA2B,EAAE,MAAM,0CAA0C,CAAC;
|
|
1
|
+
{"version":3,"file":"VersionedPowerSyncMongoV3.js","sourceRoot":"","sources":["../../../../src/storage/implementation/v3/VersionedPowerSyncMongoV3.ts"],"names":[],"mappings":"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"}
|
|
@@ -21,6 +21,7 @@ export function serializeBucketData(bucket, operations, options) {
|
|
|
21
21
|
op: op.op,
|
|
22
22
|
source_table: op.source_table,
|
|
23
23
|
source_key: op.source_key,
|
|
24
|
+
subkey: op.subkey,
|
|
24
25
|
table: op.table,
|
|
25
26
|
row_id: op.row_id,
|
|
26
27
|
checksum: op.checksum,
|
|
@@ -58,6 +59,7 @@ export function* loadBucketDataDocument(context, doc) {
|
|
|
58
59
|
op: op.op,
|
|
59
60
|
source_table: op.source_table,
|
|
60
61
|
source_key: op.source_key,
|
|
62
|
+
subkey: op.subkey,
|
|
61
63
|
table: op.table,
|
|
62
64
|
row_id: op.row_id,
|
|
63
65
|
checksum: op.checksum,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bucket-format.js","sourceRoot":"","sources":["../../../../src/storage/implementation/v3/bucket-format.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"bucket-format.js","sourceRoot":"","sources":["../../../../src/storage/implementation/v3/bucket-format.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { mongo } from '@powersync/lib-service-mongodb';
|
|
2
|
+
import { InternalOpId } from '@powersync/service-core';
|
|
3
|
+
import { BucketDataDoc } from '../common/BucketDataDoc.js';
|
|
4
|
+
import { CompactionLease } from './CompactionLease.js';
|
|
5
|
+
import { BucketDataDocumentV3, BucketStateDocumentV3 } from './models.js';
|
|
6
|
+
export declare const FULL_COMPACT_RESCHEDULE_MARGIN_MS: number;
|
|
7
|
+
export interface PendingCompactionGroup {
|
|
8
|
+
/**
|
|
9
|
+
* Input documents are ordered from oldest to newest, matching `ops`.
|
|
10
|
+
* Keeping the inputs intact lets unchanged singletons retain their object.
|
|
11
|
+
*/
|
|
12
|
+
inputs: BucketDataDocumentV3[];
|
|
13
|
+
ops: BucketDataDoc[];
|
|
14
|
+
changed: boolean;
|
|
15
|
+
targetOp: InternalOpId | null;
|
|
16
|
+
}
|
|
17
|
+
export interface CompactIntervalConfig {
|
|
18
|
+
readonly minCompactChunkIntervalMs: number;
|
|
19
|
+
readonly minCompactFullIntervalMs: number;
|
|
20
|
+
readonly maxCompactFullIntervalMs: number;
|
|
21
|
+
}
|
|
22
|
+
export interface CompactTargetConfig {
|
|
23
|
+
readonly maxOpIdCap: InternalOpId | undefined;
|
|
24
|
+
}
|
|
25
|
+
export declare enum CompactionKind {
|
|
26
|
+
Full = "full",
|
|
27
|
+
Chunks = "chunks"
|
|
28
|
+
}
|
|
29
|
+
export interface CompactionDecision {
|
|
30
|
+
kind: CompactionKind | null;
|
|
31
|
+
nextCompactCheck: mongo.Document;
|
|
32
|
+
}
|
|
33
|
+
export interface ScheduledCompactionOptions {
|
|
34
|
+
/** Process checks scheduled this far after the captured job start. */
|
|
35
|
+
dueAheadMs?: number;
|
|
36
|
+
/** Used by initial replication, which must not run a full compact. */
|
|
37
|
+
forceKind?: CompactionKind;
|
|
38
|
+
}
|
|
39
|
+
export declare class CompactionContext {
|
|
40
|
+
readonly lease: CompactionLease;
|
|
41
|
+
readonly kind: CompactionKind;
|
|
42
|
+
readonly decision: CompactionDecision;
|
|
43
|
+
readonly rescheduleNotBefore: Date | undefined;
|
|
44
|
+
readonly targetOp: InternalOpId;
|
|
45
|
+
constructor(lease: CompactionLease, kind: CompactionKind, decision: CompactionDecision, rescheduleNotBefore: Date | undefined, targetOp: InternalOpId);
|
|
46
|
+
get state(): BucketStateDocumentV3;
|
|
47
|
+
get startedAt(): Date;
|
|
48
|
+
get lastOp(): bigint;
|
|
49
|
+
}
|
|
50
|
+
export interface BucketStats {
|
|
51
|
+
count: number;
|
|
52
|
+
bytes: bigint;
|
|
53
|
+
chunks: number;
|
|
54
|
+
}
|
|
55
|
+
/** Bucket stats read from bucket-data documents, including their checksum. */
|
|
56
|
+
export interface BucketStatsWithChecksum extends BucketStats {
|
|
57
|
+
checksum: number;
|
|
58
|
+
}
|
|
59
|
+
export interface CompactionResult {
|
|
60
|
+
/** Metadata cached at compacted_state.op_id. */
|
|
61
|
+
compactedState: BucketStatsWithChecksum;
|
|
62
|
+
/** Complete bucket metadata through the op head captured at claim time. */
|
|
63
|
+
bucketStats: BucketStats;
|
|
64
|
+
}
|
|
65
|
+
export declare function bucketStats(state: BucketStateDocumentV3): BucketStats;
|
|
66
|
+
export declare function emptyBucketStats(): BucketStatsWithChecksum;
|
|
67
|
+
export declare function statsForDocument(document: Pick<BucketDataDocumentV3, 'count' | 'size' | 'checksum'>): BucketStatsWithChecksum;
|
|
68
|
+
export declare function statsForDocuments(documents: Iterable<Pick<BucketDataDocumentV3, 'count' | 'size' | 'checksum'>>): BucketStatsWithChecksum;
|
|
69
|
+
/** A scheduled bucket always has writes awaiting a full compact. */
|
|
70
|
+
export declare function firstUncompactedWrite(state: BucketStateDocumentV3): Date;
|
|
71
|
+
export declare function combineChunkStats(previous: NonNullable<BucketStateDocumentV3['compacted_state']>, compactedTail: BucketStatsWithChecksum, overlappingCompactedChunk: BucketStatsWithChecksum): BucketStatsWithChecksum;
|
|
72
|
+
export declare function combineAdjacentStats(first: BucketStatsWithChecksum, second: BucketStatsWithChecksum): BucketStatsWithChecksum;
|
|
73
|
+
export declare function applyCompactionDelta(total: BucketStats, before: BucketStatsWithChecksum, after: BucketStatsWithChecksum): BucketStats;
|
|
74
|
+
/** Replace one stored range in an accumulated statistics snapshot. */
|
|
75
|
+
export declare function applyStatsReplacement(total: BucketStatsWithChecksum, before: BucketStatsWithChecksum, after: BucketStatsWithChecksum): BucketStatsWithChecksum;
|
|
76
|
+
/**
|
|
77
|
+
* This checks that the bucket state hasn't changed by a concurrent write since we checked.
|
|
78
|
+
*
|
|
79
|
+
* If it has changed, we'll re-check in the next batch.
|
|
80
|
+
*/
|
|
81
|
+
export declare function unclaimedSnapshotFilter(state: BucketStateDocumentV3): mongo.Filter<BucketStateDocumentV3>;
|
|
82
|
+
/**
|
|
83
|
+
* Calculate the earliest full compaction time from the first uncompacted
|
|
84
|
+
* write, bounded by the maximum retention interval.
|
|
85
|
+
*/
|
|
86
|
+
export declare function fullCompactionCheckAt(state: BucketStateDocumentV3, config: CompactIntervalConfig): Date;
|
|
87
|
+
export declare function chooseCompactionKind(state: BucketStateDocumentV3, now: Date, config: CompactIntervalConfig): CompactionDecision;
|
|
88
|
+
export declare function forcedCompactionKind(state: BucketStateDocumentV3, forceKind: CompactionKind | undefined, config: CompactTargetConfig): CompactionKind | null;
|
|
89
|
+
/**
|
|
90
|
+
* Read one bounded prefix from a compaction cursor.
|
|
91
|
+
*
|
|
92
|
+
* The document that would cross the byte limit is deliberately not returned:
|
|
93
|
+
* pagination resumes past the last returned `_id`, so that document remains
|
|
94
|
+
* eligible for the next query. The first document is always accepted to
|
|
95
|
+
* ensure progress when a single document exceeds the configured byte limit.
|
|
96
|
+
*
|
|
97
|
+
* `hasMore` is conservative when the document limit is reached. An extra empty
|
|
98
|
+
* query is preferable to exhausting the cursor just to determine whether the
|
|
99
|
+
* limited MongoDB query contained another document.
|
|
100
|
+
*/
|
|
101
|
+
export declare function readCompactionBatch(cursor: mongo.AggregationCursor<BucketDataDocumentV3>, options: {
|
|
102
|
+
byteLimit: number;
|
|
103
|
+
documentLimit: number;
|
|
104
|
+
}): Promise<{
|
|
105
|
+
documents: BucketDataDocumentV3[];
|
|
106
|
+
hasMore: boolean;
|
|
107
|
+
}>;
|
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
import { ReplicationAssertionError } from '@powersync/lib-services-framework';
|
|
2
|
+
import { addChecksums } from '@powersync/service-core';
|
|
3
|
+
import { AVAILABLE_LEASE_EXPR } from './CompactionLease.js';
|
|
4
|
+
/**
|
|
5
|
+
* Perform chunk compaction if at least this many chunks have been added since
|
|
6
|
+
* the latest compaction.
|
|
7
|
+
*
|
|
8
|
+
* A lower value increases compaction frequency and can increase chunk rewrites
|
|
9
|
+
* and object-storage operations. A higher value leaves more small chunks for
|
|
10
|
+
* longer, which can hurt sync performance.
|
|
11
|
+
*/
|
|
12
|
+
const MERGE_CHUNKS_THRESHOLD = 8;
|
|
13
|
+
export const FULL_COMPACT_RESCHEDULE_MARGIN_MS = 60 * 1000;
|
|
14
|
+
export var CompactionKind;
|
|
15
|
+
(function (CompactionKind) {
|
|
16
|
+
CompactionKind["Full"] = "full";
|
|
17
|
+
CompactionKind["Chunks"] = "chunks";
|
|
18
|
+
})(CompactionKind || (CompactionKind = {}));
|
|
19
|
+
export class CompactionContext {
|
|
20
|
+
lease;
|
|
21
|
+
kind;
|
|
22
|
+
decision;
|
|
23
|
+
rescheduleNotBefore;
|
|
24
|
+
targetOp;
|
|
25
|
+
constructor(lease, kind, decision, rescheduleNotBefore, targetOp) {
|
|
26
|
+
this.lease = lease;
|
|
27
|
+
this.kind = kind;
|
|
28
|
+
this.decision = decision;
|
|
29
|
+
this.rescheduleNotBefore = rescheduleNotBefore;
|
|
30
|
+
this.targetOp = targetOp;
|
|
31
|
+
}
|
|
32
|
+
get state() {
|
|
33
|
+
return this.lease.state;
|
|
34
|
+
}
|
|
35
|
+
get startedAt() {
|
|
36
|
+
return this.lease.startedAt;
|
|
37
|
+
}
|
|
38
|
+
get lastOp() {
|
|
39
|
+
return this.lease.lastOp;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
export function bucketStats(state) {
|
|
43
|
+
return {
|
|
44
|
+
count: state.bucket_stats.count,
|
|
45
|
+
bytes: state.bucket_stats.bytes,
|
|
46
|
+
chunks: state.bucket_stats.chunks
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
export function emptyBucketStats() {
|
|
50
|
+
return { count: 0, bytes: 0n, chunks: 0, checksum: 0 };
|
|
51
|
+
}
|
|
52
|
+
export function statsForDocument(document) {
|
|
53
|
+
return {
|
|
54
|
+
count: document.count,
|
|
55
|
+
bytes: BigInt(document.size),
|
|
56
|
+
chunks: 1,
|
|
57
|
+
checksum: addChecksums(0, Number(document.checksum))
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
export function statsForDocuments(documents) {
|
|
61
|
+
let result = emptyBucketStats();
|
|
62
|
+
for (const document of documents) {
|
|
63
|
+
result = combineAdjacentStats(result, statsForDocument(document));
|
|
64
|
+
}
|
|
65
|
+
return result;
|
|
66
|
+
}
|
|
67
|
+
/** A scheduled bucket always has writes awaiting a full compact. */
|
|
68
|
+
export function firstUncompactedWrite(state) {
|
|
69
|
+
if (state.first_uncompacted_write == null) {
|
|
70
|
+
throw new ReplicationAssertionError(`Scheduled V3 bucket ${state._id.b} has no first uncompacted write`);
|
|
71
|
+
}
|
|
72
|
+
return state.first_uncompacted_write;
|
|
73
|
+
}
|
|
74
|
+
export function combineChunkStats(previous, compactedTail, overlappingCompactedChunk) {
|
|
75
|
+
return {
|
|
76
|
+
count: previous.count - overlappingCompactedChunk.count + compactedTail.count,
|
|
77
|
+
bytes: previous.bytes - overlappingCompactedChunk.bytes + compactedTail.bytes,
|
|
78
|
+
chunks: previous.chunks - 1 + compactedTail.chunks,
|
|
79
|
+
checksum: addChecksums(addChecksums(Number(previous.checksum), -overlappingCompactedChunk.checksum), compactedTail.checksum)
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
export function combineAdjacentStats(first, second) {
|
|
83
|
+
return {
|
|
84
|
+
count: first.count + second.count,
|
|
85
|
+
bytes: first.bytes + second.bytes,
|
|
86
|
+
chunks: first.chunks + second.chunks,
|
|
87
|
+
checksum: addChecksums(first.checksum, second.checksum)
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
export function applyCompactionDelta(total, before, after) {
|
|
91
|
+
return {
|
|
92
|
+
count: total.count - before.count + after.count,
|
|
93
|
+
bytes: total.bytes - before.bytes + after.bytes,
|
|
94
|
+
chunks: total.chunks - before.chunks + after.chunks
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
/** Replace one stored range in an accumulated statistics snapshot. */
|
|
98
|
+
export function applyStatsReplacement(total, before, after) {
|
|
99
|
+
return {
|
|
100
|
+
...applyCompactionDelta(total, before, after),
|
|
101
|
+
checksum: addChecksums(addChecksums(total.checksum, -before.checksum), after.checksum)
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* This checks that the bucket state hasn't changed by a concurrent write since we checked.
|
|
106
|
+
*
|
|
107
|
+
* If it has changed, we'll re-check in the next batch.
|
|
108
|
+
*/
|
|
109
|
+
export function unclaimedSnapshotFilter(state) {
|
|
110
|
+
return {
|
|
111
|
+
_id: state._id,
|
|
112
|
+
last_op: state.last_op,
|
|
113
|
+
next_compact_check: state.next_compact_check,
|
|
114
|
+
first_uncompacted_write: state.first_uncompacted_write ?? { $exists: false },
|
|
115
|
+
bucket_stats: state.bucket_stats,
|
|
116
|
+
compacted_state: state.compacted_state ?? { $exists: false },
|
|
117
|
+
last_full_compact: state.last_full_compact ?? { $exists: false },
|
|
118
|
+
...AVAILABLE_LEASE_EXPR
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Calculate the earliest full compaction time from the first uncompacted
|
|
123
|
+
* write, bounded by the maximum retention interval.
|
|
124
|
+
*/
|
|
125
|
+
export function fullCompactionCheckAt(state, config) {
|
|
126
|
+
const firstWrite = firstUncompactedWrite(state);
|
|
127
|
+
const stats = bucketStats(state);
|
|
128
|
+
const lastFull = state.last_full_compact;
|
|
129
|
+
// The number of operations since the last full compact.
|
|
130
|
+
// We may make this more specific in the future, to track new updates and deletes only, ignoring
|
|
131
|
+
// full new inserts, but that requires more granular tracking when replicating.
|
|
132
|
+
const uncompactedCount = lastFull == null ? stats.count : Math.max(0, stats.count - lastFull.count);
|
|
133
|
+
const compactedRows = lastFull?.puts ?? 0;
|
|
134
|
+
// If no full compact has ever been performed: ratio = 1, compact after minCompactFullIntervalMs.
|
|
135
|
+
// If every row has been updated or deleted exactly once since the last full compact: ratio = 0.5, compact after minCompactFullIntervalMs * 2.
|
|
136
|
+
// If 10% of rows has been updated since the last full compact, compact after minCompactFullIntervalMs * 11.
|
|
137
|
+
// If every row has been updated multiple times, the ratio tends closer to 1 again.
|
|
138
|
+
const ratio = uncompactedCount == 0 ? 0 : uncompactedCount / (compactedRows + uncompactedCount);
|
|
139
|
+
const fullIntervalMs = ratio == 0 ? config.maxCompactFullIntervalMs : config.minCompactFullIntervalMs / ratio;
|
|
140
|
+
return new Date(firstWrite.getTime() + Math.min(fullIntervalMs, config.maxCompactFullIntervalMs));
|
|
141
|
+
}
|
|
142
|
+
export function chooseCompactionKind(state, now, config) {
|
|
143
|
+
// For chunk compaction, we consider the number of chunks added.
|
|
144
|
+
// Right now, we trigger a compact if the interval has passed and at least a threshold of chunks were added.
|
|
145
|
+
// A future policy could also use bytes per chunk or records per chunk to
|
|
146
|
+
// decide when to compact.
|
|
147
|
+
const fullCheckAt = fullCompactionCheckAt(state, config);
|
|
148
|
+
// Schedule a little late so a worker using a slightly earlier clock does
|
|
149
|
+
// not wake before the exact full-compaction condition is true.
|
|
150
|
+
const fullCheckWithMargin = new Date(fullCheckAt.getTime() + FULL_COMPACT_RESCHEDULE_MARGIN_MS);
|
|
151
|
+
const compacted = state.compacted_state;
|
|
152
|
+
const chunksSinceCompact = Math.max(0, state.bucket_stats.chunks - (compacted?.chunks ?? 0));
|
|
153
|
+
const shouldCompactChunks = chunksSinceCompact >= MERGE_CHUNKS_THRESHOLD;
|
|
154
|
+
const canCheckChunks = compacted == null || now.getTime() - compacted.at.getTime() >= config.minCompactChunkIntervalMs;
|
|
155
|
+
// Too few new chunks cannot make chunk compaction eligible. Do not poll this
|
|
156
|
+
// bucket at the chunk-compaction interval; only wake it for its full-compact check.
|
|
157
|
+
const nextCompactCheck = !shouldCompactChunks
|
|
158
|
+
? fullCheckWithMargin
|
|
159
|
+
: {
|
|
160
|
+
$min: [
|
|
161
|
+
fullCheckWithMargin,
|
|
162
|
+
{ $dateAdd: { startDate: '$$NOW', unit: 'millisecond', amount: config.minCompactChunkIntervalMs } }
|
|
163
|
+
]
|
|
164
|
+
};
|
|
165
|
+
let kind = null;
|
|
166
|
+
if (now >= fullCheckAt) {
|
|
167
|
+
kind = CompactionKind.Full;
|
|
168
|
+
}
|
|
169
|
+
else if (canCheckChunks && shouldCompactChunks) {
|
|
170
|
+
kind = CompactionKind.Chunks;
|
|
171
|
+
}
|
|
172
|
+
return {
|
|
173
|
+
kind,
|
|
174
|
+
nextCompactCheck
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
export function forcedCompactionKind(state, forceKind, config) {
|
|
178
|
+
if (forceKind == null) {
|
|
179
|
+
return null;
|
|
180
|
+
}
|
|
181
|
+
const maxOpId = config.maxOpIdCap == null || state.last_op < config.maxOpIdCap ? state.last_op : config.maxOpIdCap;
|
|
182
|
+
return state.compacted_state == null || state.compacted_state.op_id < maxOpId ? forceKind : null;
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Read one bounded prefix from a compaction cursor.
|
|
186
|
+
*
|
|
187
|
+
* The document that would cross the byte limit is deliberately not returned:
|
|
188
|
+
* pagination resumes past the last returned `_id`, so that document remains
|
|
189
|
+
* eligible for the next query. The first document is always accepted to
|
|
190
|
+
* ensure progress when a single document exceeds the configured byte limit.
|
|
191
|
+
*
|
|
192
|
+
* `hasMore` is conservative when the document limit is reached. An extra empty
|
|
193
|
+
* query is preferable to exhausting the cursor just to determine whether the
|
|
194
|
+
* limited MongoDB query contained another document.
|
|
195
|
+
*/
|
|
196
|
+
export async function readCompactionBatch(cursor, options) {
|
|
197
|
+
const documents = [];
|
|
198
|
+
let cumulativeBytes = 0;
|
|
199
|
+
try {
|
|
200
|
+
for await (const document of cursor) {
|
|
201
|
+
if (documents.length > 0 && cumulativeBytes + document.size > options.byteLimit) {
|
|
202
|
+
return { documents, hasMore: true };
|
|
203
|
+
}
|
|
204
|
+
documents.push(document);
|
|
205
|
+
cumulativeBytes += document.size;
|
|
206
|
+
if (documents.length >= options.documentLimit) {
|
|
207
|
+
return { documents, hasMore: true };
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
return { documents, hasMore: false };
|
|
211
|
+
}
|
|
212
|
+
finally {
|
|
213
|
+
await cursor.close();
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
//# sourceMappingURL=compact-utils.js.map
|