@powersync/service-module-mongodb-storage 0.20.0 → 0.22.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 +62 -0
- package/dist/storage/MongoBucketStorage.d.ts +36 -3
- package/dist/storage/MongoBucketStorage.js +372 -207
- package/dist/storage/MongoBucketStorage.js.map +1 -1
- package/dist/storage/implementation/MongoBucketBatch.d.ts +17 -5
- package/dist/storage/implementation/MongoBucketBatch.js +44 -17
- 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 +7 -3
- 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/MongoWriteBatch.d.ts +49 -0
- package/dist/storage/implementation/MongoWriteBatch.js +149 -0
- package/dist/storage/implementation/MongoWriteBatch.js.map +1 -0
- package/dist/storage/implementation/MongoWriteCheckpointAPI.d.ts +9 -7
- package/dist/storage/implementation/MongoWriteCheckpointAPI.js +9 -30
- 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 +32 -4
- package/dist/storage/implementation/common/PersistedBatch.js +49 -6
- package/dist/storage/implementation/common/PersistedBatch.js.map +1 -1
- package/dist/storage/implementation/common/VersionedPowerSyncMongoBase.d.ts +3 -0
- package/dist/storage/implementation/common/VersionedPowerSyncMongoBase.js +3 -0
- package/dist/storage/implementation/common/VersionedPowerSyncMongoBase.js.map +1 -1
- package/dist/storage/implementation/db.d.ts +9 -1
- package/dist/storage/implementation/db.js +27 -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 +33 -4
- package/dist/storage/implementation/v1/MongoBucketBatchV1.js.map +1 -1
- package/dist/storage/implementation/v1/MongoCompactorV1.d.ts +38 -6
- package/dist/storage/implementation/v1/MongoCompactorV1.js +247 -20
- 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/PersistedBatchV1.d.ts +7 -5
- package/dist/storage/implementation/v1/PersistedBatchV1.js +22 -28
- package/dist/storage/implementation/v1/PersistedBatchV1.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 +10 -2
- package/dist/storage/implementation/v3/MongoBucketBatchV3.js +100 -26
- package/dist/storage/implementation/v3/MongoBucketBatchV3.js.map +1 -1
- package/dist/storage/implementation/v3/MongoCompactorV3.d.ts +82 -25
- package/dist/storage/implementation/v3/MongoCompactorV3.js +698 -159
- 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 +14 -8
- package/dist/storage/implementation/v3/PersistedBatchV3.js +76 -42
- 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 +16 -5
- 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 +6 -8
- package/dist/storage/implementation/v3/object-storage/ObjectStorageLifecycle.js +17 -11
- package/dist/storage/implementation/v3/object-storage/ObjectStorageLifecycle.js.map +1 -1
- package/dist/storage/implementation/v3/object-storage/ObjectStorageUsage.d.ts +38 -0
- package/dist/storage/implementation/v3/object-storage/ObjectStorageUsage.js +164 -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 +197 -25
- 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 +28 -1
- package/dist/types/types.js +28 -7
- package/dist/types/types.js.map +1 -1
- package/dist/utils/test-utils.js +1 -0
- package/dist/utils/test-utils.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 +507 -269
- package/src/storage/implementation/MongoBucketBatch.ts +67 -24
- 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 +15 -3
- package/src/storage/implementation/MongoSyncBucketStorage.ts +114 -40
- package/src/storage/implementation/MongoSyncRulesLock.ts +22 -9
- package/src/storage/implementation/MongoWriteBatch.ts +172 -0
- package/src/storage/implementation/MongoWriteCheckpointAPI.ts +16 -46
- package/src/storage/implementation/SyncRuleStateUpdate.ts +13 -6
- package/src/storage/implementation/common/MongoSyncBucketStorageCheckpoint.ts +24 -2
- package/src/storage/implementation/common/PersistedBatch.ts +66 -10
- package/src/storage/implementation/common/VersionedPowerSyncMongoBase.ts +4 -0
- package/src/storage/implementation/db.ts +35 -2
- package/src/storage/implementation/models.ts +34 -0
- package/src/storage/implementation/v1/MongoBucketBatchV1.ts +46 -6
- package/src/storage/implementation/v1/MongoCompactorV1.ts +327 -40
- package/src/storage/implementation/v1/MongoParameterCompactorV1.ts +25 -9
- package/src/storage/implementation/v1/MongoSyncBucketStorageV1.ts +87 -27
- package/src/storage/implementation/v1/PersistedBatchV1.ts +25 -30
- 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 +138 -34
- package/src/storage/implementation/v3/MongoCompactorV3.ts +958 -225
- 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 +93 -48
- 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 +24 -9
- package/src/storage/implementation/v3/object-storage/ObjectStorage.ts +20 -5
- package/src/storage/implementation/v3/object-storage/ObjectStorageLifecycle.ts +26 -14
- package/src/storage/implementation/v3/object-storage/ObjectStorageUsage.ts +229 -0
- package/src/storage/implementation/v3/object-storage/S3ObjectStorage.ts +279 -29
- package/src/storage/implementation/v3/source-table-utils.ts +39 -41
- package/src/storage/storage-index.ts +2 -0
- package/src/types/types.ts +42 -7
- package/src/utils/test-utils.ts +1 -0
- 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/chunk_compaction_config.test.ts +38 -0
- 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 +267 -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 +968 -246
- 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 +290 -2
- 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
|
@@ -1,15 +1,11 @@
|
|
|
1
1
|
import * as timers from 'node:timers/promises';
|
|
2
|
-
import { isMongoServerError
|
|
3
|
-
import { logger as defaultLogger, ReplicationAssertionError
|
|
4
|
-
import { isPartialChecksum } from '@powersync/service-core';
|
|
2
|
+
import { isMongoServerError } from '@powersync/lib-service-mongodb';
|
|
3
|
+
import { logger as defaultLogger, ReplicationAssertionError } from '@powersync/lib-services-framework';
|
|
5
4
|
import { isRetryableObjectStorageError } from './v3/object-storage/ObjectStorage.js';
|
|
6
5
|
const DEFAULT_CLEAR_BATCH_LIMIT = 5000;
|
|
7
6
|
const DEFAULT_MOVE_BATCH_LIMIT = 2000;
|
|
8
7
|
const DEFAULT_MOVE_BATCH_QUERY_LIMIT = 10_000;
|
|
9
8
|
const DEFAULT_MOVE_BATCH_BYTE_LIMIT = 16 * 1024 * 1024;
|
|
10
|
-
const DEFAULT_MIN_BUCKET_CHANGES = 10;
|
|
11
|
-
const DEFAULT_MIN_CHANGE_RATIO = 0.1;
|
|
12
|
-
const DIRTY_BUCKET_SCAN_BATCH_SIZE = 2_000;
|
|
13
9
|
/** This default is primarily for tests. */
|
|
14
10
|
const DEFAULT_MEMORY_LIMIT_MB = 64;
|
|
15
11
|
const COMPACTION_RETRY_LIMIT = 3;
|
|
@@ -20,22 +16,31 @@ export class ConcurrentCompactionError extends Error {
|
|
|
20
16
|
this.name = 'ConcurrentCompactionError';
|
|
21
17
|
}
|
|
22
18
|
}
|
|
19
|
+
/**
|
|
20
|
+
* A worker whose bucket lease has been replaced must stop immediately. Unlike
|
|
21
|
+
* a transactional replacement conflict, retrying it with the same compactor
|
|
22
|
+
* instance would still use the stale lease and could race the new owner.
|
|
23
|
+
*/
|
|
24
|
+
export class CompactionLeaseLostError extends ConcurrentCompactionError {
|
|
25
|
+
constructor(message) {
|
|
26
|
+
super(message);
|
|
27
|
+
this.name = 'CompactionLeaseLostError';
|
|
28
|
+
}
|
|
29
|
+
}
|
|
23
30
|
export class MongoCompactor {
|
|
24
31
|
storage;
|
|
25
32
|
db;
|
|
26
|
-
bucketStateUpdates = [];
|
|
27
33
|
idLimitBytes;
|
|
28
34
|
moveBatchLimit;
|
|
29
35
|
moveBatchQueryLimit;
|
|
30
36
|
moveBatchByteLimit;
|
|
31
37
|
clearBatchLimit;
|
|
32
|
-
minBucketChanges;
|
|
33
|
-
minChangeRatio;
|
|
34
|
-
maxOpId;
|
|
35
38
|
buckets;
|
|
36
39
|
deleteCheckpointRequestsBefore;
|
|
37
40
|
signal;
|
|
38
41
|
group_id;
|
|
42
|
+
compactChunksOnly;
|
|
43
|
+
compactedBucketCount = 0;
|
|
39
44
|
logger;
|
|
40
45
|
constructor(storage, db, options) {
|
|
41
46
|
this.storage = storage;
|
|
@@ -49,32 +54,12 @@ export class MongoCompactor {
|
|
|
49
54
|
if (this.clearBatchLimit < 2) {
|
|
50
55
|
throw new ReplicationAssertionError('clearBatchLimit must be >= 2');
|
|
51
56
|
}
|
|
52
|
-
this.minBucketChanges = options.minBucketChanges ?? DEFAULT_MIN_BUCKET_CHANGES;
|
|
53
|
-
this.minChangeRatio = options.minChangeRatio ?? DEFAULT_MIN_CHANGE_RATIO;
|
|
54
|
-
this.maxOpId = options.maxOpId ?? 0n;
|
|
55
57
|
this.buckets = options.compactBuckets;
|
|
56
58
|
this.deleteCheckpointRequestsBefore = options.deleteCheckpointRequestsBefore;
|
|
57
59
|
this.signal = options.signal;
|
|
60
|
+
this.compactChunksOnly = options.compactChunksOnly ?? false;
|
|
58
61
|
this.logger = options.logger ?? defaultLogger;
|
|
59
62
|
}
|
|
60
|
-
/**
|
|
61
|
-
* Compact buckets by converting operations into MOVE and/or CLEAR operations.
|
|
62
|
-
*
|
|
63
|
-
* See /docs/storage/compacting-operations.md for details.
|
|
64
|
-
*/
|
|
65
|
-
async compact() {
|
|
66
|
-
await this.deleteOldCheckpointRequests();
|
|
67
|
-
if (this.buckets) {
|
|
68
|
-
for (const bucket of this.buckets) {
|
|
69
|
-
// We can make this more efficient later on by iterating through the buckets in a single query.
|
|
70
|
-
// That makes batching more tricky, so we leave for later.
|
|
71
|
-
await this.compactSingleBucketRetried(bucket);
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
else {
|
|
75
|
-
await this.compactDirtyBuckets();
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
63
|
async deleteOldCheckpointRequests() {
|
|
79
64
|
if (this.deleteCheckpointRequestsBefore == null) {
|
|
80
65
|
return;
|
|
@@ -88,141 +73,16 @@ export class MongoCompactor {
|
|
|
88
73
|
checkpoint_requested_at: { $exists: true, $lt: this.deleteCheckpointRequestsBefore },
|
|
89
74
|
processed_at_lsn: { $ne: null }
|
|
90
75
|
});
|
|
76
|
+
await this.deleteOldCustomCheckpointRequests();
|
|
77
|
+
}
|
|
78
|
+
async deleteOldCustomCheckpointRequests() {
|
|
79
|
+
if (this.deleteCheckpointRequestsBefore == null) {
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
91
82
|
await this.db.custom_write_checkpoints.deleteMany({
|
|
92
83
|
checkpoint_requested_at: { $exists: true, $lt: this.deleteCheckpointRequestsBefore }
|
|
93
84
|
});
|
|
94
85
|
}
|
|
95
|
-
/**
|
|
96
|
-
* Subset of compact, only populating checksums where relevant.
|
|
97
|
-
*/
|
|
98
|
-
async populateChecksums(options) {
|
|
99
|
-
let count = 0;
|
|
100
|
-
// Paginate through dirty buckets in batches until no more buckets meet the criteria.
|
|
101
|
-
while (true) {
|
|
102
|
-
this.signal?.throwIfAborted();
|
|
103
|
-
const buckets = await this.dirtyBucketBatchForChecksums(options);
|
|
104
|
-
if (buckets.length == 0) {
|
|
105
|
-
break;
|
|
106
|
-
}
|
|
107
|
-
this.signal?.throwIfAborted();
|
|
108
|
-
const start = Date.now();
|
|
109
|
-
// Filter batch by estimated bucket size, to reduce possibility of timeouts.
|
|
110
|
-
const checkBuckets = [];
|
|
111
|
-
let totalCountEstimate = 0;
|
|
112
|
-
for (const bucket of buckets) {
|
|
113
|
-
checkBuckets.push(bucket);
|
|
114
|
-
totalCountEstimate += bucket.estimatedCount;
|
|
115
|
-
if (totalCountEstimate > 50_000) {
|
|
116
|
-
break;
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
this.logger.info(`Calculating checksums for batch of ${buckets.length} buckets, estimated count of ${totalCountEstimate}`);
|
|
120
|
-
await this.updateChecksumsBatch(checkBuckets);
|
|
121
|
-
this.logger.info(`Updated checksums for batch of ${checkBuckets.length} buckets in ${Date.now() - start}ms`);
|
|
122
|
-
count += checkBuckets.length;
|
|
123
|
-
}
|
|
124
|
-
return { buckets: count };
|
|
125
|
-
}
|
|
126
|
-
async *dirtyBucketBatchesForCollection(collection, lastId, maxId, options, getDefinitionId) {
|
|
127
|
-
// Paginate through the bucket state collection using cursor-based scanning.
|
|
128
|
-
while (true) {
|
|
129
|
-
// To avoid timeouts from too many buckets not meeting the minBucketChanges criteria, use an aggregation pipeline
|
|
130
|
-
// to scan a fixed batch of buckets at a time, but only return buckets that meet the criteria.
|
|
131
|
-
const [result] = await collection
|
|
132
|
-
.aggregate([
|
|
133
|
-
{
|
|
134
|
-
$match: {
|
|
135
|
-
_id: { $gt: lastId, $lt: maxId }
|
|
136
|
-
}
|
|
137
|
-
},
|
|
138
|
-
{
|
|
139
|
-
$sort: { _id: 1 }
|
|
140
|
-
},
|
|
141
|
-
{
|
|
142
|
-
// Scan a fixed number of docs each query so sparse matches don't block progress.
|
|
143
|
-
$limit: DIRTY_BUCKET_SCAN_BATCH_SIZE
|
|
144
|
-
},
|
|
145
|
-
{
|
|
146
|
-
$facet: {
|
|
147
|
-
buckets: [
|
|
148
|
-
{
|
|
149
|
-
$match: {
|
|
150
|
-
'estimate_since_compact.count': { $gte: options.minBucketChanges }
|
|
151
|
-
}
|
|
152
|
-
},
|
|
153
|
-
{
|
|
154
|
-
$project: {
|
|
155
|
-
_id: 1,
|
|
156
|
-
estimate_since_compact: 1,
|
|
157
|
-
compacted_state: 1
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
],
|
|
161
|
-
// This is used for the next query.
|
|
162
|
-
cursor: [{ $sort: { _id: -1 } }, { $limit: 1 }, { $project: { _id: 1 } }]
|
|
163
|
-
}
|
|
164
|
-
}
|
|
165
|
-
], { maxTimeMS: MONGO_OPERATION_TIMEOUT_MS })
|
|
166
|
-
.toArray();
|
|
167
|
-
const cursor = result?.cursor?.[0];
|
|
168
|
-
if (cursor == null) {
|
|
169
|
-
break;
|
|
170
|
-
}
|
|
171
|
-
lastId = cursor._id;
|
|
172
|
-
const mapped = (result?.buckets ?? []).map((bucketState) => {
|
|
173
|
-
// The numbers, specifically the bytes, could be a bigint. Convert to Number to allow calculating ratios.
|
|
174
|
-
// BigInt precision is not needed here since this is only an estimate.
|
|
175
|
-
const updatedCount = bucketState.estimate_since_compact?.count ?? 0;
|
|
176
|
-
const totalCount = (bucketState.compacted_state?.count ?? 0) + updatedCount;
|
|
177
|
-
const updatedBytes = Number(bucketState.estimate_since_compact?.bytes ?? 0);
|
|
178
|
-
const totalBytes = Number(bucketState.compacted_state?.bytes ?? 0) + updatedBytes;
|
|
179
|
-
const dirtyChangeNumber = totalCount > 0 ? updatedCount / totalCount : 0;
|
|
180
|
-
const dirtyChangeBytes = totalBytes > 0 ? updatedBytes / totalBytes : 0;
|
|
181
|
-
return {
|
|
182
|
-
bucket: bucketState._id.b,
|
|
183
|
-
definitionId: getDefinitionId(bucketState),
|
|
184
|
-
estimatedCount: totalCount,
|
|
185
|
-
dirtyRatio: Math.max(dirtyChangeNumber, dirtyChangeBytes)
|
|
186
|
-
};
|
|
187
|
-
});
|
|
188
|
-
yield mapped.filter((bucket) => bucket.estimatedCount >= options.minBucketChanges && bucket.dirtyRatio >= options.minChangeRatio);
|
|
189
|
-
}
|
|
190
|
-
}
|
|
191
|
-
async dirtyBucketBatchForChecksumsForCollection(collection, filter, getDefinitionId) {
|
|
192
|
-
const dirtyBuckets = await collection
|
|
193
|
-
.find(filter, {
|
|
194
|
-
projection: {
|
|
195
|
-
_id: 1,
|
|
196
|
-
estimate_since_compact: 1,
|
|
197
|
-
compacted_state: 1
|
|
198
|
-
},
|
|
199
|
-
sort: {
|
|
200
|
-
'estimate_since_compact.count': -1
|
|
201
|
-
},
|
|
202
|
-
limit: 200,
|
|
203
|
-
maxTimeMS: MONGO_OPERATION_TIMEOUT_MS
|
|
204
|
-
})
|
|
205
|
-
.toArray();
|
|
206
|
-
return dirtyBuckets.map((bucket) => ({
|
|
207
|
-
bucket: bucket._id.b,
|
|
208
|
-
definitionId: getDefinitionId(bucket),
|
|
209
|
-
estimatedCount: Number(bucket.estimate_since_compact.count) + Number(bucket.compacted_state?.count ?? 0)
|
|
210
|
-
}));
|
|
211
|
-
}
|
|
212
|
-
async compactDirtyBuckets() {
|
|
213
|
-
for await (const buckets of this.dirtyBucketBatches({
|
|
214
|
-
minBucketChanges: this.minBucketChanges,
|
|
215
|
-
minChangeRatio: this.minChangeRatio
|
|
216
|
-
})) {
|
|
217
|
-
this.signal?.throwIfAborted();
|
|
218
|
-
if (buckets.length == 0) {
|
|
219
|
-
continue;
|
|
220
|
-
}
|
|
221
|
-
for (const { bucket, definitionId } of buckets) {
|
|
222
|
-
await this.compactSingleBucketRetried(bucket, definitionId);
|
|
223
|
-
}
|
|
224
|
-
}
|
|
225
|
-
}
|
|
226
86
|
/**
|
|
227
87
|
* Compaction for a single bucket, with retries on failure.
|
|
228
88
|
*
|
|
@@ -231,14 +91,12 @@ export class MongoCompactor {
|
|
|
231
91
|
* storage paths are also prepared with lifecycle markers, so a retry can
|
|
232
92
|
* safely overwrite or eventually clean up uploads from the failed attempt.
|
|
233
93
|
*/
|
|
234
|
-
async
|
|
94
|
+
async retryCompaction(bucket, compact) {
|
|
235
95
|
let retryCount = 0;
|
|
236
96
|
while (true) {
|
|
237
97
|
this.signal?.throwIfAborted();
|
|
238
|
-
// Do not carry queued bucket state writes from a failed attempt into the rescan.
|
|
239
|
-
this.bucketStateUpdates = [];
|
|
240
98
|
try {
|
|
241
|
-
await
|
|
99
|
+
await compact();
|
|
242
100
|
return;
|
|
243
101
|
}
|
|
244
102
|
catch (e) {
|
|
@@ -260,80 +118,11 @@ export class MongoCompactor {
|
|
|
260
118
|
}
|
|
261
119
|
}
|
|
262
120
|
}
|
|
263
|
-
collectBucketStateUpdates(state, compactedOpId) {
|
|
264
|
-
if (state.opCount < 0) {
|
|
265
|
-
throw new ServiceAssertionError(`Invalid opCount: ${state.opCount} checksum ${state.checksum} opsSincePut: ${state.opsSincePut} maxOpId: ${this.maxOpId}`);
|
|
266
|
-
}
|
|
267
|
-
return {
|
|
268
|
-
updateOne: {
|
|
269
|
-
filter: this.bucketStateFilter(state.bucket, state.definitionId),
|
|
270
|
-
update: {
|
|
271
|
-
$set: {
|
|
272
|
-
compacted_state: {
|
|
273
|
-
op_id: compactedOpId,
|
|
274
|
-
count: state.opCount,
|
|
275
|
-
checksum: BigInt(state.checksum),
|
|
276
|
-
bytes: state.opBytes
|
|
277
|
-
},
|
|
278
|
-
estimate_since_compact: {
|
|
279
|
-
// There could have been a whole bunch of new operations added to the bucket while compacting,
|
|
280
|
-
// which we don't currently cater for. We could potentially query for that, but that adds overhead.
|
|
281
|
-
count: 0,
|
|
282
|
-
bytes: 0
|
|
283
|
-
}
|
|
284
|
-
}
|
|
285
|
-
},
|
|
286
|
-
// We generally expect this to have been created before.
|
|
287
|
-
// We don't create new ones here, to avoid issues with the unique index on bucket_updates.
|
|
288
|
-
upsert: false
|
|
289
|
-
}
|
|
290
|
-
};
|
|
291
|
-
}
|
|
292
|
-
updateBucketChecksums(state, compactedOpId) {
|
|
293
|
-
this.bucketStateUpdates.push(this.collectBucketStateUpdates(state, compactedOpId));
|
|
294
|
-
}
|
|
295
|
-
async flushBucketStateUpdates() {
|
|
296
|
-
if (this.bucketStateUpdates.length > 0) {
|
|
297
|
-
this.logger.info(`Updating ${this.bucketStateUpdates.length} bucket states`);
|
|
298
|
-
await this.writeBucketStateUpdates();
|
|
299
|
-
this.bucketStateUpdates = [];
|
|
300
|
-
}
|
|
301
|
-
}
|
|
302
|
-
async updateChecksumsBatch(buckets) {
|
|
303
|
-
const checksums = await this.computeChecksumsForBuckets(buckets);
|
|
304
|
-
const definitionIdByBucket = new Map(buckets.map((bucket) => [bucket.bucket, bucket.definitionId]));
|
|
305
|
-
for (const bucketChecksum of checksums.values()) {
|
|
306
|
-
if (isPartialChecksum(bucketChecksum)) {
|
|
307
|
-
// Should never happen since we don't specify `start`.
|
|
308
|
-
throw new ServiceAssertionError(`Full checksum expected, got ${JSON.stringify(bucketChecksum)}`);
|
|
309
|
-
}
|
|
310
|
-
this.bucketStateUpdates.push({
|
|
311
|
-
updateOne: {
|
|
312
|
-
filter: this.bucketStateFilter(bucketChecksum.bucket, definitionIdByBucket.get(bucketChecksum.bucket) ?? null),
|
|
313
|
-
update: {
|
|
314
|
-
$set: {
|
|
315
|
-
compacted_state: {
|
|
316
|
-
op_id: this.maxOpId,
|
|
317
|
-
count: bucketChecksum.count,
|
|
318
|
-
checksum: BigInt(bucketChecksum.checksum),
|
|
319
|
-
bytes: null
|
|
320
|
-
},
|
|
321
|
-
estimate_since_compact: {
|
|
322
|
-
count: 0,
|
|
323
|
-
bytes: 0
|
|
324
|
-
}
|
|
325
|
-
}
|
|
326
|
-
},
|
|
327
|
-
// We don't create new ones here - it gets tricky to get the last_op right with the unique index on
|
|
328
|
-
// bucket_updates.
|
|
329
|
-
upsert: false
|
|
330
|
-
}
|
|
331
|
-
});
|
|
332
|
-
}
|
|
333
|
-
await this.flushBucketStateUpdates();
|
|
334
|
-
}
|
|
335
121
|
}
|
|
336
122
|
function compactionRetryReason(error) {
|
|
123
|
+
if (error instanceof CompactionLeaseLostError) {
|
|
124
|
+
return null;
|
|
125
|
+
}
|
|
337
126
|
if (error instanceof ConcurrentCompactionError) {
|
|
338
127
|
return 'concurrent compaction';
|
|
339
128
|
}
|
|
@@ -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,23 +1,96 @@
|
|
|
1
1
|
import { mongo } from '@powersync/lib-service-mongodb';
|
|
2
|
-
import {
|
|
2
|
+
import { Logger } from '@powersync/lib-services-framework';
|
|
3
|
+
import { bson, CompactOptions, InternalOpId } from '@powersync/service-core';
|
|
3
4
|
import type { VersionedPowerSyncMongo } from './db.js';
|
|
5
|
+
type ParameterCompactionReadDocument = {
|
|
6
|
+
_id: InternalOpId;
|
|
7
|
+
key: mongo.Document;
|
|
8
|
+
lookup: bson.Binary;
|
|
9
|
+
bucket_parameters?: unknown[] | null;
|
|
10
|
+
};
|
|
11
|
+
export type ParameterCompactionResult = {
|
|
12
|
+
collections: number;
|
|
13
|
+
scannedEntries: number;
|
|
14
|
+
deletedEntries: number;
|
|
15
|
+
};
|
|
4
16
|
/**
|
|
5
17
|
* Compacts parameter lookup data (the bucket_parameters collection).
|
|
6
18
|
*
|
|
7
|
-
*
|
|
19
|
+
* Both storage versions persist a per-stream compaction cursor, so a run only scans entries in the
|
|
20
|
+
* un-compacted operation-id range. V1 scans its shared collection using only the `_id` index, so it
|
|
21
|
+
* additionally filters by stream in code.
|
|
22
|
+
*
|
|
23
|
+
* The cursor is a single value covering every collection of the stream, so it can only be advanced
|
|
24
|
+
* to a boundary that all collections have passed. To keep it moving during a long pass, collections
|
|
25
|
+
* are processed in lock-step rather than one after another - see {@link compactCollections}.
|
|
8
26
|
*
|
|
9
27
|
* For background, see the `/docs/storage/parameter-lookups.md` file.
|
|
10
28
|
*/
|
|
11
|
-
export declare class MongoParameterCompactor {
|
|
29
|
+
export declare abstract class MongoParameterCompactor {
|
|
30
|
+
#private;
|
|
12
31
|
protected readonly db: VersionedPowerSyncMongo;
|
|
13
|
-
protected readonly
|
|
32
|
+
protected readonly replicationStreamId: number;
|
|
14
33
|
protected readonly checkpoint: InternalOpId;
|
|
15
34
|
protected readonly options: CompactOptions;
|
|
16
|
-
protected readonly
|
|
17
|
-
|
|
35
|
+
protected readonly parameterCompactionBatchSize: number;
|
|
36
|
+
protected readonly parameterCompactionPersistIntervalMs: number;
|
|
37
|
+
protected readonly logger: Logger;
|
|
38
|
+
protected readonly signal?: AbortSignal;
|
|
39
|
+
constructor(db: VersionedPowerSyncMongo, replicationStreamId: number, checkpoint: InternalOpId, options: CompactOptions, parameterCompactionBatchSize?: number, parameterCompactionPersistIntervalMs?: number);
|
|
18
40
|
compact(): Promise<void>;
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
41
|
+
/**
|
|
42
|
+
* The exclusive operation-id boundary through which this stream's parameter indexes have all
|
|
43
|
+
* been compacted.
|
|
44
|
+
*/
|
|
45
|
+
protected readCompactedBefore(): Promise<InternalOpId>;
|
|
46
|
+
protected persistCompactedBefore(compactedBefore: InternalOpId): Promise<void>;
|
|
47
|
+
/**
|
|
48
|
+
* Commits the checkpoint-change invalidation fence before the first delete of this pass.
|
|
49
|
+
*
|
|
50
|
+
* Checkpoint change detection finds changed lookups by querying parameter entries in
|
|
51
|
+
* (lastCheckpoint, nextCheckpoint]. Compaction physically removes entries in that range, so a
|
|
52
|
+
* checkpoint that can no longer see the full history must instead invalidate all parameter
|
|
53
|
+
* buckets. The fence records the boundary below which that history may be missing.
|
|
54
|
+
*
|
|
55
|
+
* The fence must be committed before the first delete: MongoDB snapshot ordering then
|
|
56
|
+
* guarantees that a checkpoint snapshot which observes a deletion also observes the fence.
|
|
57
|
+
*
|
|
58
|
+
* This deliberately isn't the same value as the compaction cursor. If the pass fails halfway,
|
|
59
|
+
* the fence only causes conservative invalidation, while an advanced cursor would skip
|
|
60
|
+
* deletion work that never completed.
|
|
61
|
+
*/
|
|
62
|
+
private ensureInvalidationFence;
|
|
63
|
+
protected abstract getCollections(): Promise<mongo.Collection<mongo.Document>[]>;
|
|
64
|
+
protected abstract shouldCompactDocument(doc: ParameterCompactionReadDocument): boolean;
|
|
65
|
+
/** Deletes history preceding a batch for several identities sharing a lookup. */
|
|
66
|
+
protected abstract leadingHistoryDeleteFilter(lookup: bson.Binary, keys: mongo.Document[], before: InternalOpId): mongo.Document;
|
|
67
|
+
/**
|
|
68
|
+
* Processes every collection of the stream, in lock-step: each turn takes one batch from the
|
|
69
|
+
* collection that has processed the least so far.
|
|
70
|
+
*
|
|
71
|
+
* The persisted cursor is the minimum position over all collections, which is exactly the
|
|
72
|
+
* boundary that all of them have passed, so it can be advanced periodically during the pass.
|
|
73
|
+
* Always picking the collection that is furthest behind also keeps each of them within one batch
|
|
74
|
+
* of that boundary, bounding the work an interrupted pass has to repeat.
|
|
75
|
+
*
|
|
76
|
+
* V1 storage always has a single collection; V3 has a collection per defined index. So in V1 the
|
|
77
|
+
* ame process collapses to compacting the single collection in order, while V3 can alternate between
|
|
78
|
+
* collections.
|
|
79
|
+
*/
|
|
80
|
+
private compactCollections;
|
|
81
|
+
/**
|
|
82
|
+
* The boundary that every scope has processed past, capped at the target checkpoint, and the
|
|
83
|
+
* scope sitting on it.
|
|
84
|
+
*
|
|
85
|
+
* The frontier is the furthest the cursor may be advanced. The scope is the one that has
|
|
86
|
+
* processed the least, or null once all of them have reached the target checkpoint.
|
|
87
|
+
*/
|
|
88
|
+
private frontier;
|
|
89
|
+
/**
|
|
90
|
+
* Reads and processes one batch from the scope, and advances its position past that batch.
|
|
91
|
+
*/
|
|
92
|
+
private compactBatch;
|
|
93
|
+
/** Deletes documents by `_id`, chunked to bound the command size. Returns the number deleted. */
|
|
94
|
+
private deleteByIds;
|
|
23
95
|
}
|
|
96
|
+
export {};
|