@powersync/service-module-mongodb-storage 0.0.0-dev-20260602073133 → 0.0.0-dev-20260909133214
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 +177 -5
- package/dist/migrations/db/migrations/1782950400000-checkpoint-requested-at-index.d.ts +3 -0
- package/dist/migrations/db/migrations/1782950400000-checkpoint-requested-at-index.js +41 -0
- package/dist/migrations/db/migrations/1782950400000-checkpoint-requested-at-index.js.map +1 -0
- package/dist/storage/MongoBucketStorage.d.ts +71 -18
- package/dist/storage/MongoBucketStorage.js +516 -202
- package/dist/storage/MongoBucketStorage.js.map +1 -1
- package/dist/storage/implementation/MongoBucketBatch.d.ts +71 -29
- package/dist/storage/implementation/MongoBucketBatch.js +140 -66
- package/dist/storage/implementation/MongoBucketBatch.js.map +1 -1
- package/dist/storage/implementation/MongoChecksums.d.ts +41 -13
- package/dist/storage/implementation/MongoChecksums.js +36 -121
- package/dist/storage/implementation/MongoChecksums.js.map +1 -1
- package/dist/storage/implementation/MongoCompactor.d.ts +28 -90
- package/dist/storage/implementation/MongoCompactor.js +87 -481
- package/dist/storage/implementation/MongoCompactor.js.map +1 -1
- package/dist/storage/implementation/MongoHydrationState.d.ts +11 -0
- package/dist/storage/implementation/MongoHydrationState.js +49 -0
- package/dist/storage/implementation/MongoHydrationState.js.map +1 -0
- package/dist/storage/implementation/MongoParameterCompactor.d.ts +82 -8
- package/dist/storage/implementation/MongoParameterCompactor.js +312 -76
- package/dist/storage/implementation/MongoParameterCompactor.js.map +1 -1
- package/dist/storage/implementation/MongoParsedSyncConfigSet.d.ts +21 -0
- package/dist/storage/implementation/MongoParsedSyncConfigSet.js +93 -0
- package/dist/storage/implementation/MongoParsedSyncConfigSet.js.map +1 -0
- package/dist/storage/implementation/MongoPersistedReplicationStream.d.ts +36 -0
- package/dist/storage/implementation/MongoPersistedReplicationStream.js +90 -0
- package/dist/storage/implementation/MongoPersistedReplicationStream.js.map +1 -0
- package/dist/storage/implementation/MongoPersistedSyncConfigContent.d.ts +25 -0
- package/dist/storage/implementation/MongoPersistedSyncConfigContent.js +125 -0
- package/dist/storage/implementation/MongoPersistedSyncConfigContent.js.map +1 -0
- package/dist/storage/implementation/MongoStorageProvider.js +41 -4
- package/dist/storage/implementation/MongoStorageProvider.js.map +1 -1
- package/dist/storage/implementation/MongoSyncBucketStorage.d.ts +81 -37
- package/dist/storage/implementation/MongoSyncBucketStorage.js +159 -86
- package/dist/storage/implementation/MongoSyncBucketStorage.js.map +1 -1
- package/dist/storage/implementation/MongoSyncRulesLock.d.ts +1 -1
- package/dist/storage/implementation/MongoSyncRulesLock.js +23 -11
- package/dist/storage/implementation/MongoSyncRulesLock.js.map +1 -1
- package/dist/storage/implementation/MongoWriteCheckpointAPI.d.ts +11 -8
- package/dist/storage/implementation/MongoWriteCheckpointAPI.js +159 -33
- 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 +28 -0
- package/dist/storage/implementation/common/MongoSyncBucketStorageCheckpoint.js +2 -0
- package/dist/storage/implementation/common/MongoSyncBucketStorageCheckpoint.js.map +1 -0
- package/dist/storage/implementation/common/PersistedBatch.d.ts +34 -2
- package/dist/storage/implementation/common/PersistedBatch.js +63 -10
- package/dist/storage/implementation/common/PersistedBatch.js.map +1 -1
- package/dist/storage/implementation/common/VersionedPowerSyncMongoBase.js +1 -1
- package/dist/storage/implementation/common/VersionedPowerSyncMongoBase.js.map +1 -1
- package/dist/storage/implementation/createMongoSyncBucketStorage.d.ts +2 -2
- package/dist/storage/implementation/createMongoSyncBucketStorage.js +4 -4
- package/dist/storage/implementation/createMongoSyncBucketStorage.js.map +1 -1
- package/dist/storage/implementation/db.d.ts +4 -1
- package/dist/storage/implementation/db.js +31 -16
- package/dist/storage/implementation/db.js.map +1 -1
- package/dist/storage/implementation/models.d.ts +55 -13
- package/dist/storage/implementation/models.js.map +1 -1
- package/dist/storage/implementation/v1/MongoBucketBatchV1.d.ts +15 -1
- package/dist/storage/implementation/v1/MongoBucketBatchV1.js +135 -107
- package/dist/storage/implementation/v1/MongoBucketBatchV1.js.map +1 -1
- package/dist/storage/implementation/v1/MongoChecksumsV1.d.ts +4 -4
- package/dist/storage/implementation/v1/MongoChecksumsV1.js +119 -7
- package/dist/storage/implementation/v1/MongoChecksumsV1.js.map +1 -1
- package/dist/storage/implementation/v1/MongoCompactorV1.d.ts +47 -7
- package/dist/storage/implementation/v1/MongoCompactorV1.js +478 -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 +33 -27
- package/dist/storage/implementation/v1/MongoSyncBucketStorageV1.js +146 -73
- package/dist/storage/implementation/v1/MongoSyncBucketStorageV1.js.map +1 -1
- package/dist/storage/implementation/v1/SingleBucketStoreV1.d.ts +9 -10
- package/dist/storage/implementation/v1/SingleBucketStoreV1.js +2 -8
- package/dist/storage/implementation/v1/SingleBucketStoreV1.js.map +1 -1
- package/dist/storage/implementation/v1/VersionedPowerSyncMongoV1.d.ts +2 -1
- package/dist/storage/implementation/v1/VersionedPowerSyncMongoV1.js +3 -0
- package/dist/storage/implementation/v1/VersionedPowerSyncMongoV1.js.map +1 -1
- package/dist/storage/implementation/v1/models.d.ts +10 -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/BucketDataContextV3.d.ts +13 -0
- package/dist/storage/implementation/v3/BucketDataContextV3.js +23 -0
- package/dist/storage/implementation/v3/BucketDataContextV3.js.map +1 -0
- 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 +16 -5
- package/dist/storage/implementation/v3/MongoBucketBatchV3.js +393 -262
- package/dist/storage/implementation/v3/MongoBucketBatchV3.js.map +1 -1
- package/dist/storage/implementation/v3/MongoChecksumsV3.d.ts +30 -9
- package/dist/storage/implementation/v3/MongoChecksumsV3.js +161 -20
- package/dist/storage/implementation/v3/MongoChecksumsV3.js.map +1 -1
- package/dist/storage/implementation/v3/MongoCompactorV3.d.ts +108 -18
- package/dist/storage/implementation/v3/MongoCompactorV3.js +1115 -47
- package/dist/storage/implementation/v3/MongoCompactorV3.js.map +1 -1
- package/dist/storage/implementation/v3/MongoParameterCompactorV3.d.ts +12 -3
- package/dist/storage/implementation/v3/MongoParameterCompactorV3.js +13 -8
- package/dist/storage/implementation/v3/MongoParameterCompactorV3.js.map +1 -1
- package/dist/storage/implementation/v3/MongoStoppedSyncConfigCleanup.d.ts +54 -0
- package/dist/storage/implementation/v3/MongoStoppedSyncConfigCleanup.js +319 -0
- package/dist/storage/implementation/v3/MongoStoppedSyncConfigCleanup.js.map +1 -0
- package/dist/storage/implementation/v3/MongoSyncBucketStorageV3.d.ts +61 -36
- package/dist/storage/implementation/v3/MongoSyncBucketStorageV3.js +353 -161
- 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 +8 -3
- package/dist/storage/implementation/v3/PersistedBatchV3.js +131 -29
- package/dist/storage/implementation/v3/PersistedBatchV3.js.map +1 -1
- package/dist/storage/implementation/v3/SourceRecordStoreV3.d.ts +3 -3
- package/dist/storage/implementation/v3/SourceRecordStoreV3.js +13 -11
- package/dist/storage/implementation/v3/SourceRecordStoreV3.js.map +1 -1
- package/dist/storage/implementation/v3/VersionedPowerSyncMongoV3.d.ts +26 -14
- package/dist/storage/implementation/v3/VersionedPowerSyncMongoV3.js +73 -29
- package/dist/storage/implementation/v3/VersionedPowerSyncMongoV3.js.map +1 -1
- package/dist/storage/implementation/v3/bucket-format.d.ts +13 -0
- package/dist/storage/implementation/v3/bucket-format.js +79 -0
- package/dist/storage/implementation/v3/bucket-format.js.map +1 -0
- package/dist/storage/implementation/v3/chunking.d.ts +10 -0
- package/dist/storage/implementation/v3/chunking.js +30 -0
- package/dist/storage/implementation/v3/chunking.js.map +1 -0
- 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 +187 -23
- package/dist/storage/implementation/v3/models.js +11 -28
- package/dist/storage/implementation/v3/models.js.map +1 -1
- package/dist/storage/implementation/v3/object-storage/BucketDataObjectStorage.d.ts +20 -0
- package/dist/storage/implementation/v3/object-storage/BucketDataObjectStorage.js +48 -0
- package/dist/storage/implementation/v3/object-storage/BucketDataObjectStorage.js.map +1 -0
- package/dist/storage/implementation/v3/object-storage/ObjectStorage.d.ts +33 -0
- package/dist/storage/implementation/v3/object-storage/ObjectStorage.js +12 -0
- package/dist/storage/implementation/v3/object-storage/ObjectStorage.js.map +1 -0
- package/dist/storage/implementation/v3/object-storage/ObjectStorageLifecycle.d.ts +68 -0
- package/dist/storage/implementation/v3/object-storage/ObjectStorageLifecycle.js +154 -0
- package/dist/storage/implementation/v3/object-storage/ObjectStorageLifecycle.js.map +1 -0
- 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 +67 -0
- package/dist/storage/implementation/v3/object-storage/S3ObjectStorage.js +439 -0
- package/dist/storage/implementation/v3/object-storage/S3ObjectStorage.js.map +1 -0
- package/dist/storage/implementation/v3/source-table-utils.d.ts +63 -0
- package/dist/storage/implementation/v3/source-table-utils.js +206 -0
- package/dist/storage/implementation/v3/source-table-utils.js.map +1 -0
- package/dist/storage/storage-index.d.ts +5 -4
- package/dist/storage/storage-index.js +5 -4
- package/dist/storage/storage-index.js.map +1 -1
- package/dist/types/types.d.ts +71 -3
- package/dist/types/types.js +58 -2
- package/dist/types/types.js.map +1 -1
- package/dist/utils/test-utils.d.ts +1 -2
- package/dist/utils/test-utils.js +7 -1
- package/dist/utils/test-utils.js.map +1 -1
- package/dist/utils/util.d.ts +9 -2
- package/dist/utils/util.js +131 -5
- package/dist/utils/util.js.map +1 -1
- package/package.json +13 -19
- package/src/migrations/db/migrations/1782950400000-checkpoint-requested-at-index.ts +55 -0
- package/src/storage/MongoBucketStorage.ts +728 -242
- package/src/storage/implementation/MongoBucketBatch.ts +196 -91
- package/src/storage/implementation/MongoChecksums.ts +93 -153
- package/src/storage/implementation/MongoCompactor.ts +106 -631
- package/src/storage/implementation/MongoHydrationState.ts +61 -0
- package/src/storage/implementation/MongoParameterCompactor.ts +392 -87
- package/src/storage/implementation/MongoParsedSyncConfigSet.ts +122 -0
- package/src/storage/implementation/MongoPersistedReplicationStream.ts +118 -0
- package/src/storage/implementation/MongoPersistedSyncConfigContent.ts +156 -0
- package/src/storage/implementation/MongoStorageProvider.ts +48 -4
- package/src/storage/implementation/MongoSyncBucketStorage.ts +226 -118
- package/src/storage/implementation/MongoSyncRulesLock.ts +28 -12
- package/src/storage/implementation/MongoWriteCheckpointAPI.ts +194 -52
- package/src/storage/implementation/SyncRuleStateUpdate.ts +13 -6
- package/src/storage/implementation/common/MongoSyncBucketStorageCheckpoint.ts +31 -0
- package/src/storage/implementation/common/PersistedBatch.ts +83 -15
- package/src/storage/implementation/common/VersionedPowerSyncMongoBase.ts +1 -1
- package/src/storage/implementation/createMongoSyncBucketStorage.ts +21 -7
- package/src/storage/implementation/db.ts +40 -22
- package/src/storage/implementation/models.ts +58 -14
- package/src/storage/implementation/v1/MongoBucketBatchV1.ts +174 -125
- package/src/storage/implementation/v1/MongoChecksumsV1.ts +154 -12
- package/src/storage/implementation/v1/MongoCompactorV1.ts +594 -25
- package/src/storage/implementation/v1/MongoParameterCompactorV1.ts +25 -9
- package/src/storage/implementation/v1/MongoSyncBucketStorageV1.ts +226 -129
- package/src/storage/implementation/v1/SingleBucketStoreV1.ts +18 -27
- package/src/storage/implementation/v1/VersionedPowerSyncMongoV1.ts +11 -1
- package/src/storage/implementation/v1/models.ts +12 -1
- package/src/storage/implementation/v3/BucketDataContextV3.ts +32 -0
- package/src/storage/implementation/v3/CompactionLease.ts +152 -0
- package/src/storage/implementation/v3/MongoBucketBatchV3.ts +502 -324
- package/src/storage/implementation/v3/MongoChecksumsV3.ts +250 -32
- package/src/storage/implementation/v3/MongoCompactorV3.ts +1439 -70
- package/src/storage/implementation/v3/MongoParameterCompactorV3.ts +19 -9
- package/src/storage/implementation/v3/MongoStoppedSyncConfigCleanup.ts +473 -0
- package/src/storage/implementation/v3/MongoSyncBucketStorageV3.ts +453 -211
- package/src/storage/implementation/v3/MongoWriteCheckpointAPIV3.ts +111 -0
- package/src/storage/implementation/v3/PersistedBatchV3.ts +169 -45
- package/src/storage/implementation/v3/SourceRecordStoreV3.ts +12 -12
- package/src/storage/implementation/v3/VersionedPowerSyncMongoV3.ts +99 -38
- package/src/storage/implementation/v3/bucket-format.ts +99 -0
- package/src/storage/implementation/v3/chunking.ts +40 -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 +228 -58
- package/src/storage/implementation/v3/object-storage/BucketDataObjectStorage.ts +62 -0
- package/src/storage/implementation/v3/object-storage/ObjectStorage.ts +44 -0
- package/src/storage/implementation/v3/object-storage/ObjectStorageLifecycle.ts +182 -0
- package/src/storage/implementation/v3/object-storage/ObjectStorageUsage.ts +230 -0
- package/src/storage/implementation/v3/object-storage/S3ObjectStorage.ts +573 -0
- package/src/storage/implementation/v3/source-table-utils.ts +398 -0
- package/src/storage/storage-index.ts +14 -4
- package/src/types/types.ts +76 -2
- package/src/utils/test-utils.ts +8 -3
- package/src/utils/util.ts +188 -7
- package/test/src/__snapshots__/storage.test.ts.snap +4 -54
- package/test/src/__snapshots__/storage_sync.test.ts.snap +652 -645
- package/test/src/cleanup-stopped-sync-configs.test.ts +698 -0
- package/test/src/compact-utils.test.ts +226 -0
- package/test/src/helpers/MemoryObjectStorage.ts +61 -0
- package/test/src/helpers/s3TestFactory.ts +69 -0
- package/test/src/object_storage_lifecycle.test.ts +59 -0
- 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/setup.ts +6 -1
- package/test/src/storage.test.ts +478 -13
- package/test/src/storage_compacting.test.ts +2516 -107
- package/test/src/storage_object_storage_inline_threshold.test.ts +116 -0
- package/test/src/storage_s3_checksums.test.ts +190 -0
- package/test/src/storage_s3_compaction_lifecycle.test.ts +543 -0
- package/test/src/storage_s3_reading.test.ts +768 -0
- package/test/src/storage_s3_writing.test.ts +136 -0
- package/test/src/storage_sync.test.ts +1507 -76
- package/test/src/storeCurrentData.test.ts +227 -0
- package/test/src/util.ts +3 -2
- package/tsconfig.json +1 -4
- package/tsconfig.tsbuildinfo +1 -1
- package/dist/storage/implementation/BucketDefinitionMapping.d.ts +0 -15
- package/dist/storage/implementation/BucketDefinitionMapping.js +0 -58
- package/dist/storage/implementation/BucketDefinitionMapping.js.map +0 -1
- package/dist/storage/implementation/MongoPersistedSyncRules.d.ts +0 -14
- package/dist/storage/implementation/MongoPersistedSyncRules.js +0 -67
- package/dist/storage/implementation/MongoPersistedSyncRules.js.map +0 -1
- package/dist/storage/implementation/MongoPersistedSyncRulesContent.d.ts +0 -29
- package/dist/storage/implementation/MongoPersistedSyncRulesContent.js +0 -76
- package/dist/storage/implementation/MongoPersistedSyncRulesContent.js.map +0 -1
- package/dist/storage/implementation/common/MongoSyncBucketStorageContext.d.ts +0 -13
- package/dist/storage/implementation/common/MongoSyncBucketStorageContext.js +0 -2
- package/dist/storage/implementation/common/MongoSyncBucketStorageContext.js.map +0 -1
- package/dist/storage/implementation/common/SingleBucketStore.d.ts +0 -54
- package/dist/storage/implementation/common/SingleBucketStore.js +0 -3
- package/dist/storage/implementation/common/SingleBucketStore.js.map +0 -1
- package/dist/storage/implementation/v3/MongoParameterLookupV3.d.ts +0 -4
- package/dist/storage/implementation/v3/MongoParameterLookupV3.js +0 -9
- package/dist/storage/implementation/v3/MongoParameterLookupV3.js.map +0 -1
- package/dist/storage/implementation/v3/SingleBucketStoreV3.d.ts +0 -18
- package/dist/storage/implementation/v3/SingleBucketStoreV3.js +0 -48
- package/dist/storage/implementation/v3/SingleBucketStoreV3.js.map +0 -1
- package/src/storage/implementation/BucketDefinitionMapping.ts +0 -75
- package/src/storage/implementation/MongoPersistedSyncRules.ts +0 -82
- package/src/storage/implementation/MongoPersistedSyncRulesContent.ts +0 -101
- package/src/storage/implementation/common/MongoSyncBucketStorageContext.ts +0 -15
- package/src/storage/implementation/common/SingleBucketStore.ts +0 -63
- package/src/storage/implementation/v3/MongoParameterLookupV3.ts +0 -11
- package/src/storage/implementation/v3/SingleBucketStoreV3.ts +0 -68
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import { addPartialChecksums, ChecksumCache
|
|
2
|
-
import
|
|
1
|
+
import { addPartialChecksums, ChecksumCache } from '@powersync/service-core';
|
|
2
|
+
import { ServiceAssertionError } from '@powersync/lib-services-framework';
|
|
3
|
+
import { setSessionSnapshotTime } from '../../utils/util.js';
|
|
3
4
|
const DEFAULT_BUCKET_BATCH_LIMIT = 200;
|
|
4
|
-
const DEFAULT_OPERATION_BATCH_LIMIT = 50_000;
|
|
5
|
+
export const DEFAULT_OPERATION_BATCH_LIMIT = 50_000;
|
|
5
6
|
export class MongoChecksums {
|
|
6
7
|
db;
|
|
7
8
|
group_id;
|
|
@@ -21,8 +22,9 @@ export class MongoChecksums {
|
|
|
21
22
|
*/
|
|
22
23
|
get cache() {
|
|
23
24
|
this._cache ??= new ChecksumCache({
|
|
24
|
-
|
|
25
|
-
|
|
25
|
+
ttlMs: this.options.checksumCacheTtlMs,
|
|
26
|
+
fetchChecksums: (batch, context) => {
|
|
27
|
+
return this.computePartialChecksums(batch, context);
|
|
26
28
|
}
|
|
27
29
|
});
|
|
28
30
|
return this._cache;
|
|
@@ -31,8 +33,8 @@ export class MongoChecksums {
|
|
|
31
33
|
* Calculate checksums, utilizing the cache for partial checkums, and querying the remainder from
|
|
32
34
|
* the database (bucket_state + bucket_data).
|
|
33
35
|
*/
|
|
34
|
-
async getChecksums(checkpoint, buckets) {
|
|
35
|
-
return this.cache.getChecksumMap(checkpoint, buckets);
|
|
36
|
+
async getChecksums(checkpoint, buckets, options) {
|
|
37
|
+
return this.cache.getChecksumMap(checkpoint, buckets, options);
|
|
36
38
|
}
|
|
37
39
|
clearCache() {
|
|
38
40
|
this.cache.clear();
|
|
@@ -46,11 +48,31 @@ export class MongoChecksums {
|
|
|
46
48
|
* As long as data is compacted regularly, this should be fast. Large buckets without pre-compacted bucket_state
|
|
47
49
|
* can be slow.
|
|
48
50
|
*/
|
|
49
|
-
async computePartialChecksums(batch) {
|
|
51
|
+
async computePartialChecksums(batch, context) {
|
|
50
52
|
if (batch.length == 0) {
|
|
51
53
|
return new Map();
|
|
52
54
|
}
|
|
53
|
-
|
|
55
|
+
if (context == null) {
|
|
56
|
+
throw new ServiceAssertionError(`context is required`);
|
|
57
|
+
}
|
|
58
|
+
const { snapshotTime, clusterTime, readPreference } = context;
|
|
59
|
+
return this.db.client.withSession({ snapshot: true }, async (session) => {
|
|
60
|
+
if (snapshotTime != null && clusterTime != null) {
|
|
61
|
+
setSessionSnapshotTime(session, snapshotTime);
|
|
62
|
+
session.advanceClusterTime(clusterTime);
|
|
63
|
+
}
|
|
64
|
+
return this.computePartialChecksumsWithSession(batch, {
|
|
65
|
+
readOptions: {
|
|
66
|
+
// This is set on the session, but we set it on each operation as well just in case
|
|
67
|
+
readConcern: 'snapshot',
|
|
68
|
+
readPreference,
|
|
69
|
+
session
|
|
70
|
+
}
|
|
71
|
+
});
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
async computePartialChecksumsWithSession(batch, context) {
|
|
75
|
+
const preStates = await this.fetchPreStates(batch, context);
|
|
54
76
|
const mappedRequests = batch.map((request) => {
|
|
55
77
|
let start = request.start;
|
|
56
78
|
if (start == null) {
|
|
@@ -64,7 +86,7 @@ export class MongoChecksums {
|
|
|
64
86
|
start
|
|
65
87
|
};
|
|
66
88
|
});
|
|
67
|
-
const queriedChecksums = await this.computePartialChecksumsDirect(mappedRequests);
|
|
89
|
+
const queriedChecksums = await this.computePartialChecksumsDirect(mappedRequests, context);
|
|
68
90
|
return new Map(batch.map((request) => {
|
|
69
91
|
const bucket = request.bucket;
|
|
70
92
|
// Could be null if this is either (1) a partial request, or (2) no compacted checksum was available
|
|
@@ -85,131 +107,24 @@ export class MongoChecksums {
|
|
|
85
107
|
* For large buckets, this can be slow, but should not time out as the underlying queries are performed in
|
|
86
108
|
* smaller batches.
|
|
87
109
|
*/
|
|
88
|
-
async computePartialChecksumsDirect(batch) {
|
|
110
|
+
async computePartialChecksumsDirect(batch, context) {
|
|
89
111
|
// Limit the number of buckets we query for at a time.
|
|
90
112
|
const bucketBatchLimit = this.options?.bucketBatchLimit ?? DEFAULT_BUCKET_BATCH_LIMIT;
|
|
91
113
|
if (batch.length <= bucketBatchLimit) {
|
|
92
114
|
// Single batch - no need for splitting the batch and merging results
|
|
93
|
-
return await this.computePartialChecksumsInternal(batch);
|
|
115
|
+
return await this.computePartialChecksumsInternal(batch, context);
|
|
94
116
|
}
|
|
95
117
|
// Split the batch and merge results
|
|
96
118
|
let results = new Map();
|
|
97
119
|
for (let i = 0; i < batch.length; i += bucketBatchLimit) {
|
|
98
120
|
const bucketBatch = batch.slice(i, i + bucketBatchLimit);
|
|
99
|
-
const batchResults = await this.computePartialChecksumsInternal(bucketBatch);
|
|
121
|
+
const batchResults = await this.computePartialChecksumsInternal(bucketBatch, context);
|
|
100
122
|
for (let r of batchResults.values()) {
|
|
101
123
|
results.set(r.bucket, r);
|
|
102
124
|
}
|
|
103
125
|
}
|
|
104
126
|
return results;
|
|
105
127
|
}
|
|
106
|
-
async computePartialChecksumsForCollection(batch, collection, createFilter) {
|
|
107
|
-
const batchLimit = this.options?.operationBatchLimit ?? DEFAULT_OPERATION_BATCH_LIMIT;
|
|
108
|
-
// Map requests by bucket. We adjust this as we get partial results.
|
|
109
|
-
let requests = new Map();
|
|
110
|
-
for (let request of batch) {
|
|
111
|
-
requests.set(request.bucket, request);
|
|
112
|
-
}
|
|
113
|
-
const partialChecksums = new Map();
|
|
114
|
-
while (requests.size > 0) {
|
|
115
|
-
const filters = Array.from(requests.values(), createFilter);
|
|
116
|
-
// Historically, checksum may be stored as 'int' or 'double'.
|
|
117
|
-
// More recently, this should be a 'long'.
|
|
118
|
-
// $toLong ensures that we always sum it as a long, avoiding inaccuracies in the calculations.
|
|
119
|
-
const checksumLong = this.storageConfig.longChecksums ? '$checksum' : { $toLong: '$checksum' };
|
|
120
|
-
// Aggregate over a max of `batchLimit` operations at a time.
|
|
121
|
-
// Let's say we have 3 buckets (A, B, C), each with 10 operations, and our batch limit is 12.
|
|
122
|
-
// Then we'll do three batches:
|
|
123
|
-
// 1. Query: A[1-end], B[1-end], C[1-end]
|
|
124
|
-
// Returns: A[1-10], B[1-2]
|
|
125
|
-
// 2. Query: B[3-end], C[1-end]
|
|
126
|
-
// Returns: B[3-10], C[1-4]
|
|
127
|
-
// 3. Query: C[5-end]
|
|
128
|
-
// Returns: C[5-10]
|
|
129
|
-
const aggregate = await collection
|
|
130
|
-
.aggregate([
|
|
131
|
-
{
|
|
132
|
-
$match: {
|
|
133
|
-
$or: filters
|
|
134
|
-
}
|
|
135
|
-
},
|
|
136
|
-
// sort and limit _before_ grouping
|
|
137
|
-
{ $sort: { _id: 1 } },
|
|
138
|
-
{ $limit: batchLimit },
|
|
139
|
-
{
|
|
140
|
-
$group: {
|
|
141
|
-
_id: '$_id.b',
|
|
142
|
-
checksum_total: { $sum: checksumLong },
|
|
143
|
-
count: { $sum: 1 },
|
|
144
|
-
has_clear_op: {
|
|
145
|
-
$max: {
|
|
146
|
-
$cond: [{ $eq: ['$op', 'CLEAR'] }, 1, 0]
|
|
147
|
-
}
|
|
148
|
-
},
|
|
149
|
-
last_op: { $max: '$_id.o' }
|
|
150
|
-
}
|
|
151
|
-
},
|
|
152
|
-
// Sort the aggregated results (100 max, so should be fast).
|
|
153
|
-
// This is important to identify which buckets we have partial data for.
|
|
154
|
-
{ $sort: { _id: 1 } }
|
|
155
|
-
], { session: undefined, readConcern: 'snapshot', maxTimeMS: lib_mongo.MONGO_CHECKSUM_TIMEOUT_MS })
|
|
156
|
-
.toArray()
|
|
157
|
-
.catch((e) => {
|
|
158
|
-
throw lib_mongo.mapQueryError(e, 'while reading checksums');
|
|
159
|
-
});
|
|
160
|
-
let batchCount = 0;
|
|
161
|
-
let limitReached = false;
|
|
162
|
-
for (let doc of aggregate) {
|
|
163
|
-
const bucket = doc._id;
|
|
164
|
-
const checksum = checksumFromAggregate(doc);
|
|
165
|
-
const existing = partialChecksums.get(bucket);
|
|
166
|
-
if (existing != null) {
|
|
167
|
-
partialChecksums.set(bucket, addPartialChecksums(bucket, existing, checksum));
|
|
168
|
-
}
|
|
169
|
-
else {
|
|
170
|
-
partialChecksums.set(bucket, checksum);
|
|
171
|
-
}
|
|
172
|
-
batchCount += doc.count;
|
|
173
|
-
if (batchCount == batchLimit) {
|
|
174
|
-
// Limit reached. Request more in the next batch.
|
|
175
|
-
// Note that this only affects the _last_ bucket in a batch.
|
|
176
|
-
limitReached = true;
|
|
177
|
-
const req = requests.get(bucket);
|
|
178
|
-
requests.set(bucket, {
|
|
179
|
-
...req,
|
|
180
|
-
start: doc.last_op
|
|
181
|
-
});
|
|
182
|
-
}
|
|
183
|
-
else {
|
|
184
|
-
// All done for this bucket
|
|
185
|
-
requests.delete(bucket);
|
|
186
|
-
}
|
|
187
|
-
}
|
|
188
|
-
if (!limitReached) {
|
|
189
|
-
break;
|
|
190
|
-
}
|
|
191
|
-
}
|
|
192
|
-
return new Map(batch.map((request) => {
|
|
193
|
-
const bucket = request.bucket;
|
|
194
|
-
// Could be null if we got no data
|
|
195
|
-
let partialChecksum = partialChecksums.get(bucket);
|
|
196
|
-
if (partialChecksum == null) {
|
|
197
|
-
partialChecksum = {
|
|
198
|
-
bucket,
|
|
199
|
-
partialCount: 0,
|
|
200
|
-
partialChecksum: 0
|
|
201
|
-
};
|
|
202
|
-
}
|
|
203
|
-
if (request.start == null && isPartialChecksum(partialChecksum)) {
|
|
204
|
-
partialChecksum = {
|
|
205
|
-
bucket,
|
|
206
|
-
count: partialChecksum.partialCount,
|
|
207
|
-
checksum: partialChecksum.partialChecksum
|
|
208
|
-
};
|
|
209
|
-
}
|
|
210
|
-
return [bucket, partialChecksum];
|
|
211
|
-
}));
|
|
212
|
-
}
|
|
213
128
|
}
|
|
214
129
|
export function emptyChecksumForRequest(request) {
|
|
215
130
|
if (request.start == null) {
|
|
@@ -220,7 +135,7 @@ export function emptyChecksumForRequest(request) {
|
|
|
220
135
|
/**
|
|
221
136
|
* Convert output of the $group stage into a checksum.
|
|
222
137
|
*/
|
|
223
|
-
function checksumFromAggregate(doc) {
|
|
138
|
+
export function checksumFromAggregate(doc) {
|
|
224
139
|
const partialChecksum = Number(BigInt(doc.checksum_total) & 0xffffffffn) & 0xffffffff;
|
|
225
140
|
const bucket = doc._id;
|
|
226
141
|
if (doc.has_clear_op == 1) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MongoChecksums.js","sourceRoot":"","sources":["../../../src/storage/implementation/MongoChecksums.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"MongoChecksums.js","sourceRoot":"","sources":["../../../src/storage/implementation/MongoChecksums.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,120 +1,58 @@
|
|
|
1
1
|
import { mongo } from '@powersync/lib-service-mongodb';
|
|
2
2
|
import { Logger } from '@powersync/lib-services-framework';
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import { BucketDataDoc, BucketKey } from './common/BucketDataDoc.js';
|
|
6
|
-
import { BucketDataDocumentGeneric, SingleBucketStore } from './common/SingleBucketStore.js';
|
|
3
|
+
import { storage } from '@powersync/service-core';
|
|
4
|
+
import { BucketKey } from './common/BucketDataDoc.js';
|
|
7
5
|
import type { VersionedPowerSyncMongo } from './db.js';
|
|
8
|
-
import { BucketStateDocumentBase } from './models.js';
|
|
9
6
|
import type { MongoSyncBucketStorage } from './MongoSyncBucketStorage.js';
|
|
10
|
-
interface
|
|
11
|
-
/** Bucket name */
|
|
12
|
-
bucket: string;
|
|
13
|
-
definitionId: BucketDefinitionId;
|
|
14
|
-
/**
|
|
15
|
-
* Rows seen in the bucket, with the last op_id of each.
|
|
16
|
-
*/
|
|
17
|
-
seen: Map<string, InternalOpId>;
|
|
18
|
-
/**
|
|
19
|
-
* Estimated memory usage of the seen Map.
|
|
20
|
-
*/
|
|
21
|
-
trackingSize: number;
|
|
22
|
-
/**
|
|
23
|
-
* Last (lowest) seen op_id that is not a PUT.
|
|
24
|
-
*/
|
|
25
|
-
lastNotPut: InternalOpId | null;
|
|
26
|
-
/**
|
|
27
|
-
* Number of REMOVE/MOVE operations seen since lastNotPut.
|
|
28
|
-
*/
|
|
29
|
-
opsSincePut: number;
|
|
30
|
-
/**
|
|
31
|
-
* Incrementally-updated checksum, up to maxOpId.
|
|
32
|
-
*/
|
|
33
|
-
checksum: number;
|
|
34
|
-
/**
|
|
35
|
-
* Op count for the checksum.
|
|
36
|
-
*/
|
|
37
|
-
opCount: number;
|
|
7
|
+
export interface MongoCompactOptions extends storage.CompactOptions {
|
|
38
8
|
/**
|
|
39
|
-
*
|
|
9
|
+
* Only merge adjacent V3 bucket-data chunks. This is used after initial
|
|
10
|
+
* replication, where reading every operation would defeat the purpose of
|
|
11
|
+
* the lightweight pass.
|
|
40
12
|
*/
|
|
41
|
-
|
|
13
|
+
compactChunksOnly?: boolean;
|
|
42
14
|
}
|
|
43
|
-
export
|
|
15
|
+
export declare class ConcurrentCompactionError extends Error {
|
|
16
|
+
constructor(message: string);
|
|
44
17
|
}
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
18
|
+
/**
|
|
19
|
+
* A worker whose bucket lease has been replaced must stop immediately. Unlike
|
|
20
|
+
* a transactional replacement conflict, retrying it with the same compactor
|
|
21
|
+
* instance would still use the stale lease and could race the new owner.
|
|
22
|
+
*/
|
|
23
|
+
export declare class CompactionLeaseLostError extends ConcurrentCompactionError {
|
|
24
|
+
constructor(message: string);
|
|
50
25
|
}
|
|
51
26
|
export declare abstract class MongoCompactor {
|
|
52
27
|
protected readonly storage: MongoSyncBucketStorage;
|
|
53
28
|
protected readonly db: VersionedPowerSyncMongo;
|
|
54
|
-
protected updates: mongo.AnyBulkWriteOperation<BucketDataDocumentGeneric>[];
|
|
55
|
-
protected bucketStateUpdates: mongo.AnyBulkWriteOperation<BucketStateDocumentBase>[];
|
|
56
29
|
protected readonly idLimitBytes: number;
|
|
57
30
|
protected readonly moveBatchLimit: number;
|
|
58
31
|
protected readonly moveBatchQueryLimit: number;
|
|
32
|
+
protected readonly moveBatchByteLimit: number;
|
|
59
33
|
protected readonly clearBatchLimit: number;
|
|
60
|
-
protected readonly minBucketChanges: number;
|
|
61
|
-
protected readonly minChangeRatio: number;
|
|
62
|
-
protected readonly maxOpId: bigint;
|
|
63
34
|
protected readonly buckets: string[] | undefined;
|
|
35
|
+
protected readonly deleteCheckpointRequestsBefore: Date | undefined;
|
|
64
36
|
protected readonly signal?: AbortSignal;
|
|
65
37
|
protected readonly group_id: number;
|
|
38
|
+
protected readonly compactChunksOnly: boolean;
|
|
39
|
+
protected compactedBucketCount: number;
|
|
66
40
|
protected readonly logger: Logger;
|
|
67
41
|
constructor(storage: MongoSyncBucketStorage, db: VersionedPowerSyncMongo, options: MongoCompactOptions);
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
* See /docs/compacting-operations.md for details.
|
|
72
|
-
*/
|
|
73
|
-
compact(): Promise<void>;
|
|
74
|
-
/**
|
|
75
|
-
* Subset of compact, only populating checksums where relevant.
|
|
76
|
-
*/
|
|
77
|
-
populateChecksums(options: {
|
|
78
|
-
minBucketChanges: number;
|
|
79
|
-
}): Promise<PopulateChecksumCacheResults>;
|
|
80
|
-
protected dirtyBucketBatchesForCollection<TCollectionBucketState extends BucketStateDocumentBase>(collection: mongo.Collection<TCollectionBucketState>, lastId: TCollectionBucketState['_id'], maxId: TCollectionBucketState['_id'], options: {
|
|
81
|
-
minBucketChanges: number;
|
|
82
|
-
minChangeRatio: number;
|
|
83
|
-
}, getDefinitionId: (state: TCollectionBucketState) => BucketDefinitionId | null): AsyncGenerator<DirtyBucket[]>;
|
|
84
|
-
protected dirtyBucketBatchForChecksumsForCollection<TBucketState extends BucketStateDocumentBase>(collection: mongo.Collection<TBucketState>, filter: mongo.Filter<TBucketState>, getDefinitionId: (state: mongo.WithId<TBucketState>) => BucketDefinitionId | null): Promise<DirtyBucket[]>;
|
|
85
|
-
abstract dirtyBucketBatches(options: {
|
|
86
|
-
minBucketChanges: number;
|
|
87
|
-
minChangeRatio: number;
|
|
88
|
-
}): AsyncGenerator<DirtyBucket[]>;
|
|
89
|
-
abstract dirtyBucketBatchForChecksums(options: {
|
|
90
|
-
minBucketChanges: number;
|
|
91
|
-
}): Promise<DirtyBucket[]>;
|
|
92
|
-
protected compactDirtyBuckets(): Promise<void>;
|
|
42
|
+
abstract compact(): Promise<number>;
|
|
43
|
+
protected deleteOldCheckpointRequests(): Promise<void>;
|
|
44
|
+
protected deleteOldCustomCheckpointRequests(): Promise<void>;
|
|
93
45
|
/**
|
|
94
46
|
* Compaction for a single bucket, with retries on failure.
|
|
95
47
|
*
|
|
96
|
-
*
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
protected updateBucketChecksums(state: CurrentBucketState): void;
|
|
101
|
-
protected flush(col: SingleBucketStore): Promise<void>;
|
|
102
|
-
private flushBucketStateUpdates;
|
|
103
|
-
/**
|
|
104
|
-
* Perform a CLEAR compact for a bucket.
|
|
105
|
-
*
|
|
106
|
-
* @param currentState tracks the last non-PUT op, which will be converted to CLEAR.
|
|
48
|
+
* A compaction can race another compactor after its initial scan. Restarting
|
|
49
|
+
* the bucket is safe because each replacement is transactional. Object
|
|
50
|
+
* storage paths are also prepared with lifecycle markers, so a retry can
|
|
51
|
+
* safely overwrite or eventually clean up uploads from the failed attempt.
|
|
107
52
|
*/
|
|
108
|
-
protected
|
|
109
|
-
protected updateChecksumsBatch(buckets: Pick<DirtyBucket, 'bucket' | 'definitionId'>[]): Promise<void>;
|
|
110
|
-
protected formatBucketDataKey(doc: Pick<BucketDataDoc, 'bucketKey' | 'o'>): string;
|
|
111
|
-
protected abstract writeBucketStateUpdates(): Promise<void>;
|
|
112
|
-
protected abstract computeChecksumsForBuckets(buckets: Pick<DirtyBucket, 'bucket' | 'definitionId'>[]): Promise<storage.PartialChecksumMap>;
|
|
113
|
-
protected abstract bucketStateFilter(bucket: string, definitionId: BucketDefinitionId | null): mongo.Document;
|
|
114
|
-
protected abstract getBucketDataContext(bucket: string, definitionId: BucketDefinitionId | null): Promise<SingleBucketStore | null>;
|
|
53
|
+
protected retryCompaction(bucket: string, compact: () => Promise<void>): Promise<void>;
|
|
115
54
|
}
|
|
116
55
|
export interface BucketDataCollectionContext<TBucketData extends mongo.Document> {
|
|
117
56
|
bucketKey: BucketKey;
|
|
118
57
|
collection: mongo.Collection<TBucketData>;
|
|
119
58
|
}
|
|
120
|
-
export {};
|