@powersync/service-module-mongodb-storage 0.0.0-dev-20260803144812 → 0.0.0-dev-20260929095716
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 +129 -7
- package/dist/storage/MongoBucketStorage.d.ts +42 -5
- package/dist/storage/MongoBucketStorage.js +404 -215
- package/dist/storage/MongoBucketStorage.js.map +1 -1
- package/dist/storage/implementation/MongoBucketBatch.d.ts +39 -14
- package/dist/storage/implementation/MongoBucketBatch.js +169 -98
- package/dist/storage/implementation/MongoBucketBatch.js.map +1 -1
- package/dist/storage/implementation/MongoCompactor.d.ts +21 -79
- package/dist/storage/implementation/MongoCompactor.js +27 -238
- package/dist/storage/implementation/MongoCompactor.js.map +1 -1
- package/dist/storage/implementation/MongoIdSequence.d.ts +10 -1
- package/dist/storage/implementation/MongoIdSequence.js +14 -1
- package/dist/storage/implementation/MongoIdSequence.js.map +1 -1
- package/dist/storage/implementation/MongoOpIdAllocator.d.ts +27 -0
- package/dist/storage/implementation/MongoOpIdAllocator.js +97 -0
- package/dist/storage/implementation/MongoOpIdAllocator.js.map +1 -0
- 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 +35 -2
- package/dist/storage/implementation/MongoParsedSyncConfigSet.js.map +1 -1
- package/dist/storage/implementation/MongoPersistedReplicationStream.d.ts +2 -1
- package/dist/storage/implementation/MongoPersistedReplicationStream.js +7 -4
- package/dist/storage/implementation/MongoPersistedReplicationStream.js.map +1 -1
- package/dist/storage/implementation/MongoPersistedSyncConfigContent.d.ts +3 -3
- package/dist/storage/implementation/MongoPersistedSyncConfigContent.js +10 -8
- package/dist/storage/implementation/MongoPersistedSyncConfigContent.js.map +1 -1
- package/dist/storage/implementation/MongoStorageProvider.js +8 -4
- package/dist/storage/implementation/MongoStorageProvider.js.map +1 -1
- package/dist/storage/implementation/MongoSyncBucketStorage.d.ts +32 -11
- package/dist/storage/implementation/MongoSyncBucketStorage.js +95 -31
- package/dist/storage/implementation/MongoSyncBucketStorage.js.map +1 -1
- package/dist/storage/implementation/MongoSyncRulesLock.d.ts +26 -2
- package/dist/storage/implementation/MongoSyncRulesLock.js +59 -10
- 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 +57 -14
- 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 +28 -1
- package/dist/storage/implementation/db.js.map +1 -1
- package/dist/storage/implementation/models.d.ts +35 -0
- package/dist/storage/implementation/models.js.map +1 -1
- package/dist/storage/implementation/v1/MongoBucketBatchV1.d.ts +11 -0
- package/dist/storage/implementation/v1/MongoBucketBatchV1.js +227 -221
- 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 +66 -17
- 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 +14 -2
- package/dist/storage/implementation/v3/MongoBucketBatchV3.js +261 -194
- package/dist/storage/implementation/v3/MongoBucketBatchV3.js.map +1 -1
- package/dist/storage/implementation/v3/MongoCompactorV3.d.ts +83 -25
- package/dist/storage/implementation/v3/MongoCompactorV3.js +702 -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 +92 -32
- 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 +77 -45
- 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 +108 -0
- package/dist/storage/implementation/v3/compact-utils.js +223 -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 +90 -6
- 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 +15 -7
- package/dist/storage/implementation/v3/source-table-utils.js +49 -57
- 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.d.ts +4 -2
- package/dist/utils/test-utils.js +7 -4
- 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 +545 -277
- package/src/storage/implementation/MongoBucketBatch.ts +258 -124
- package/src/storage/implementation/MongoCompactor.ts +37 -346
- package/src/storage/implementation/MongoIdSequence.ts +21 -1
- package/src/storage/implementation/MongoOpIdAllocator.ts +105 -0
- package/src/storage/implementation/MongoParameterCompactor.ts +388 -102
- package/src/storage/implementation/MongoParsedSyncConfigSet.ts +46 -1
- package/src/storage/implementation/MongoPersistedReplicationStream.ts +12 -4
- package/src/storage/implementation/MongoPersistedSyncConfigContent.ts +48 -29
- package/src/storage/implementation/MongoStorageProvider.ts +16 -4
- package/src/storage/implementation/MongoSyncBucketStorage.ts +133 -40
- package/src/storage/implementation/MongoSyncRulesLock.ts +78 -12
- 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 +76 -20
- package/src/storage/implementation/common/VersionedPowerSyncMongoBase.ts +4 -0
- package/src/storage/implementation/db.ts +36 -2
- package/src/storage/implementation/models.ts +39 -0
- package/src/storage/implementation/v1/MongoBucketBatchV1.ts +272 -254
- 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 +88 -28
- 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 +339 -247
- package/src/storage/implementation/v3/MongoCompactorV3.ts +955 -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 +112 -42
- package/src/storage/implementation/v3/MongoWriteCheckpointAPIV3.ts +111 -0
- package/src/storage/implementation/v3/PersistedBatchV3.ts +94 -51
- 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 +329 -0
- package/src/storage/implementation/v3/compaction-constants.ts +5 -0
- package/src/storage/implementation/v3/models.ts +97 -4
- 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 +82 -76
- package/src/storage/storage-index.ts +2 -0
- package/src/types/types.ts +42 -7
- package/src/utils/test-utils.ts +9 -5
- 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 +794 -205
- package/test/src/chunk_compaction_config.test.ts +38 -0
- package/test/src/cleanup-stopped-sync-configs.test.ts +59 -26
- package/test/src/compact-utils.test.ts +251 -0
- package/test/src/concurrent_writers.test.ts +599 -0
- package/test/src/connection_config.test.ts +159 -0
- package/test/src/helpers/MemoryObjectStorage.ts +14 -6
- package/test/src/helpers/concurrentWriter.mjs +29 -0
- package/test/src/helpers/s3TestFactory.ts +12 -12
- package/test/src/object_storage_usage.test.ts +268 -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 +280 -24
- package/test/src/storage_compacting.test.ts +1097 -253
- package/test/src/storage_object_storage_inline_threshold.test.ts +3 -3
- package/test/src/storage_s3_checksums.test.ts +6 -7
- package/test/src/storage_s3_compaction_lifecycle.test.ts +143 -17
- package/test/src/storage_s3_reading.test.ts +294 -6
- package/test/src/storage_s3_writing.test.ts +4 -3
- package/test/src/storage_sync.test.ts +412 -80
- package/test/src/storeCurrentData.test.ts +5 -5
- package/test/src/util.ts +1 -1
- package/tsconfig.tsbuildinfo +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MongoPersistedReplicationStream.js","sourceRoot":"","sources":["../../../src/storage/implementation/MongoPersistedReplicationStream.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,MAAM,mCAAmC,CAAC;AAC1E,OAAO,EAAE,2BAA2B,EAAE,uCAAuC,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAIxH,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AACzE,OAAO,EAEL,iCAAiC,EACjC,iCAAiC,EAClC,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAG7D,MAAM,OAAO,+BAAgC,SAAQ,OAAO,CAAC,0BAA0B;IAKlE;IACA;IACA;
|
|
1
|
+
{"version":3,"file":"MongoPersistedReplicationStream.js","sourceRoot":"","sources":["../../../src/storage/implementation/MongoPersistedReplicationStream.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,16 +10,16 @@ export declare abstract class MongoPersistedSyncConfigContentBase extends storag
|
|
|
10
10
|
protected constructor(db: PowerSyncMongo, options: Omit<storage.PersistedSyncConfigContentData, 'syncConfigId'> & {
|
|
11
11
|
mapping: SingleSyncConfigBucketDefinitionMapping;
|
|
12
12
|
syncConfigId: bson.ObjectId | null;
|
|
13
|
-
});
|
|
13
|
+
}, syncConfigParser: storage.SyncConfigParser);
|
|
14
14
|
getStorageConfig(): import("./models.js").StorageConfig;
|
|
15
15
|
parsed(options: storage.ParseSyncConfigOptions): MongoParsedSyncConfigSet;
|
|
16
16
|
}
|
|
17
17
|
export declare class MongoPersistedSyncConfigContentV1 extends MongoPersistedSyncConfigContentBase {
|
|
18
|
-
constructor(db: PowerSyncMongo, doc: SyncRuleDocumentV1);
|
|
18
|
+
constructor(db: PowerSyncMongo, doc: SyncRuleDocumentV1, syncConfigParser: storage.SyncConfigParser);
|
|
19
19
|
getSyncConfigStatus(): Promise<storage.PersistedSyncConfigStatus | null>;
|
|
20
20
|
}
|
|
21
21
|
export declare class MongoPersistedSyncConfigContentV3 extends MongoPersistedSyncConfigContentBase {
|
|
22
22
|
readonly syncConfigObjectId: bson.ObjectId;
|
|
23
|
-
constructor(db: PowerSyncMongo, doc: ReplicationStreamDocumentV3, config: SyncConfigDefinition);
|
|
23
|
+
constructor(db: PowerSyncMongo, doc: ReplicationStreamDocumentV3, config: SyncConfigDefinition, syncConfigParser: storage.SyncConfigParser);
|
|
24
24
|
getSyncConfigStatus(): Promise<storage.PersistedSyncConfigStatus | null>;
|
|
25
25
|
}
|
|
@@ -6,12 +6,12 @@ export class MongoPersistedSyncConfigContentBase extends storage.PersistedSyncCo
|
|
|
6
6
|
db;
|
|
7
7
|
mapping;
|
|
8
8
|
syncConfigObjectId;
|
|
9
|
-
constructor(db, options) {
|
|
9
|
+
constructor(db, options, syncConfigParser) {
|
|
10
10
|
const { mapping, syncConfigId, ...base } = options;
|
|
11
11
|
super({
|
|
12
12
|
...base,
|
|
13
13
|
syncConfigId: syncConfigId?.toHexString() ?? null
|
|
14
|
-
});
|
|
14
|
+
}, syncConfigParser);
|
|
15
15
|
this.db = db;
|
|
16
16
|
this.mapping = mapping;
|
|
17
17
|
this.syncConfigObjectId = syncConfigId;
|
|
@@ -41,7 +41,7 @@ export class MongoPersistedSyncConfigContentBase extends storage.PersistedSyncCo
|
|
|
41
41
|
}
|
|
42
42
|
}
|
|
43
43
|
export class MongoPersistedSyncConfigContentV1 extends MongoPersistedSyncConfigContentBase {
|
|
44
|
-
constructor(db, doc) {
|
|
44
|
+
constructor(db, doc, syncConfigParser) {
|
|
45
45
|
super(db, {
|
|
46
46
|
replicationStreamId: doc._id,
|
|
47
47
|
sync_rules_content: doc.content,
|
|
@@ -51,8 +51,9 @@ export class MongoPersistedSyncConfigContentV1 extends MongoPersistedSyncConfigC
|
|
|
51
51
|
storageVersion: doc.storage_version ?? storage.LEGACY_STORAGE_VERSION,
|
|
52
52
|
mapping: new SingleSyncConfigBucketDefinitionMapping(),
|
|
53
53
|
syncConfigId: null,
|
|
54
|
-
syncConfigState: doc.state
|
|
55
|
-
|
|
54
|
+
syncConfigState: doc.state,
|
|
55
|
+
version_label: doc.version_label ?? undefined
|
|
56
|
+
}, syncConfigParser);
|
|
56
57
|
}
|
|
57
58
|
async getSyncConfigStatus() {
|
|
58
59
|
const doc = await this.db.sync_rules.findOne({ _id: this.replicationStreamId });
|
|
@@ -63,7 +64,7 @@ export class MongoPersistedSyncConfigContentV1 extends MongoPersistedSyncConfigC
|
|
|
63
64
|
}
|
|
64
65
|
}
|
|
65
66
|
export class MongoPersistedSyncConfigContentV3 extends MongoPersistedSyncConfigContentBase {
|
|
66
|
-
constructor(db, doc, config) {
|
|
67
|
+
constructor(db, doc, config, syncConfigParser) {
|
|
67
68
|
const state = doc.sync_configs.find((c) => c._id.equals(config._id));
|
|
68
69
|
if (state == null) {
|
|
69
70
|
throw new ServiceAssertionError(`Cannot find sync config ${config._id} in replication stream ${doc._id}`);
|
|
@@ -76,8 +77,9 @@ export class MongoPersistedSyncConfigContentV3 extends MongoPersistedSyncConfigC
|
|
|
76
77
|
storageVersion: doc.storage_version,
|
|
77
78
|
mapping: SingleSyncConfigBucketDefinitionMapping.fromPersistedMapping(config.rule_mapping),
|
|
78
79
|
syncConfigId: config._id,
|
|
79
|
-
syncConfigState: state.state
|
|
80
|
-
|
|
80
|
+
syncConfigState: state.state,
|
|
81
|
+
version_label: config.version_label
|
|
82
|
+
}, syncConfigParser);
|
|
81
83
|
}
|
|
82
84
|
async getSyncConfigStatus() {
|
|
83
85
|
const doc = await this.db.sync_rules.findOne({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MongoPersistedSyncConfigContent.js","sourceRoot":"","sources":["../../../src/storage/implementation/MongoPersistedSyncConfigContent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,mCAAmC,CAAC;AAC1E,OAAO,EAAE,uCAAuC,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAS3F,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AAEzE,MAAM,OAAgB,mCAAoC,SAAQ,OAAO,CAAC,0BAA0B;IAK7E;IAJL,OAAO,CAA0C;IACjD,kBAAkB,CAAuB;IAEzD,YACqB,EAAkB,EACrC,OAGC;
|
|
1
|
+
{"version":3,"file":"MongoPersistedSyncConfigContent.js","sourceRoot":"","sources":["../../../src/storage/implementation/MongoPersistedSyncConfigContent.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import * as lib_mongo from '@powersync/lib-service-mongodb';
|
|
2
2
|
import { ErrorCode, logger, ServiceAssertionError, ServiceError } from '@powersync/lib-services-framework';
|
|
3
3
|
import { POWERSYNC_VERSION } from '@powersync/service-core';
|
|
4
|
-
import { MongoStorageConfig, normalizeClearBatchThrottleRate } from '../../types/types.js';
|
|
4
|
+
import { MongoStorageConfig, normalizeChunkCompactionConcurrency, normalizeClearBatchThrottleRate } from '../../types/types.js';
|
|
5
5
|
import { MongoBucketStorage } from '../MongoBucketStorage.js';
|
|
6
6
|
import { MongoReportStorage } from '../MongoReportStorage.js';
|
|
7
7
|
import { PowerSyncMongo } from './db.js';
|
|
@@ -17,6 +17,7 @@ export class MongoStorageProvider {
|
|
|
17
17
|
throw new ServiceAssertionError(`Cannot create MongoDB bucket storage with provided config ${storage.type} !== ${this.type}`);
|
|
18
18
|
}
|
|
19
19
|
const decodedConfig = MongoStorageConfig.decode(storage);
|
|
20
|
+
const chunkCompactionConcurrency = normalizeChunkCompactionConcurrency(decodedConfig.chunk_compaction_concurrency, decodedConfig.object_storage != null);
|
|
20
21
|
let objectStorage;
|
|
21
22
|
if (decodedConfig.object_storage?.type === 's3') {
|
|
22
23
|
// Dynamically import S3ObjectStorage to avoid loading AWS SDK unless needed.
|
|
@@ -29,13 +30,15 @@ export class MongoStorageProvider {
|
|
|
29
30
|
forcePathStyle: decodedConfig.object_storage.force_path_style,
|
|
30
31
|
accessKeyId: decodedConfig.object_storage.access_key_id,
|
|
31
32
|
secretAccessKey: decodedConfig.object_storage.secret_access_key,
|
|
32
|
-
concurrencyLimit: decodedConfig.object_storage.concurrency_limit
|
|
33
|
+
concurrencyLimit: decodedConfig.object_storage.concurrency_limit,
|
|
34
|
+
defaultsMode: decodedConfig.object_storage.defaults_mode
|
|
33
35
|
});
|
|
34
36
|
}
|
|
35
37
|
const client = lib_mongo.db.createMongoClient(decodedConfig, {
|
|
36
38
|
powersyncVersion: POWERSYNC_VERSION,
|
|
37
39
|
maxPoolSize: resolvedConfig.storage.max_pool_size ?? 8
|
|
38
40
|
});
|
|
41
|
+
const database = new PowerSyncMongo(client, { database: resolvedConfig.storage.database });
|
|
39
42
|
let shuttingDown = false;
|
|
40
43
|
// Explicitly connect on startup.
|
|
41
44
|
// Connection errors during startup are typically not recoverable - we get topologyClosed.
|
|
@@ -43,7 +46,6 @@ export class MongoStorageProvider {
|
|
|
43
46
|
// to serve API requests.
|
|
44
47
|
// Errors here will cause the process to exit.
|
|
45
48
|
await client.connect();
|
|
46
|
-
const database = new PowerSyncMongo(client, { database: resolvedConfig.storage.database });
|
|
47
49
|
const readPreference = decodedConfig.bulk_read_preference == null
|
|
48
50
|
? undefined
|
|
49
51
|
: new lib_mongo.mongo.ReadPreference(decodedConfig.bulk_read_preference, undefined, {
|
|
@@ -51,11 +53,13 @@ export class MongoStorageProvider {
|
|
|
51
53
|
// 90 is the minimum value.
|
|
52
54
|
maxStalenessSeconds: decodedConfig.bulk_read_preference == 'primary' ? undefined : 90
|
|
53
55
|
});
|
|
54
|
-
const syncStorageFactory = new MongoBucketStorage(database, {
|
|
56
|
+
const syncStorageFactory = new MongoBucketStorage(database, options.syncConfigParser, {
|
|
57
|
+
chunkCompactionConcurrency,
|
|
55
58
|
replicationStreamNamePrefix: resolvedConfig.slot_name_prefix,
|
|
56
59
|
readPreference,
|
|
57
60
|
clearBatchThrottleRate: normalizeClearBatchThrottleRate(decodedConfig.clear_batch_throttle_rate),
|
|
58
61
|
checksumCacheTtlMs: resolvedConfig.api_parameters.bucket_count_cache_ttl_minutes * 60_000,
|
|
62
|
+
defaultStorageVersion: decodedConfig.default_storage_version,
|
|
59
63
|
// Right now, only MongoDB source databases supports incremental reprocessing.
|
|
60
64
|
// Remove this filter when we support it for other source databases.
|
|
61
65
|
// This assumes a single source connection - revisit if we ever support multiple connections.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MongoStorageProvider.js","sourceRoot":"","sources":["../../../src/storage/implementation/MongoStorageProvider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,SAAS,MAAM,gCAAgC,CAAC;AAC5D,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,qBAAqB,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AAC3G,OAAO,EAAE,iBAAiB,EAAW,MAAM,yBAAyB,CAAC;AACrE,OAAO,
|
|
1
|
+
{"version":3,"file":"MongoStorageProvider.js","sourceRoot":"","sources":["../../../src/storage/implementation/MongoStorageProvider.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { mongo } from '@powersync/lib-service-mongodb';
|
|
2
2
|
import { BaseObserver, DO_NOT_LOG, Logger } from '@powersync/lib-services-framework';
|
|
3
|
-
import { CheckpointChanges,
|
|
3
|
+
import { CheckpointChanges, CompactInitialReplicationOptions, CompactInitialReplicationResults, GetCheckpointChangesOptions, InternalOpId, ReplicationStreamStorageIds, storage, utils, WatchWriteCheckpointOptions } from '@powersync/service-core';
|
|
4
4
|
import { HydratedSyncConfig, ParameterLookupRows, ScopedParameterLookup } from '@powersync/service-sync-rules';
|
|
5
5
|
import { MongoBucketStorage } from '../MongoBucketStorage.js';
|
|
6
|
+
import { MongoGetCheckpointChangesOptions, MongoSyncBucketStorageCheckpoint } from './common/MongoSyncBucketStorageCheckpoint.js';
|
|
6
7
|
import type { VersionedPowerSyncMongo } from './db.js';
|
|
7
8
|
import { StorageConfig } from './models.js';
|
|
8
9
|
import { MongoBucketBatchOptions } from './MongoBucketBatch.js';
|
|
@@ -11,6 +12,7 @@ import { MongoCompactOptions, MongoCompactor } from './MongoCompactor.js';
|
|
|
11
12
|
import { MongoParameterCompactor } from './MongoParameterCompactor.js';
|
|
12
13
|
import { MongoParsedSyncConfigSet } from './MongoParsedSyncConfigSet.js';
|
|
13
14
|
import { MongoPersistedReplicationStream } from './MongoPersistedReplicationStream.js';
|
|
15
|
+
import { MongoCheckpointAPIOptions, MongoWriteCheckpointAPI } from './MongoWriteCheckpointAPI.js';
|
|
14
16
|
import { ObjectStorage } from './v3/object-storage/ObjectStorage.js';
|
|
15
17
|
export interface MongoSyncBucketStorageOptions {
|
|
16
18
|
checksumOptions?: Omit<MongoChecksumOptions, 'storageConfig'>;
|
|
@@ -21,6 +23,15 @@ export interface MongoSyncBucketStorageOptions {
|
|
|
21
23
|
objectStorage?: ObjectStorage;
|
|
22
24
|
inlineThresholdBytes?: number;
|
|
23
25
|
}
|
|
26
|
+
/**
|
|
27
|
+
* The stream state read for a checkpoint. All fields must come from the same snapshot.
|
|
28
|
+
*/
|
|
29
|
+
export interface MongoCheckpointState {
|
|
30
|
+
checkpoint: InternalOpId;
|
|
31
|
+
lsn: string | null;
|
|
32
|
+
/** See {@link MongoSyncBucketStorageCheckpoint.parameterChangesInvalidBefore}. */
|
|
33
|
+
parameterChangesInvalidBefore: InternalOpId;
|
|
34
|
+
}
|
|
24
35
|
interface InternalCheckpointChanges extends CheckpointChanges {
|
|
25
36
|
updatedWriteCheckpoints: Map<string, bigint>;
|
|
26
37
|
invalidateWriteCheckpoints: boolean;
|
|
@@ -49,6 +60,10 @@ export declare abstract class MongoSyncBucketStorage extends BaseObserver<storag
|
|
|
49
60
|
readonly storageConfig: StorageConfig;
|
|
50
61
|
readonly readPreference: mongo.ReadPreference | undefined;
|
|
51
62
|
readonly clearBatchThrottleRate: number;
|
|
63
|
+
/**
|
|
64
|
+
* Required for writing, optional for reading.
|
|
65
|
+
*/
|
|
66
|
+
private readonly replicationLock;
|
|
52
67
|
constructor(factory: MongoBucketStorage, replicationStreamId: number, replicationStream: MongoPersistedReplicationStream, replicationStreamName: string, writeCheckpointMode: storage.WriteCheckpointMode | undefined, options: MongoSyncBucketStorageOptions);
|
|
53
68
|
/**
|
|
54
69
|
* Not for external use - public here for tests only.
|
|
@@ -57,22 +72,22 @@ export declare abstract class MongoSyncBucketStorage extends BaseObserver<storag
|
|
|
57
72
|
*/
|
|
58
73
|
abstract createMongoCompactor(options: MongoCompactOptions): MongoCompactor;
|
|
59
74
|
protected abstract createMongoChecksums(options: MongoSyncBucketStorageOptions): MongoChecksums;
|
|
75
|
+
protected createWriteCheckpointAPI(options: MongoCheckpointAPIOptions): MongoWriteCheckpointAPI;
|
|
60
76
|
protected abstract createMongoParameterCompactor(checkpoint: InternalOpId, options: storage.CompactOptions): MongoParameterCompactor;
|
|
77
|
+
/** MongoDB parameter compaction uses a persisted operation-id cursor. */
|
|
78
|
+
supportsIncrementalParameterCompaction(): boolean;
|
|
61
79
|
get writeCheckpointMode(): storage.WriteCheckpointMode;
|
|
62
80
|
/**
|
|
63
81
|
* Persisted storage ids of all sync configs in this replication stream. Parse-free.
|
|
64
82
|
*/
|
|
65
83
|
get storageIds(): ReplicationStreamStorageIds;
|
|
66
|
-
setWriteCheckpointMode(
|
|
84
|
+
setWriteCheckpointMode(config: storage.WriteCheckpointModeConfig): void;
|
|
67
85
|
createManagedWriteCheckpoints(checkpoints: storage.ManagedWriteCheckpointOptions[]): Promise<storage.CreateManagedWriteCheckpointsResult>;
|
|
68
86
|
lastWriteCheckpoint(filters: storage.SyncStorageLastWriteCheckpointFilters): Promise<bigint | null>;
|
|
69
87
|
getParsedSyncConfigSet(options: storage.ParseSyncConfigOptions): MongoParsedSyncConfigSet;
|
|
70
88
|
getParsedSyncRules(options: storage.ParseSyncConfigOptions): HydratedSyncConfig;
|
|
71
89
|
getCheckpoint(): Promise<storage.ReplicationCheckpoint>;
|
|
72
|
-
protected abstract fetchCheckpointState(session: mongo.ClientSession): Promise<
|
|
73
|
-
checkpoint: bigint;
|
|
74
|
-
lsn: string | null;
|
|
75
|
-
} | null>;
|
|
90
|
+
protected abstract fetchCheckpointState(session: mongo.ClientSession): Promise<MongoCheckpointState | null>;
|
|
76
91
|
getCheckpointInternal(): Promise<storage.ReplicationCheckpoint | null>;
|
|
77
92
|
protected abstract initializeVersionStorage(): Promise<void>;
|
|
78
93
|
private initializeStorage;
|
|
@@ -86,6 +101,7 @@ export declare abstract class MongoSyncBucketStorage extends BaseObserver<storag
|
|
|
86
101
|
* The version-independent part of the batch options.
|
|
87
102
|
*/
|
|
88
103
|
protected writerBatchOptions(options: storage.CreateWriterOptions): Omit<MongoBucketBatchOptions, 'resumeFromLsn'>;
|
|
104
|
+
private requireReplicationLock;
|
|
89
105
|
createWriter(options: storage.CreateWriterOptions): Promise<storage.BucketStorageBatch>;
|
|
90
106
|
startBatch(options: storage.CreateWriterOptions, callback: (batch: storage.BucketStorageBatch) => Promise<void>): Promise<storage.FlushedResult | null>;
|
|
91
107
|
protected abstract getParameterSetsImpl(checkpoint: MongoReplicationCheckpoint, lookups: ScopedParameterLookup[], limit: number): Promise<ParameterLookupRows[]>;
|
|
@@ -103,18 +119,19 @@ export declare abstract class MongoSyncBucketStorage extends BaseObserver<storag
|
|
|
103
119
|
protected abstract clearSourceRecords(signal?: AbortSignal): Promise<void>;
|
|
104
120
|
protected abstract clearBucketState(signal?: AbortSignal): Promise<void>;
|
|
105
121
|
protected abstract clearSourceTables(signal?: AbortSignal): Promise<void>;
|
|
122
|
+
protected clearCustomCheckpointRequests(_signal?: AbortSignal): Promise<void>;
|
|
106
123
|
protected abstract clearSyncRuleState(): Promise<void>;
|
|
107
124
|
clear(options?: storage.ClearStorageOptions): Promise<void>;
|
|
108
125
|
reportError(e: any): Promise<void>;
|
|
109
126
|
compact(options?: storage.CompactOptions): Promise<void>;
|
|
127
|
+
abstract compactInitialReplication(options: CompactInitialReplicationOptions): Promise<CompactInitialReplicationResults>;
|
|
110
128
|
/**
|
|
111
129
|
* The highest op id persisted for this stream, whether or not covered by a checkpoint.
|
|
112
130
|
*
|
|
113
|
-
* Used as the default `maxOpId` for {@link
|
|
131
|
+
* Used as the default `maxOpId` for {@link compactInitialReplication}, which runs after
|
|
114
132
|
* initial replication but before the first checkpoint exists.
|
|
115
133
|
*/
|
|
116
134
|
protected abstract fetchPersistedOpHead(): Promise<InternalOpId | null>;
|
|
117
|
-
populatePersistentChecksumCache(options: PopulateChecksumCacheOptions): Promise<PopulateChecksumCacheResults>;
|
|
118
135
|
private watchActiveCheckpoint;
|
|
119
136
|
private readonly sharedIter;
|
|
120
137
|
watchCheckpointChanges(options: WatchWriteCheckpointOptions): AsyncIterable<storage.StorageCheckpointUpdate>;
|
|
@@ -122,19 +139,23 @@ export declare abstract class MongoSyncBucketStorage extends BaseObserver<storag
|
|
|
122
139
|
private checkpointTimeoutStream;
|
|
123
140
|
protected abstract getDataBucketChangesImpl(options: GetCheckpointChangesOptions): Promise<Pick<CheckpointChanges, 'updatedDataBuckets' | 'invalidateDataBuckets'>>;
|
|
124
141
|
private getDataBucketChanges;
|
|
125
|
-
protected abstract getParameterBucketChangesImpl(options:
|
|
142
|
+
protected abstract getParameterBucketChangesImpl(options: MongoGetCheckpointChangesOptions): Promise<Pick<CheckpointChanges, 'updatedParameterLookups' | 'invalidateParameterBuckets'>>;
|
|
126
143
|
private getParameterBucketChanges;
|
|
127
144
|
private checkpointChangesCache;
|
|
128
145
|
getCheckpointChanges(options: GetCheckpointChangesOptions): Promise<InternalCheckpointChanges>;
|
|
129
146
|
private getCheckpointChangesInternal;
|
|
130
147
|
}
|
|
131
|
-
declare class MongoReplicationCheckpoint implements
|
|
148
|
+
declare class MongoReplicationCheckpoint implements MongoSyncBucketStorageCheckpoint {
|
|
132
149
|
#private;
|
|
133
150
|
readonly checkpoint: InternalOpId;
|
|
134
151
|
readonly lsn: string | null;
|
|
135
152
|
snapshotTime: mongo.Timestamp;
|
|
136
153
|
clusterTime: mongo.ClusterTime;
|
|
137
|
-
|
|
154
|
+
/** Captured in the same snapshot as the checkpoint. */
|
|
155
|
+
readonly parameterChangesInvalidBefore: InternalOpId;
|
|
156
|
+
constructor(storage: MongoSyncBucketStorage, checkpoint: InternalOpId, lsn: string | null, snapshotTime: mongo.Timestamp, clusterTime: mongo.ClusterTime,
|
|
157
|
+
/** Captured in the same snapshot as the checkpoint. */
|
|
158
|
+
parameterChangesInvalidBefore: InternalOpId);
|
|
138
159
|
getParameterSets(lookups: ScopedParameterLookup[], limit: number): Promise<ParameterLookupRows[]>;
|
|
139
160
|
}
|
|
140
161
|
export {};
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as lib_mongo from '@powersync/lib-service-mongodb';
|
|
2
|
-
import { BaseObserver, DO_NOT_LOG, ReplicationAbortedError, ServiceAssertionError } from '@powersync/lib-services-framework';
|
|
3
|
-
import { BroadcastIterable, CHECKPOINT_INVALIDATE_ALL, mergeAsyncIterables, storage } from '@powersync/service-core';
|
|
2
|
+
import { BaseObserver, logger as defaultLogger, DO_NOT_LOG, ReplicationAbortedError, ServiceAssertionError } from '@powersync/lib-services-framework';
|
|
3
|
+
import { BroadcastIterable, CHECKPOINT_INVALIDATE_ALL, mergeAsyncIterables, storage, SyncRuleState } from '@powersync/service-core';
|
|
4
4
|
import { LRUCache } from 'lru-cache';
|
|
5
5
|
import * as timers from 'timers/promises';
|
|
6
6
|
import { DEFAULT_CLEAR_BATCH_THROTTLE_RATE } from '../../types/types.js';
|
|
@@ -40,12 +40,17 @@ export class MongoSyncBucketStorage extends BaseObserver {
|
|
|
40
40
|
readPreference;
|
|
41
41
|
clearBatchThrottleRate;
|
|
42
42
|
#storageInitialized = false;
|
|
43
|
+
/**
|
|
44
|
+
* Required for writing, optional for reading.
|
|
45
|
+
*/
|
|
46
|
+
replicationLock;
|
|
43
47
|
constructor(factory, replicationStreamId, replicationStream, replicationStreamName, writeCheckpointMode, options) {
|
|
44
48
|
super();
|
|
45
49
|
this.factory = factory;
|
|
46
50
|
this.replicationStreamId = replicationStreamId;
|
|
47
51
|
this.replicationStream = replicationStream;
|
|
48
52
|
this.replicationStreamName = replicationStreamName;
|
|
53
|
+
this.replicationLock = replicationStream.current_lock;
|
|
49
54
|
this.storageConfig = options.storageConfig;
|
|
50
55
|
this.objectStorage = options.objectStorage;
|
|
51
56
|
// Keep small chunks inline in MongoDB rather than offloading them to S3.
|
|
@@ -55,12 +60,33 @@ export class MongoSyncBucketStorage extends BaseObserver {
|
|
|
55
60
|
this.clearBatchThrottleRate = options.clearBatchThrottleRate ?? DEFAULT_CLEAR_BATCH_THROTTLE_RATE;
|
|
56
61
|
this.db = factory.db.versioned(this.storageConfig);
|
|
57
62
|
this.checksums = this.createMongoChecksums(options);
|
|
58
|
-
this.writeCheckpointAPI =
|
|
63
|
+
this.writeCheckpointAPI = this.createWriteCheckpointAPI({
|
|
59
64
|
db: this.db,
|
|
60
|
-
mode: writeCheckpointMode ?? storage.WriteCheckpointMode.MANAGED,
|
|
61
|
-
|
|
65
|
+
writeCheckpointMode: { mode: writeCheckpointMode ?? storage.WriteCheckpointMode.MANAGED },
|
|
66
|
+
replicationStreamId
|
|
62
67
|
});
|
|
63
|
-
|
|
68
|
+
// Include both replication stream name and sync config version labels in log prefix.
|
|
69
|
+
// Examples:
|
|
70
|
+
// No sync config with a label: [stream]
|
|
71
|
+
// All sync configs have a label: [stream][v5,v6]
|
|
72
|
+
// Mixed: [stream][?,v6]
|
|
73
|
+
const hasVersionLabel = replicationStream.syncConfigContent.some((config) => config.version_label != null);
|
|
74
|
+
const versionLabels = hasVersionLabel
|
|
75
|
+
? replicationStream.syncConfigContent.map((config) => config.version_label ?? '?')
|
|
76
|
+
: [];
|
|
77
|
+
this.logger =
|
|
78
|
+
versionLabels.length == 0
|
|
79
|
+
? replicationStream.logger
|
|
80
|
+
: defaultLogger.child({
|
|
81
|
+
prefix: `[${replicationStreamName}][${versionLabels.join(',')}] `
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
createWriteCheckpointAPI(options) {
|
|
85
|
+
return new MongoWriteCheckpointAPI(options);
|
|
86
|
+
}
|
|
87
|
+
/** MongoDB parameter compaction uses a persisted operation-id cursor. */
|
|
88
|
+
supportsIncrementalParameterCompaction() {
|
|
89
|
+
return true;
|
|
64
90
|
}
|
|
65
91
|
get writeCheckpointMode() {
|
|
66
92
|
return this.writeCheckpointAPI.writeCheckpointMode;
|
|
@@ -71,8 +97,8 @@ export class MongoSyncBucketStorage extends BaseObserver {
|
|
|
71
97
|
get storageIds() {
|
|
72
98
|
return this.replicationStream.storageIds;
|
|
73
99
|
}
|
|
74
|
-
setWriteCheckpointMode(
|
|
75
|
-
this.writeCheckpointAPI.setWriteCheckpointMode(
|
|
100
|
+
setWriteCheckpointMode(config) {
|
|
101
|
+
this.writeCheckpointAPI.setWriteCheckpointMode(config);
|
|
76
102
|
}
|
|
77
103
|
createManagedWriteCheckpoints(checkpoints) {
|
|
78
104
|
return this.writeCheckpointAPI.createManagedWriteCheckpoints(checkpoints);
|
|
@@ -111,7 +137,7 @@ export class MongoSyncBucketStorage extends BaseObserver {
|
|
|
111
137
|
if (clusterTime == null) {
|
|
112
138
|
throw new ServiceAssertionError('Missing clusterTime in getCheckpoint()');
|
|
113
139
|
}
|
|
114
|
-
return new MongoReplicationCheckpoint(this, state.checkpoint, state.lsn, snapshotTime, clusterTime);
|
|
140
|
+
return new MongoReplicationCheckpoint(this, state.checkpoint, state.lsn, snapshotTime, clusterTime, state.parameterChangesInvalidBefore);
|
|
115
141
|
});
|
|
116
142
|
}
|
|
117
143
|
async initializeStorage() {
|
|
@@ -126,22 +152,34 @@ export class MongoSyncBucketStorage extends BaseObserver {
|
|
|
126
152
|
* The version-independent part of the batch options.
|
|
127
153
|
*/
|
|
128
154
|
writerBatchOptions(options) {
|
|
155
|
+
const replicationLock = this.requireReplicationLock();
|
|
129
156
|
return {
|
|
130
157
|
logger: options.logger ?? this.logger,
|
|
131
158
|
db: this.db,
|
|
132
159
|
parsedSyncConfig: this.getParsedSyncConfigSet(options),
|
|
133
160
|
replicationStreamId: this.replicationStreamId,
|
|
134
161
|
replicationStreamName: this.replicationStreamName,
|
|
162
|
+
replicationLock,
|
|
163
|
+
opIdAllocator: this.factory.getOpIdAllocator(this.replicationStream, replicationLock),
|
|
135
164
|
storeCurrentData: options.storeCurrentData,
|
|
136
165
|
skipExistingRows: options.skipExistingRows ?? false,
|
|
137
166
|
markRecordUnavailable: options.markRecordUnavailable,
|
|
138
167
|
hooks: options.hooks,
|
|
139
168
|
tracer: options.tracer,
|
|
169
|
+
signal: options.signal,
|
|
140
170
|
objectStorage: this.objectStorage,
|
|
141
171
|
inlineThresholdBytes: this.inlineThresholdBytes
|
|
142
172
|
};
|
|
143
173
|
}
|
|
174
|
+
requireReplicationLock() {
|
|
175
|
+
if (this.replicationLock == null) {
|
|
176
|
+
throw new ServiceAssertionError('A replication lease is required to create a writer');
|
|
177
|
+
}
|
|
178
|
+
this.replicationLock.throwIfAborted();
|
|
179
|
+
return this.replicationLock;
|
|
180
|
+
}
|
|
144
181
|
async createWriter(options) {
|
|
182
|
+
this.requireReplicationLock();
|
|
145
183
|
await this.initializeStorage();
|
|
146
184
|
const writer = await this.createWriterImpl(options);
|
|
147
185
|
this.iterateListeners((cb) => cb.batchStarted?.(writer));
|
|
@@ -181,17 +219,20 @@ export class MongoSyncBucketStorage extends BaseObserver {
|
|
|
181
219
|
async getStatus() {
|
|
182
220
|
return this.getStatusImpl();
|
|
183
221
|
}
|
|
222
|
+
async clearCustomCheckpointRequests(_signal) { }
|
|
184
223
|
async clear(options) {
|
|
185
224
|
const signal = options?.signal;
|
|
186
225
|
if (signal?.aborted) {
|
|
187
226
|
throw new ReplicationAbortedError('Aborted clearing data', signal.reason);
|
|
188
227
|
}
|
|
228
|
+
this.factory.discardOpIdAllocator(this.replicationStreamId);
|
|
189
229
|
await this.clearSyncRuleState();
|
|
190
230
|
await this.clearBucketData(signal);
|
|
191
231
|
await this.clearParameterIndexes(signal);
|
|
192
232
|
await this.clearSourceRecords(signal);
|
|
193
233
|
await this.clearBucketState(signal);
|
|
194
234
|
await this.clearSourceTables(signal);
|
|
235
|
+
await this.clearCustomCheckpointRequests(signal);
|
|
195
236
|
this.#storageInitialized = false;
|
|
196
237
|
}
|
|
197
238
|
async reportError(e) {
|
|
@@ -208,31 +249,16 @@ export class MongoSyncBucketStorage extends BaseObserver {
|
|
|
208
249
|
async compact(options) {
|
|
209
250
|
let maxOpId = options?.maxOpId;
|
|
210
251
|
if (maxOpId == null) {
|
|
252
|
+
// For PROCESSING streams, this will be undefined.
|
|
211
253
|
const checkpoint = await this.getCheckpointInternal();
|
|
212
254
|
maxOpId = checkpoint?.checkpoint ?? undefined;
|
|
213
255
|
}
|
|
214
256
|
await this.createMongoCompactor({ ...options, maxOpId, logger: this.logger }).compact();
|
|
215
|
-
if (maxOpId != null && options?.compactParameterData) {
|
|
216
|
-
|
|
257
|
+
if (maxOpId != null && options?.compactParameterData && this.replicationStream.state == SyncRuleState.ACTIVE) {
|
|
258
|
+
// Use the stream-scoped logger, matching bucket compaction above.
|
|
259
|
+
await this.createMongoParameterCompactor(maxOpId, { ...options, logger: this.logger }).compact();
|
|
217
260
|
}
|
|
218
261
|
}
|
|
219
|
-
async populatePersistentChecksumCache(options) {
|
|
220
|
-
this.logger.info(`Populating persistent checksum cache...`);
|
|
221
|
-
const start = Date.now();
|
|
222
|
-
const maxOpId = options.maxOpId ?? (await this.fetchPersistedOpHead()) ?? undefined;
|
|
223
|
-
const compactor = this.createMongoCompactor({
|
|
224
|
-
...options,
|
|
225
|
-
maxOpId,
|
|
226
|
-
memoryLimitMB: 0,
|
|
227
|
-
logger: this.logger
|
|
228
|
-
});
|
|
229
|
-
const result = await compactor.populateChecksums({
|
|
230
|
-
minBucketChanges: options.minBucketChanges ?? 10
|
|
231
|
-
});
|
|
232
|
-
const duration = Date.now() - start;
|
|
233
|
-
this.logger.info(`Populated persistent checksum cache in ${(duration / 1000).toFixed(1)}s`);
|
|
234
|
-
return result;
|
|
235
|
-
}
|
|
236
262
|
async *watchActiveCheckpoint(signal) {
|
|
237
263
|
if (signal.aborted) {
|
|
238
264
|
return;
|
|
@@ -376,7 +402,25 @@ export class MongoSyncBucketStorage extends BaseObserver {
|
|
|
376
402
|
return this.getDataBucketChangesImpl(options);
|
|
377
403
|
}
|
|
378
404
|
async getParameterBucketChanges(options) {
|
|
379
|
-
|
|
405
|
+
const nextCheckpoint = requireMongoCheckpoint(options.nextCheckpoint);
|
|
406
|
+
if (options.lastCheckpoint.checkpoint < nextCheckpoint.parameterChangesInvalidBefore) {
|
|
407
|
+
// Parameter compaction may have deleted parameter entries in the range we'd have to query
|
|
408
|
+
// to find the individual changed lookups. Invalidate all parameter buckets instead.
|
|
409
|
+
//
|
|
410
|
+
// The fence is committed before the first delete of a compaction pass, and captured in the
|
|
411
|
+
// same snapshot as the checkpoint, so a checkpoint that could miss a deleted entry always
|
|
412
|
+
// observes the fence as well.
|
|
413
|
+
return {
|
|
414
|
+
invalidateParameterBuckets: true,
|
|
415
|
+
updatedParameterLookups: new Set()
|
|
416
|
+
};
|
|
417
|
+
}
|
|
418
|
+
// The query below runs at the checkpoint snapshot, which still sees entries deleted by a
|
|
419
|
+
// compaction pass that started after the snapshot.
|
|
420
|
+
return this.getParameterBucketChangesImpl({
|
|
421
|
+
lastCheckpoint: options.lastCheckpoint,
|
|
422
|
+
nextCheckpoint
|
|
423
|
+
});
|
|
380
424
|
}
|
|
381
425
|
checkpointChangesCache = new LRUCache({
|
|
382
426
|
max: 50,
|
|
@@ -395,7 +439,10 @@ export class MongoSyncBucketStorage extends BaseObserver {
|
|
|
395
439
|
}
|
|
396
440
|
});
|
|
397
441
|
async getCheckpointChanges(options) {
|
|
398
|
-
|
|
442
|
+
// The invalidation fence is part of the identity: the same checkpoint pair read before and
|
|
443
|
+
// after a compaction pass produces different results (specific lookups vs. invalidate-all).
|
|
444
|
+
const fence = requireMongoCheckpoint(options.nextCheckpoint).parameterChangesInvalidBefore;
|
|
445
|
+
const key = `${options.lastCheckpoint.checkpoint}_${options.lastCheckpoint.lsn}__${options.nextCheckpoint.checkpoint}_${options.nextCheckpoint.lsn}_${fence}`;
|
|
399
446
|
const result = await this.checkpointChangesCache.fetch(key, { context: { options } });
|
|
400
447
|
return result;
|
|
401
448
|
}
|
|
@@ -410,23 +457,40 @@ export class MongoSyncBucketStorage extends BaseObserver {
|
|
|
410
457
|
};
|
|
411
458
|
}
|
|
412
459
|
}
|
|
460
|
+
/**
|
|
461
|
+
* We don't support any other constructions of ReplicationCheckpoint.
|
|
462
|
+
*/
|
|
463
|
+
function requireMongoCheckpoint(checkpoint) {
|
|
464
|
+
if (!(checkpoint instanceof MongoReplicationCheckpoint)) {
|
|
465
|
+
throw new ServiceAssertionError(`Checkpoint changes require a checkpoint from getCheckpointInternal(), got ${checkpoint.constructor.name}`);
|
|
466
|
+
}
|
|
467
|
+
return checkpoint;
|
|
468
|
+
}
|
|
413
469
|
class MongoReplicationCheckpoint {
|
|
414
470
|
checkpoint;
|
|
415
471
|
lsn;
|
|
416
472
|
snapshotTime;
|
|
417
473
|
clusterTime;
|
|
474
|
+
parameterChangesInvalidBefore;
|
|
418
475
|
#storage;
|
|
419
|
-
constructor(storage, checkpoint, lsn, snapshotTime, clusterTime
|
|
476
|
+
constructor(storage, checkpoint, lsn, snapshotTime, clusterTime,
|
|
477
|
+
/** Captured in the same snapshot as the checkpoint. */
|
|
478
|
+
parameterChangesInvalidBefore) {
|
|
420
479
|
this.checkpoint = checkpoint;
|
|
421
480
|
this.lsn = lsn;
|
|
422
481
|
this.snapshotTime = snapshotTime;
|
|
423
482
|
this.clusterTime = clusterTime;
|
|
483
|
+
this.parameterChangesInvalidBefore = parameterChangesInvalidBefore;
|
|
424
484
|
this.#storage = storage;
|
|
425
485
|
}
|
|
426
486
|
async getParameterSets(lookups, limit) {
|
|
427
487
|
return this.#storage.getParameterSets(this, lookups, limit);
|
|
428
488
|
}
|
|
429
489
|
}
|
|
490
|
+
/**
|
|
491
|
+
* Used when no checkpoint has been persisted yet. This has no snapshot or invalidation fence, so
|
|
492
|
+
* it cannot be used for checkpoint change detection - see {@link requireMongoCheckpoint}.
|
|
493
|
+
*/
|
|
430
494
|
class EmptyReplicationCheckpoint {
|
|
431
495
|
checkpoint = 0n;
|
|
432
496
|
lsn = null;
|