@powersync/service-module-mongodb-storage 0.18.3 → 0.20.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 +53 -0
- 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 +5 -1
- package/dist/storage/MongoBucketStorage.js +5 -1
- package/dist/storage/MongoBucketStorage.js.map +1 -1
- package/dist/storage/implementation/MongoBucketBatch.d.ts +3 -0
- package/dist/storage/implementation/MongoBucketBatch.js.map +1 -1
- package/dist/storage/implementation/MongoCompactor.d.ts +15 -19
- package/dist/storage/implementation/MongoCompactor.js +68 -260
- package/dist/storage/implementation/MongoCompactor.js.map +1 -1
- package/dist/storage/implementation/MongoStorageProvider.js +26 -3
- package/dist/storage/implementation/MongoStorageProvider.js.map +1 -1
- package/dist/storage/implementation/MongoSyncBucketStorage.d.ts +10 -4
- package/dist/storage/implementation/MongoSyncBucketStorage.js +13 -12
- package/dist/storage/implementation/MongoSyncBucketStorage.js.map +1 -1
- package/dist/storage/implementation/MongoWriteCheckpointAPI.d.ts +2 -1
- package/dist/storage/implementation/MongoWriteCheckpointAPI.js +146 -34
- package/dist/storage/implementation/MongoWriteCheckpointAPI.js.map +1 -1
- package/dist/storage/implementation/common/PersistedBatch.d.ts +6 -0
- package/dist/storage/implementation/common/PersistedBatch.js +15 -8
- package/dist/storage/implementation/common/PersistedBatch.js.map +1 -1
- package/dist/storage/implementation/models.d.ts +20 -0
- package/dist/storage/implementation/models.js.map +1 -1
- package/dist/storage/implementation/v1/MongoBucketBatchV1.d.ts +4 -0
- package/dist/storage/implementation/v1/MongoBucketBatchV1.js +58 -84
- package/dist/storage/implementation/v1/MongoBucketBatchV1.js.map +1 -1
- package/dist/storage/implementation/v1/MongoCompactorV1.d.ts +11 -2
- package/dist/storage/implementation/v1/MongoCompactorV1.js +250 -1
- package/dist/storage/implementation/v1/MongoCompactorV1.js.map +1 -1
- package/dist/storage/implementation/v1/MongoSyncBucketStorageV1.js +19 -11
- 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/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/MongoBucketBatchV3.js +35 -23
- package/dist/storage/implementation/v3/MongoBucketBatchV3.js.map +1 -1
- package/dist/storage/implementation/v3/MongoChecksumsV3.d.ts +1 -0
- package/dist/storage/implementation/v3/MongoChecksumsV3.js +59 -103
- package/dist/storage/implementation/v3/MongoChecksumsV3.js.map +1 -1
- package/dist/storage/implementation/v3/MongoCompactorV3.d.ts +23 -2
- package/dist/storage/implementation/v3/MongoCompactorV3.js +354 -219
- package/dist/storage/implementation/v3/MongoCompactorV3.js.map +1 -1
- package/dist/storage/implementation/v3/MongoStoppedSyncConfigCleanup.d.ts +5 -0
- package/dist/storage/implementation/v3/MongoStoppedSyncConfigCleanup.js +12 -11
- package/dist/storage/implementation/v3/MongoStoppedSyncConfigCleanup.js.map +1 -1
- package/dist/storage/implementation/v3/MongoSyncBucketStorageV3.d.ts +5 -3
- package/dist/storage/implementation/v3/MongoSyncBucketStorageV3.js +108 -106
- package/dist/storage/implementation/v3/MongoSyncBucketStorageV3.js.map +1 -1
- package/dist/storage/implementation/v3/PersistedBatchV3.d.ts +5 -2
- package/dist/storage/implementation/v3/PersistedBatchV3.js +53 -15
- package/dist/storage/implementation/v3/PersistedBatchV3.js.map +1 -1
- package/dist/storage/implementation/v3/VersionedPowerSyncMongoV3.d.ts +2 -1
- package/dist/storage/implementation/v3/VersionedPowerSyncMongoV3.js +3 -0
- package/dist/storage/implementation/v3/VersionedPowerSyncMongoV3.js.map +1 -1
- package/dist/storage/implementation/v3/bucket-format.d.ts +10 -1
- package/dist/storage/implementation/v3/bucket-format.js +28 -9
- package/dist/storage/implementation/v3/bucket-format.js.map +1 -1
- package/dist/storage/implementation/v3/chunking.js +3 -1
- package/dist/storage/implementation/v3/chunking.js.map +1 -1
- package/dist/storage/implementation/v3/models.d.ts +43 -2
- package/dist/storage/implementation/v3/models.js.map +1 -1
- package/dist/storage/implementation/v3/object-storage/BucketDataObjectStorage.d.ts +21 -0
- package/dist/storage/implementation/v3/object-storage/BucketDataObjectStorage.js +44 -0
- package/dist/storage/implementation/v3/object-storage/BucketDataObjectStorage.js.map +1 -0
- package/dist/storage/implementation/v3/object-storage/ObjectStorage.d.ts +30 -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 +70 -0
- package/dist/storage/implementation/v3/object-storage/ObjectStorageLifecycle.js +146 -0
- package/dist/storage/implementation/v3/object-storage/ObjectStorageLifecycle.js.map +1 -0
- package/dist/storage/implementation/v3/object-storage/S3ObjectStorage.d.ts +42 -0
- package/dist/storage/implementation/v3/object-storage/S3ObjectStorage.js +285 -0
- package/dist/storage/implementation/v3/object-storage/S3ObjectStorage.js.map +1 -0
- package/dist/storage/implementation/v3/source-table-utils.d.ts +9 -1
- package/dist/storage/implementation/v3/source-table-utils.js +20 -21
- package/dist/storage/implementation/v3/source-table-utils.js.map +1 -1
- package/dist/types/types.d.ts +35 -0
- package/dist/types/types.js +35 -1
- package/dist/types/types.js.map +1 -1
- package/dist/utils/test-utils.js +3 -1
- package/dist/utils/test-utils.js.map +1 -1
- package/dist/utils/util.d.ts +8 -1
- package/dist/utils/util.js +125 -2
- package/dist/utils/util.js.map +1 -1
- package/package.json +10 -7
- package/src/migrations/db/migrations/1782950400000-checkpoint-requested-at-index.ts +55 -0
- package/src/storage/MongoBucketStorage.ts +10 -2
- package/src/storage/implementation/MongoBucketBatch.ts +4 -0
- package/src/storage/implementation/MongoCompactor.ts +90 -314
- package/src/storage/implementation/MongoStorageProvider.ts +32 -3
- package/src/storage/implementation/MongoSyncBucketStorage.ts +23 -22
- package/src/storage/implementation/MongoWriteCheckpointAPI.ts +164 -37
- package/src/storage/implementation/common/PersistedBatch.ts +22 -10
- package/src/storage/implementation/models.ts +20 -0
- package/src/storage/implementation/v1/MongoBucketBatchV1.ts +76 -96
- package/src/storage/implementation/v1/MongoCompactorV1.ts +292 -8
- package/src/storage/implementation/v1/MongoSyncBucketStorageV1.ts +53 -40
- package/src/storage/implementation/v1/SingleBucketStoreV1.ts +18 -27
- package/src/storage/implementation/v3/BucketDataContextV3.ts +32 -0
- package/src/storage/implementation/v3/MongoBucketBatchV3.ts +40 -23
- package/src/storage/implementation/v3/MongoChecksumsV3.ts +75 -105
- package/src/storage/implementation/v3/MongoCompactorV3.ts +456 -258
- package/src/storage/implementation/v3/MongoStoppedSyncConfigCleanup.ts +21 -19
- package/src/storage/implementation/v3/MongoSyncBucketStorageV3.ts +122 -126
- package/src/storage/implementation/v3/PersistedBatchV3.ts +69 -16
- package/src/storage/implementation/v3/VersionedPowerSyncMongoV3.ts +5 -0
- package/src/storage/implementation/v3/bucket-format.ts +36 -9
- package/src/storage/implementation/v3/chunking.ts +3 -1
- package/src/storage/implementation/v3/models.ts +45 -1
- package/src/storage/implementation/v3/object-storage/BucketDataObjectStorage.ts +54 -0
- package/src/storage/implementation/v3/object-storage/ObjectStorage.ts +29 -0
- package/src/storage/implementation/v3/object-storage/ObjectStorageLifecycle.ts +171 -0
- package/src/storage/implementation/v3/object-storage/S3ObjectStorage.ts +343 -0
- package/src/storage/implementation/v3/source-table-utils.ts +43 -35
- package/src/types/types.ts +42 -1
- package/src/utils/test-utils.ts +3 -1
- package/src/utils/util.ts +182 -4
- package/test/src/__snapshots__/storage_sync.test.ts.snap +1 -583
- package/test/src/cleanup-stopped-sync-configs.test.ts +24 -1
- package/test/src/helpers/MemoryObjectStorage.ts +53 -0
- package/test/src/helpers/s3TestFactory.ts +69 -0
- package/test/src/object_storage_lifecycle.test.ts +59 -0
- package/test/src/setup.ts +6 -1
- package/test/src/storage.test.ts +216 -2
- package/test/src/storage_compacting.test.ts +176 -187
- package/test/src/storage_object_storage_inline_threshold.test.ts +116 -0
- package/test/src/storage_s3_checksums.test.ts +191 -0
- package/test/src/storage_s3_compaction_lifecycle.test.ts +417 -0
- package/test/src/storage_s3_reading.test.ts +526 -0
- package/test/src/storage_s3_writing.test.ts +135 -0
- package/test/src/storage_sync.test.ts +124 -5
- package/tsconfig.tsbuildinfo +1 -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/SingleBucketStoreV3.d.ts +0 -18
- package/dist/storage/implementation/v3/SingleBucketStoreV3.js +0 -84
- package/dist/storage/implementation/v3/SingleBucketStoreV3.js.map +0 -1
- package/src/storage/implementation/common/SingleBucketStore.ts +0 -63
- package/src/storage/implementation/v3/SingleBucketStoreV3.ts +0 -108
|
@@ -45,9 +45,8 @@ class SourceTableReconciliationPlanner {
|
|
|
45
45
|
this.context = context;
|
|
46
46
|
}
|
|
47
47
|
plan(candidateDocs) {
|
|
48
|
-
const { identity } = this.context;
|
|
49
48
|
for (const doc of candidateDocs) {
|
|
50
|
-
if (
|
|
49
|
+
if (this.isCompatible(doc)) {
|
|
51
50
|
this.retainDoc(doc);
|
|
52
51
|
}
|
|
53
52
|
}
|
|
@@ -55,11 +54,16 @@ class SourceTableReconciliationPlanner {
|
|
|
55
54
|
tables: this.tables,
|
|
56
55
|
narrowingUpdates: this.narrowingUpdates,
|
|
57
56
|
newTableMemberships: this.newTableMemberships(),
|
|
58
|
-
//
|
|
59
|
-
|
|
60
|
-
dropDocs: candidateDocs.filter((doc) => !this.retainedDocIds.has(doc._id.toHexString()) && !matchingSourceTableIdentity(doc, identity))
|
|
57
|
+
// Compatible records remain available for reuse even when not needed by this config.
|
|
58
|
+
dropDocs: candidateDocs.filter((doc) => !this.isCompatible(doc))
|
|
61
59
|
};
|
|
62
60
|
}
|
|
61
|
+
isCompatible(doc) {
|
|
62
|
+
return this.compatibleTableFor(doc) != null;
|
|
63
|
+
}
|
|
64
|
+
compatibleTableFor(doc) {
|
|
65
|
+
return this.context.sourceCompatibleTables.find((table) => storage.sourceTableIdEquals(table.id, doc._id));
|
|
66
|
+
}
|
|
63
67
|
retainDoc(doc) {
|
|
64
68
|
const memberships = intersectMembershipIds(doc, this.context.desired);
|
|
65
69
|
const coversDesiredMembership = hasMembershipIds(memberships);
|
|
@@ -116,22 +120,14 @@ class SourceTableReconciliationPlanner {
|
|
|
116
120
|
}
|
|
117
121
|
sourceTableFor(doc, memberships) {
|
|
118
122
|
const { connectionTag, syncConfig, mapping, desired, storeCurrentData } = this.context;
|
|
119
|
-
const
|
|
123
|
+
const built = sourceTableFromDocument(doc, connectionTag, syncConfig, mapping, matchingSourcesFor(desired, memberships), memberships);
|
|
124
|
+
// Use any metadata update returned by the reconciler.
|
|
125
|
+
const resolved = this.compatibleTableFor(doc);
|
|
126
|
+
const table = resolved == null ? built : built.withSourceMetadata(resolved.sourceMetadata);
|
|
120
127
|
table.storeCurrentData = storeCurrentData;
|
|
121
128
|
return table;
|
|
122
129
|
}
|
|
123
130
|
}
|
|
124
|
-
function sameReplicaIdColumns(left, right) {
|
|
125
|
-
return (left != null &&
|
|
126
|
-
left.length == right.length &&
|
|
127
|
-
left.every((column, index) => column.name == right[index].name && column.type == right[index].type && column.type_oid == right[index].type_oid));
|
|
128
|
-
}
|
|
129
|
-
function matchingSourceTableIdentity(doc, identity) {
|
|
130
|
-
return (doc.schema_name == identity.schema &&
|
|
131
|
-
doc.table_name == identity.name &&
|
|
132
|
-
(identity.objectId == null || doc.relation_id == identity.objectId) &&
|
|
133
|
-
sameReplicaIdColumns(doc.replica_id_columns, identity.replicaIdColumns));
|
|
134
|
-
}
|
|
135
131
|
export function overlappingSourceTableFilter(connectionId, identity) {
|
|
136
132
|
const clauses = [{ schema_name: identity.schema, table_name: identity.name }];
|
|
137
133
|
if (identity.objectId != null) {
|
|
@@ -143,7 +139,7 @@ export function overlappingSourceTableFilter(connectionId, identity) {
|
|
|
143
139
|
};
|
|
144
140
|
}
|
|
145
141
|
export function createNewSourceTable(id, memberships, context) {
|
|
146
|
-
const { connectionId, connectionTag, identity, syncConfig, mapping, desired, storeCurrentData } = context;
|
|
142
|
+
const { connectionId, connectionTag, identity, syncConfig, mapping, desired, storeCurrentData, newTableSourceMetadata } = context;
|
|
147
143
|
const doc = {
|
|
148
144
|
_id: id,
|
|
149
145
|
connection_id: connectionId,
|
|
@@ -154,7 +150,9 @@ export function createNewSourceTable(id, memberships, context) {
|
|
|
154
150
|
snapshot_done: false,
|
|
155
151
|
snapshot_status: undefined,
|
|
156
152
|
bucket_data_source_ids: memberships.bucketDataSourceIds,
|
|
157
|
-
parameter_lookup_source_ids: memberships.parameterLookupSourceIds
|
|
153
|
+
parameter_lookup_source_ids: memberships.parameterLookupSourceIds,
|
|
154
|
+
// Records created together share the same source metadata.
|
|
155
|
+
source_metadata: newTableSourceMetadata
|
|
158
156
|
};
|
|
159
157
|
const table = sourceTableFromDocument(doc, connectionTag, syncConfig, mapping, matchingSourcesFor(desired, memberships), memberships);
|
|
160
158
|
table.storeCurrentData = storeCurrentData;
|
|
@@ -191,12 +189,13 @@ export function sourceTableFromDocument(doc, connectionTag, syncConfig, mapping,
|
|
|
191
189
|
name: doc.table_name
|
|
192
190
|
},
|
|
193
191
|
objectId: doc.relation_id,
|
|
194
|
-
replicaIdColumns: doc.replica_id_columns
|
|
192
|
+
replicaIdColumns: doc.replica_id_columns?.map((column) => ({ name: column.name, typeId: column.type_oid, type: column.type })) ?? [],
|
|
195
193
|
snapshotComplete: doc.snapshot_done,
|
|
196
194
|
bucketDataSources: resolvedMemberships.bucketDataSources,
|
|
197
195
|
parameterLookupSources: resolvedMemberships.parameterLookupSources,
|
|
198
196
|
bucketDataSourceIds: new Set(resolvedMembershipIds.bucketDataSourceIds),
|
|
199
|
-
parameterLookupSourceIds: new Set(resolvedMembershipIds.parameterLookupSourceIds)
|
|
197
|
+
parameterLookupSourceIds: new Set(resolvedMembershipIds.parameterLookupSourceIds),
|
|
198
|
+
sourceMetadata: doc.source_metadata ?? null
|
|
200
199
|
});
|
|
201
200
|
table.syncData = table.bucketDataSources.length > 0;
|
|
202
201
|
table.syncParameters = table.parameterLookupSources.length > 0;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"source-table-utils.js","sourceRoot":"","sources":["../../../../src/storage/implementation/v3/source-table-utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,MAAM,mCAAmC,CAAC;AAC9E,OAAO,
|
|
1
|
+
{"version":3,"file":"source-table-utils.js","sourceRoot":"","sources":["../../../../src/storage/implementation/v3/source-table-utils.ts"],"names":[],"mappings":"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"}
|
package/dist/types/types.d.ts
CHANGED
|
@@ -25,7 +25,42 @@ export declare const MongoStorageConfig: t.Intersection<t.Codec<{
|
|
|
25
25
|
* This is an experimental option, and may be removed in a future release.
|
|
26
26
|
*/
|
|
27
27
|
bulk_read_preference: t.OptionalCodec<t.Codec<"primary" | "primaryPreferred" | "secondary" | "secondaryPreferred" | "nearest", "primary" | "primaryPreferred" | "secondary" | "secondaryPreferred" | "nearest", string, t.CodecProps>>;
|
|
28
|
+
/**
|
|
29
|
+
* Throttle clear operations after sync config deploys, by pausing between batches.
|
|
30
|
+
* The rate produces a pause proportional to the previous batch duration.
|
|
31
|
+
*
|
|
32
|
+
* Increase this to reduce impact of clear operations on the storage cluster.
|
|
33
|
+
* Use 0 to clear as fast as possible.
|
|
34
|
+
*
|
|
35
|
+
* Defaults to 0.2.
|
|
36
|
+
*/
|
|
37
|
+
clear_batch_throttle_rate: t.OptionalCodec<t.Codec<number, number, string, t.CodecProps>>;
|
|
38
|
+
object_storage: t.OptionalCodec<t.Codec<{
|
|
39
|
+
type: "s3";
|
|
40
|
+
bucket: string;
|
|
41
|
+
region?: string | undefined;
|
|
42
|
+
prefix?: string | undefined;
|
|
43
|
+
endpoint?: string | undefined;
|
|
44
|
+
force_path_style?: boolean | undefined;
|
|
45
|
+
access_key_id?: string | undefined;
|
|
46
|
+
secret_access_key?: string | undefined;
|
|
47
|
+
concurrency_limit?: number | undefined;
|
|
48
|
+
inline_threshold_bytes?: number | undefined;
|
|
49
|
+
}, {
|
|
50
|
+
type: "s3";
|
|
51
|
+
bucket: string;
|
|
52
|
+
region?: string | undefined;
|
|
53
|
+
prefix?: string | undefined;
|
|
54
|
+
endpoint?: string | undefined;
|
|
55
|
+
force_path_style?: boolean | undefined;
|
|
56
|
+
access_key_id?: string | undefined;
|
|
57
|
+
secret_access_key?: string | undefined;
|
|
58
|
+
concurrency_limit?: number | undefined;
|
|
59
|
+
inline_threshold_bytes?: number | undefined;
|
|
60
|
+
}, string, t.CodecProps>>;
|
|
28
61
|
}>>;
|
|
29
62
|
export type MongoStorageConfig = t.Encoded<typeof MongoStorageConfig>;
|
|
30
63
|
export type MongoStorageConfigDecoded = t.Decoded<typeof MongoStorageConfig>;
|
|
64
|
+
export declare const DEFAULT_CLEAR_BATCH_THROTTLE_RATE = 0.2;
|
|
65
|
+
export declare function normalizeClearBatchThrottleRate(value: number | undefined): number;
|
|
31
66
|
export declare function isMongoStorageConfig(config: service_types.configFile.GenericStorageConfig): config is MongoStorageConfig;
|
package/dist/types/types.js
CHANGED
|
@@ -1,5 +1,20 @@
|
|
|
1
1
|
import * as lib_mongo from '@powersync/lib-service-mongodb';
|
|
2
|
+
import { ErrorCode, ServiceError } from '@powersync/lib-services-framework';
|
|
2
3
|
import * as t from 'ts-codec';
|
|
4
|
+
const S3ObjectStorageConfig = t.object({
|
|
5
|
+
type: t.literal('s3'),
|
|
6
|
+
bucket: t.string,
|
|
7
|
+
region: t.string.optional(),
|
|
8
|
+
prefix: t.string.optional(),
|
|
9
|
+
endpoint: t.string.optional(),
|
|
10
|
+
force_path_style: t.boolean.optional(),
|
|
11
|
+
access_key_id: t.string.optional(),
|
|
12
|
+
secret_access_key: t.string.optional(),
|
|
13
|
+
concurrency_limit: t.number.optional(),
|
|
14
|
+
// Chunks whose BSON-serialized size falls below this byte threshold
|
|
15
|
+
// stay inline in MongoDB instead of being offloaded to S3. Default 1024.
|
|
16
|
+
inline_threshold_bytes: t.number.optional()
|
|
17
|
+
});
|
|
3
18
|
export const MongoStorageReadPreference = t
|
|
4
19
|
.literal('primary')
|
|
5
20
|
.or(t.literal('primaryPreferred'))
|
|
@@ -14,8 +29,27 @@ export const MongoStorageConfig = lib_mongo.BaseMongoConfig.and(t.object({
|
|
|
14
29
|
*
|
|
15
30
|
* This is an experimental option, and may be removed in a future release.
|
|
16
31
|
*/
|
|
17
|
-
bulk_read_preference: MongoStorageReadPreference.optional()
|
|
32
|
+
bulk_read_preference: MongoStorageReadPreference.optional(),
|
|
33
|
+
/**
|
|
34
|
+
* Throttle clear operations after sync config deploys, by pausing between batches.
|
|
35
|
+
* The rate produces a pause proportional to the previous batch duration.
|
|
36
|
+
*
|
|
37
|
+
* Increase this to reduce impact of clear operations on the storage cluster.
|
|
38
|
+
* Use 0 to clear as fast as possible.
|
|
39
|
+
*
|
|
40
|
+
* Defaults to 0.2.
|
|
41
|
+
*/
|
|
42
|
+
clear_batch_throttle_rate: t.number.optional(),
|
|
43
|
+
object_storage: S3ObjectStorageConfig.optional()
|
|
18
44
|
}));
|
|
45
|
+
export const DEFAULT_CLEAR_BATCH_THROTTLE_RATE = 0.2;
|
|
46
|
+
export function normalizeClearBatchThrottleRate(value) {
|
|
47
|
+
const rate = value ?? DEFAULT_CLEAR_BATCH_THROTTLE_RATE;
|
|
48
|
+
if (!Number.isFinite(rate) || rate < 0 || rate > 20) {
|
|
49
|
+
throw new ServiceError(ErrorCode.PSYNC_S3201, 'storage.clear_batch_throttle_rate must be a finite number between 0 and 20');
|
|
50
|
+
}
|
|
51
|
+
return rate;
|
|
52
|
+
}
|
|
19
53
|
export function isMongoStorageConfig(config) {
|
|
20
54
|
return config.type == lib_mongo.MONGO_CONNECTION_TYPE;
|
|
21
55
|
}
|
package/dist/types/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,SAAS,MAAM,gCAAgC,CAAC;
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,SAAS,MAAM,gCAAgC,CAAC;AAC5D,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AAE5E,OAAO,KAAK,CAAC,MAAM,UAAU,CAAC;AAE9B,MAAM,qBAAqB,GAAG,CAAC,CAAC,MAAM,CAAC;IACrC,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC;IACrB,MAAM,EAAE,CAAC,CAAC,MAAM;IAChB,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,QAAQ,EAAE;IAC3B,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,QAAQ,EAAE;IAC3B,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,QAAQ,EAAE;IAC7B,gBAAgB,EAAE,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE;IACtC,aAAa,EAAE,CAAC,CAAC,MAAM,CAAC,QAAQ,EAAE;IAClC,iBAAiB,EAAE,CAAC,CAAC,MAAM,CAAC,QAAQ,EAAE;IACtC,iBAAiB,EAAE,CAAC,CAAC,MAAM,CAAC,QAAQ,EAAE;IACtC,oEAAoE;IACpE,yEAAyE;IACzE,sBAAsB,EAAE,CAAC,CAAC,MAAM,CAAC,QAAQ,EAAE;CAC5C,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC;KACxC,OAAO,CAAC,SAAS,CAAC;KAClB,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;KACjC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;KAC1B,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC;KACnC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;AAI5B,MAAM,CAAC,MAAM,kBAAkB,GAAG,SAAS,CAAC,eAAe,CAAC,GAAG,CAC7D,CAAC,CAAC,MAAM,CAAC;IACP;;;;;;OAMG;IACH,oBAAoB,EAAE,0BAA0B,CAAC,QAAQ,EAAE;IAC3D;;;;;;;;OAQG;IACH,yBAAyB,EAAE,CAAC,CAAC,MAAM,CAAC,QAAQ,EAAE;IAE9C,cAAc,EAAE,qBAAqB,CAAC,QAAQ,EAAE;CACjD,CAAC,CACH,CAAC;AAKF,MAAM,CAAC,MAAM,iCAAiC,GAAG,GAAG,CAAC;AAErD,MAAM,UAAU,+BAA+B,CAAC,KAAyB;IACvE,MAAM,IAAI,GAAG,KAAK,IAAI,iCAAiC,CAAC;IACxD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,EAAE,EAAE,CAAC;QACpD,MAAM,IAAI,YAAY,CACpB,SAAS,CAAC,WAAW,EACrB,4EAA4E,CAC7E,CAAC;IACJ,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,MAAqD;IAErD,OAAO,MAAM,CAAC,IAAI,IAAI,SAAS,CAAC,qBAAqB,CAAC;AACxD,CAAC"}
|
package/dist/utils/test-utils.js
CHANGED
|
@@ -18,7 +18,9 @@ export function mongoTestStorageFactoryGenerator(factoryOptions) {
|
|
|
18
18
|
return new MongoBucketStorage(db, {
|
|
19
19
|
replicationStreamNamePrefix: 'test_',
|
|
20
20
|
checksumOptions: factoryOptions.checksumOptions,
|
|
21
|
-
supportsMultipleSyncConfigs: factoryOptions.supportsMultipleSyncConfigs
|
|
21
|
+
supportsMultipleSyncConfigs: factoryOptions.supportsMultipleSyncConfigs,
|
|
22
|
+
objectStorage: factoryOptions.objectStorage,
|
|
23
|
+
inlineThresholdBytes: factoryOptions.inlineThresholdBytes
|
|
22
24
|
});
|
|
23
25
|
},
|
|
24
26
|
tableIdStrings: false
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"test-utils.js","sourceRoot":"","sources":["../../src/utils/test-utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,gCAAgC,CAAC;AAEvD,OAAO,EAAE,kBAAkB,EAA6B,MAAM,kCAAkC,CAAC;AACjG,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AACtE,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAOjE,MAAM,UAAU,gCAAgC,CAAC,cAAuC;IACtF,OAAO;QACL,OAAO,EAAE,KAAK,EAAE,OAA4B,EAAE,EAAE;YAC9C,MAAM,EAAE,GAAG,oBAAoB,CAAC,cAAc,CAAC,GAAG,EAAE,cAAc,CAAC,IAAI,CAAC,CAAC;YAEzE,8EAA8E;YAC9E,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,eAAe,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,iBAAiB,CAAC,cAAc,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;gBAC5F,MAAM,EAAE,CAAC,EAAE,CAAC,gBAAgB,CAAC,mBAAmB,CAAC,CAAC;YACpD,CAAC;YAED,8EAA8E;YAC9E,MAAM,EAAE,CAAC,gCAAgC,EAAE,CAAC;YAE5C,IAAI,CAAC,OAAO,EAAE,UAAU,EAAE,CAAC;gBACzB,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC;YACnB,CAAC;YAED,OAAO,IAAI,kBAAkB,CAAC,EAAE,EAAE;gBAChC,2BAA2B,EAAE,OAAO;gBACpC,eAAe,EAAE,cAAc,CAAC,eAAe;gBAC/C,2BAA2B,EAAE,cAAc,CAAC,2BAA2B;
|
|
1
|
+
{"version":3,"file":"test-utils.js","sourceRoot":"","sources":["../../src/utils/test-utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,gCAAgC,CAAC;AAEvD,OAAO,EAAE,kBAAkB,EAA6B,MAAM,kCAAkC,CAAC;AACjG,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AACtE,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAOjE,MAAM,UAAU,gCAAgC,CAAC,cAAuC;IACtF,OAAO;QACL,OAAO,EAAE,KAAK,EAAE,OAA4B,EAAE,EAAE;YAC9C,MAAM,EAAE,GAAG,oBAAoB,CAAC,cAAc,CAAC,GAAG,EAAE,cAAc,CAAC,IAAI,CAAC,CAAC;YAEzE,8EAA8E;YAC9E,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,eAAe,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,iBAAiB,CAAC,cAAc,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;gBAC5F,MAAM,EAAE,CAAC,EAAE,CAAC,gBAAgB,CAAC,mBAAmB,CAAC,CAAC;YACpD,CAAC;YAED,8EAA8E;YAC9E,MAAM,EAAE,CAAC,gCAAgC,EAAE,CAAC;YAE5C,IAAI,CAAC,OAAO,EAAE,UAAU,EAAE,CAAC;gBACzB,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC;YACnB,CAAC;YAED,OAAO,IAAI,kBAAkB,CAAC,EAAE,EAAE;gBAChC,2BAA2B,EAAE,OAAO;gBACpC,eAAe,EAAE,cAAc,CAAC,eAAe;gBAC/C,2BAA2B,EAAE,cAAc,CAAC,2BAA2B;gBACvE,aAAa,EAAE,cAAc,CAAC,aAAa;gBAC3C,oBAAoB,EAAE,cAAc,CAAC,oBAAoB;aAC1D,CAAC,CAAC;QACL,CAAC;QACD,cAAc,EAAE,KAAK;KACtB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,sCAAsC,CAAC,cAAuC;IAC5F,OAAO,KAAK,EAAE,OAA4B,EAAE,EAAE;QAC5C,MAAM,EAAE,GAAG,oBAAoB,CAAC,cAAc,CAAC,GAAG,EAAE,cAAc,CAAC,IAAI,CAAC,CAAC;QAEzE,MAAM,EAAE,CAAC,mCAAmC,EAAE,CAAC;QAE/C,IAAI,CAAC,OAAO,EAAE,UAAU,EAAE,CAAC;YACzB,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC;QACnB,CAAC;QAED,OAAO,IAAI,kBAAkB,CAAC,EAAE,CAAC,CAAC;IACpC,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,GAAW,EAAE,IAAa,EAAE,EAAE;IACjE,0EAA0E;IAC1E,oEAAoE;IACpE,MAAM,MAAM,GAAG,IAAI,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE;QACxC,gBAAgB,EAAE,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK;QACvC,eAAe,EAAE,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK;QACtC,wBAAwB,EAAE,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK;KAChD,CAAC,CAAC;IACH,OAAO,IAAI,cAAc,CAAC,MAAM,CAAC,CAAC;AACpC,CAAC,CAAC"}
|
package/dist/utils/util.d.ts
CHANGED
|
@@ -1,9 +1,13 @@
|
|
|
1
1
|
import * as lib_mongo from '@powersync/lib-service-mongodb';
|
|
2
2
|
import { mongo } from '@powersync/lib-service-mongodb';
|
|
3
|
+
import { Logger } from '@powersync/lib-services-framework';
|
|
3
4
|
import { storage, utils } from '@powersync/service-core';
|
|
4
5
|
import * as bson from 'bson';
|
|
5
6
|
import { BucketDataDoc } from '../storage/implementation/common/BucketDataDoc.js';
|
|
6
|
-
|
|
7
|
+
type ClearCollectionFilter<T extends mongo.Document> = mongo.Filter<T> & {
|
|
8
|
+
_id: mongo.FilterOperators<mongo.InferIdType<T>>;
|
|
9
|
+
};
|
|
10
|
+
export declare function idPrefixFilter<T>(prefix: Partial<T>, rest: (keyof T)[]): mongo.FilterOperators<T>;
|
|
7
11
|
export declare function generateReplicationStreamName(prefix: string, replicationStreamId: number): string;
|
|
8
12
|
/**
|
|
9
13
|
* Read a single batch of data from a cursor, then close it.
|
|
@@ -30,6 +34,8 @@ export declare function retryOnMongoMaxTimeMSExpired<T>(operation: () => Promise
|
|
|
30
34
|
retryDelayMs: number;
|
|
31
35
|
onRetry?: (retryCount: number) => void;
|
|
32
36
|
}): Promise<T>;
|
|
37
|
+
export declare function clearCollectionInIdRanges<T extends mongo.Document>(logger: Logger, label: string, collection: mongo.Collection<T>, filter: ClearCollectionFilter<T>, signal?: AbortSignal, throttleRate?: number): Promise<number>;
|
|
38
|
+
export declare function clearCollectionInIdBatches<T extends mongo.Document>(logger: Logger, label: string, collection: mongo.Collection<T>, filter: mongo.Filter<T>, signal?: AbortSignal, throttleRate?: number): Promise<number>;
|
|
33
39
|
export declare const createPaginatedConnectionQuery: <T extends mongo.Document>(query: mongo.Filter<T>, collection: mongo.Collection<T>, limit: number, cursor?: string) => Promise<{
|
|
34
40
|
items: lib_mongo.mongo.WithId<T>[];
|
|
35
41
|
count: number;
|
|
@@ -37,3 +43,4 @@ export declare const createPaginatedConnectionQuery: <T extends mongo.Document>(
|
|
|
37
43
|
cursor: any;
|
|
38
44
|
more: boolean;
|
|
39
45
|
}>;
|
|
46
|
+
export {};
|
package/dist/utils/util.js
CHANGED
|
@@ -5,6 +5,40 @@ import * as bson from 'bson';
|
|
|
5
5
|
import * as crypto from 'crypto';
|
|
6
6
|
import * as timers from 'node:timers/promises';
|
|
7
7
|
import * as uuid from 'uuid';
|
|
8
|
+
import { DEFAULT_CLEAR_BATCH_THROTTLE_RATE } from '../types/types.js';
|
|
9
|
+
/**
|
|
10
|
+
* Default and max batch size for clearing.
|
|
11
|
+
*/
|
|
12
|
+
const CLEAR_BATCH_SIZE = 10_000;
|
|
13
|
+
/**
|
|
14
|
+
* Minimum batch size for clearing when a batch takes too long.
|
|
15
|
+
*/
|
|
16
|
+
const CLEAR_MIN_BATCH_SIZE = 100;
|
|
17
|
+
/**
|
|
18
|
+
* We target batch duration to stay between the min and max. If the druation is outside this range,
|
|
19
|
+
* we increase or decrease the batch size.
|
|
20
|
+
*
|
|
21
|
+
* MONGO_CLEAR_OPERATION_TIMEOUT_MS controls the absolute max of individual find and delete operations,
|
|
22
|
+
* but we try to avoid hitting that.
|
|
23
|
+
*/
|
|
24
|
+
const CLEAR_BATCH_MIN_DURATION_MS = 500;
|
|
25
|
+
const CLEAR_BATCH_MAX_DURATION_MS = 2000;
|
|
26
|
+
function throwIfClearAborted(signal) {
|
|
27
|
+
if (signal?.aborted) {
|
|
28
|
+
throw new ReplicationAbortedError('Aborted clearing data', signal.reason);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
async function waitWithSignal(delayMs, signal, abortMessage) {
|
|
32
|
+
try {
|
|
33
|
+
await timers.setTimeout(delayMs, undefined, { signal });
|
|
34
|
+
}
|
|
35
|
+
catch (error) {
|
|
36
|
+
if (signal?.aborted) {
|
|
37
|
+
throw new ReplicationAbortedError(abortMessage, signal.reason);
|
|
38
|
+
}
|
|
39
|
+
throw error;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
8
42
|
export function idPrefixFilter(prefix, rest) {
|
|
9
43
|
let filter = {
|
|
10
44
|
$gte: {
|
|
@@ -133,15 +167,104 @@ export async function retryOnMongoMaxTimeMSExpired(operation, options) {
|
|
|
133
167
|
return await operation();
|
|
134
168
|
}
|
|
135
169
|
catch (e) {
|
|
136
|
-
if (!lib_mongo.
|
|
170
|
+
if (!lib_mongo.isMaxTimeMSExpiredError(e)) {
|
|
137
171
|
throw e;
|
|
138
172
|
}
|
|
139
173
|
retryCount += 1;
|
|
140
174
|
options.onRetry?.(retryCount);
|
|
141
|
-
await
|
|
175
|
+
await waitWithSignal(options.retryDelayMs, options.signal, options.abortMessage ?? 'Aborted MongoDB operation');
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
async function clearCollectionInBatches(logger, label, findAndDeleteBatch, signal, throttleRate = DEFAULT_CLEAR_BATCH_THROTTLE_RATE) {
|
|
180
|
+
let batchSize = CLEAR_BATCH_SIZE;
|
|
181
|
+
let deletedCount = 0;
|
|
182
|
+
while (true) {
|
|
183
|
+
throwIfClearAborted(signal);
|
|
184
|
+
try {
|
|
185
|
+
const batchStartedAt = performance.now();
|
|
186
|
+
const foundBatchSize = await findAndDeleteBatch(batchSize);
|
|
187
|
+
const batchDurationMs = performance.now() - batchStartedAt;
|
|
188
|
+
deletedCount += foundBatchSize;
|
|
189
|
+
if (foundBatchSize > 0) {
|
|
190
|
+
logger.info(`Cleared batch of ${label} (${foundBatchSize} documents) in ${Math.round(batchDurationMs)}ms, continuing...`);
|
|
191
|
+
}
|
|
192
|
+
if (foundBatchSize < batchSize) {
|
|
193
|
+
return deletedCount;
|
|
194
|
+
}
|
|
195
|
+
if (batchDurationMs > CLEAR_BATCH_MAX_DURATION_MS) {
|
|
196
|
+
batchSize = Math.max(CLEAR_MIN_BATCH_SIZE, Math.floor(batchSize / 2));
|
|
197
|
+
}
|
|
198
|
+
else if (batchDurationMs < CLEAR_BATCH_MIN_DURATION_MS) {
|
|
199
|
+
batchSize = Math.min(CLEAR_BATCH_SIZE, batchSize * 2);
|
|
200
|
+
}
|
|
201
|
+
await waitWithSignal(batchDurationMs * throttleRate, signal, 'Aborted clearing data');
|
|
202
|
+
}
|
|
203
|
+
catch (error) {
|
|
204
|
+
if (!lib_mongo.isTimeoutError(error) || batchSize == CLEAR_MIN_BATCH_SIZE) {
|
|
205
|
+
throw error;
|
|
206
|
+
}
|
|
207
|
+
const nextBatchSize = Math.max(CLEAR_MIN_BATCH_SIZE, Math.floor(batchSize / 2));
|
|
208
|
+
logger.info(`Clearing batch of ${label} timed out with batch size ${batchSize}, retrying find and delete with ${nextBatchSize}...`);
|
|
209
|
+
batchSize = nextBatchSize;
|
|
210
|
+
// Pause for at least the equivalent of one query timeout before retrying, since the cause may be high database load.
|
|
211
|
+
const pauseDuration = Math.max(throttleRate, 1.0) * lib_mongo.MONGO_CLEAR_OPERATION_TIMEOUT_MS;
|
|
212
|
+
await waitWithSignal(pauseDuration, signal, 'Aborted clearing data');
|
|
142
213
|
}
|
|
143
214
|
}
|
|
144
215
|
}
|
|
216
|
+
export async function clearCollectionInIdRanges(logger, label, collection, filter, signal, throttleRate = DEFAULT_CLEAR_BATCH_THROTTLE_RATE) {
|
|
217
|
+
return clearCollectionInBatches(logger, label, async (batchSize) => {
|
|
218
|
+
const queryOptions = {
|
|
219
|
+
maxTimeMS: lib_mongo.db.MONGO_CLEAR_OPERATION_TIMEOUT_MS,
|
|
220
|
+
projection: { _id: 1 }
|
|
221
|
+
};
|
|
222
|
+
const [batchEnd] = await collection
|
|
223
|
+
.find(filter, queryOptions)
|
|
224
|
+
.sort({ _id: 1 })
|
|
225
|
+
.skip(batchSize)
|
|
226
|
+
.limit(1)
|
|
227
|
+
.toArray();
|
|
228
|
+
throwIfClearAborted(signal);
|
|
229
|
+
if (batchEnd == null) {
|
|
230
|
+
// We're on the last batch
|
|
231
|
+
const result = await collection.deleteMany(filter, {
|
|
232
|
+
maxTimeMS: lib_mongo.db.MONGO_CLEAR_OPERATION_TIMEOUT_MS
|
|
233
|
+
});
|
|
234
|
+
return result.deletedCount;
|
|
235
|
+
}
|
|
236
|
+
const idRange = {
|
|
237
|
+
...filter._id,
|
|
238
|
+
$lt: batchEnd._id
|
|
239
|
+
};
|
|
240
|
+
await collection.deleteMany({
|
|
241
|
+
...filter,
|
|
242
|
+
_id: idRange
|
|
243
|
+
}, { maxTimeMS: lib_mongo.db.MONGO_CLEAR_OPERATION_TIMEOUT_MS });
|
|
244
|
+
return batchSize;
|
|
245
|
+
}, signal, throttleRate);
|
|
246
|
+
}
|
|
247
|
+
export async function clearCollectionInIdBatches(logger, label, collection, filter, signal, throttleRate = DEFAULT_CLEAR_BATCH_THROTTLE_RATE) {
|
|
248
|
+
return clearCollectionInBatches(logger, label, async (batchSize) => {
|
|
249
|
+
const documents = await collection
|
|
250
|
+
.find(filter, {
|
|
251
|
+
maxTimeMS: lib_mongo.db.MONGO_CLEAR_OPERATION_TIMEOUT_MS,
|
|
252
|
+
projection: { _id: 1 }
|
|
253
|
+
})
|
|
254
|
+
.limit(batchSize)
|
|
255
|
+
.toArray();
|
|
256
|
+
throwIfClearAborted(signal);
|
|
257
|
+
if (documents.length === 0) {
|
|
258
|
+
return 0;
|
|
259
|
+
}
|
|
260
|
+
await collection.deleteMany({
|
|
261
|
+
_id: {
|
|
262
|
+
$in: documents.map((document) => document._id)
|
|
263
|
+
}
|
|
264
|
+
}, { maxTimeMS: lib_mongo.db.MONGO_CLEAR_OPERATION_TIMEOUT_MS });
|
|
265
|
+
return documents.length;
|
|
266
|
+
}, signal, throttleRate);
|
|
267
|
+
}
|
|
145
268
|
export const createPaginatedConnectionQuery = async (query, collection, limit, cursor) => {
|
|
146
269
|
const createQuery = (cursor) => {
|
|
147
270
|
if (!cursor) {
|
package/dist/utils/util.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"util.js","sourceRoot":"","sources":["../../src/utils/util.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,SAAS,MAAM,gCAAgC,CAAC;AAE5D,OAAO,
|
|
1
|
+
{"version":3,"file":"util.js","sourceRoot":"","sources":["../../src/utils/util.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@powersync/service-module-mongodb-storage",
|
|
3
3
|
"repository": "https://github.com/powersync-ja/powersync-service",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.20.0",
|
|
5
5
|
"license": "FSL-1.1-ALv2",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"publishConfig": {
|
|
@@ -12,20 +12,23 @@
|
|
|
12
12
|
"./types": "./dist/types/types.js"
|
|
13
13
|
},
|
|
14
14
|
"dependencies": {
|
|
15
|
+
"@aws-sdk/client-s3": "^3.637.0",
|
|
16
|
+
"@smithy/core": "^3.24.6",
|
|
17
|
+
"async-mutex": "^0.5.0",
|
|
15
18
|
"bson": "^6.10.4",
|
|
16
19
|
"ix": "^5.0.0",
|
|
17
20
|
"lru-cache": "^10.2.2",
|
|
18
21
|
"ts-codec": "^1.3.0",
|
|
19
22
|
"uuid": "^14.0.0",
|
|
20
|
-
"@powersync/lib-service-mongodb": "0.6.
|
|
21
|
-
"@powersync/lib-services-framework": "0.
|
|
22
|
-
"@powersync/service-core": "1.
|
|
23
|
+
"@powersync/lib-service-mongodb": "0.6.30",
|
|
24
|
+
"@powersync/lib-services-framework": "0.10.0",
|
|
25
|
+
"@powersync/service-core": "1.25.0",
|
|
23
26
|
"@powersync/service-jsonbig": "0.17.13",
|
|
24
|
-
"@powersync/service-sync-rules": "0.
|
|
25
|
-
"@powersync/service-types": "0.
|
|
27
|
+
"@powersync/service-sync-rules": "0.40.0",
|
|
28
|
+
"@powersync/service-types": "0.17.0"
|
|
26
29
|
},
|
|
27
30
|
"devDependencies": {
|
|
28
|
-
"@powersync/service-core-tests": "0.
|
|
31
|
+
"@powersync/service-core-tests": "0.18.0"
|
|
29
32
|
},
|
|
30
33
|
"scripts": {
|
|
31
34
|
"build": "tsc -b",
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { migrations } from '@powersync/service-core';
|
|
2
|
+
import * as storage from '../../../storage/storage-index.js';
|
|
3
|
+
import { MongoStorageConfig } from '../../../types/types.js';
|
|
4
|
+
|
|
5
|
+
export const up: migrations.PowerSyncMigrationFunction = async (context) => {
|
|
6
|
+
const {
|
|
7
|
+
service_context: { configuration }
|
|
8
|
+
} = context;
|
|
9
|
+
const db = storage.createPowerSyncMongo(configuration.storage as MongoStorageConfig);
|
|
10
|
+
|
|
11
|
+
try {
|
|
12
|
+
await db.write_checkpoints.createIndex(
|
|
13
|
+
{
|
|
14
|
+
checkpoint_requested_at: 1
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
name: 'checkpoint_requested_at',
|
|
18
|
+
// Only client-requested checkpoints have this field; generated
|
|
19
|
+
// checkpoints leave it unset. This keeps the index limited to the
|
|
20
|
+
// documents the compact job's retention delete scans.
|
|
21
|
+
partialFilterExpression: { checkpoint_requested_at: { $exists: true } }
|
|
22
|
+
}
|
|
23
|
+
);
|
|
24
|
+
await db.custom_write_checkpoints.createIndex(
|
|
25
|
+
{
|
|
26
|
+
checkpoint_requested_at: 1
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
name: 'checkpoint_requested_at',
|
|
30
|
+
partialFilterExpression: { checkpoint_requested_at: { $exists: true } }
|
|
31
|
+
}
|
|
32
|
+
);
|
|
33
|
+
} finally {
|
|
34
|
+
await db.client.close();
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
export const down: migrations.PowerSyncMigrationFunction = async (context) => {
|
|
39
|
+
const {
|
|
40
|
+
service_context: { configuration }
|
|
41
|
+
} = context;
|
|
42
|
+
|
|
43
|
+
const db = storage.createPowerSyncMongo(configuration.storage as MongoStorageConfig);
|
|
44
|
+
|
|
45
|
+
try {
|
|
46
|
+
if (await db.write_checkpoints.indexExists('checkpoint_requested_at')) {
|
|
47
|
+
await db.write_checkpoints.dropIndex('checkpoint_requested_at');
|
|
48
|
+
}
|
|
49
|
+
if (await db.custom_write_checkpoints.indexExists('checkpoint_requested_at')) {
|
|
50
|
+
await db.custom_write_checkpoints.dropIndex('checkpoint_requested_at');
|
|
51
|
+
}
|
|
52
|
+
} finally {
|
|
53
|
+
await db.client.close();
|
|
54
|
+
}
|
|
55
|
+
};
|
|
@@ -17,6 +17,7 @@ import {
|
|
|
17
17
|
isCompatible
|
|
18
18
|
} from '@powersync/service-core';
|
|
19
19
|
import { ObjectId } from 'bson';
|
|
20
|
+
import { DEFAULT_CLEAR_BATCH_THROTTLE_RATE } from '../types/types.js';
|
|
20
21
|
import { generateReplicationStreamName } from '../utils/util.js';
|
|
21
22
|
import type { MongoSyncBucketStorage } from './implementation/createMongoSyncBucketStorage.js';
|
|
22
23
|
import { createMongoSyncBucketStorage } from './implementation/createMongoSyncBucketStorage.js';
|
|
@@ -26,17 +27,21 @@ import { MongoChecksumOptions } from './implementation/MongoChecksums.js';
|
|
|
26
27
|
import { MongoPersistedReplicationStream } from './implementation/MongoPersistedReplicationStream.js';
|
|
27
28
|
import { syncRuleStateUpdatePipeline } from './implementation/SyncRuleStateUpdate.js';
|
|
28
29
|
import { SyncRuleDocumentV1 } from './implementation/v1/models.js';
|
|
30
|
+
import { ObjectStorage } from './implementation/v3/object-storage/ObjectStorage.js';
|
|
29
31
|
import { VersionedPowerSyncMongoV3 } from './implementation/v3/VersionedPowerSyncMongoV3.js';
|
|
30
32
|
import { ReplicationStreamDocumentV3, SyncConfigDefinition, SyncRuleConfigStateV3 } from './storage-index.js';
|
|
31
33
|
|
|
32
34
|
export interface MongoBucketStorageOptions {
|
|
35
|
+
checksumOptions?: Omit<MongoChecksumOptions, 'storageConfig'>;
|
|
36
|
+
objectStorage?: ObjectStorage;
|
|
37
|
+
inlineThresholdBytes?: number;
|
|
33
38
|
/**
|
|
34
39
|
* Prefix for replication stream name and Postgres logical replication slot name.
|
|
35
40
|
*/
|
|
36
41
|
replicationStreamNamePrefix: string;
|
|
37
42
|
readPreference?: mongo.ReadPreference;
|
|
38
|
-
checksumOptions?: Omit<MongoChecksumOptions, 'storageConfig'>;
|
|
39
43
|
checksumCacheTtlMs?: number;
|
|
44
|
+
clearBatchThrottleRate?: number;
|
|
40
45
|
/**
|
|
41
46
|
* Reuse a compatible active replication stream by appending a new sync config.
|
|
42
47
|
*
|
|
@@ -95,7 +100,10 @@ export class MongoBucketStorage extends storage.BucketStorageFactory {
|
|
|
95
100
|
checksumOptions: this.options.checksumOptions,
|
|
96
101
|
readPreference: this.options.readPreference,
|
|
97
102
|
checksumCacheTtlMs: this.options.checksumCacheTtlMs,
|
|
98
|
-
storageConfig
|
|
103
|
+
storageConfig,
|
|
104
|
+
objectStorage: this.options.objectStorage,
|
|
105
|
+
inlineThresholdBytes: this.options.inlineThresholdBytes,
|
|
106
|
+
clearBatchThrottleRate: this.options.clearBatchThrottleRate ?? DEFAULT_CLEAR_BATCH_THROTTLE_RATE
|
|
99
107
|
}
|
|
100
108
|
);
|
|
101
109
|
if (!options?.skipLifecycleHooks) {
|
|
@@ -32,6 +32,7 @@ import { MongoIdSequence } from './MongoIdSequence.js';
|
|
|
32
32
|
import { MongoParsedSyncConfigSet } from './MongoParsedSyncConfigSet.js';
|
|
33
33
|
import { batchCreateCustomWriteCheckpoints } from './MongoWriteCheckpointAPI.js';
|
|
34
34
|
import { OperationBatch, RecordOperation } from './OperationBatch.js';
|
|
35
|
+
import { ObjectStorage } from './v3/object-storage/ObjectStorage.js';
|
|
35
36
|
|
|
36
37
|
// Currently, we can only have a single flush() at a time, since it locks the op_id sequence.
|
|
37
38
|
// While the MongoDB transaction retry mechanism handles this okay, using an in-process Mutex
|
|
@@ -71,6 +72,9 @@ export interface MongoBucketBatchOptions {
|
|
|
71
72
|
|
|
72
73
|
logger: Logger;
|
|
73
74
|
tracer?: PerformanceTracer<'storage' | 'evaluate'>;
|
|
75
|
+
|
|
76
|
+
objectStorage?: ObjectStorage;
|
|
77
|
+
inlineThresholdBytes?: number;
|
|
74
78
|
}
|
|
75
79
|
|
|
76
80
|
export abstract class MongoBucketBatch
|