@powersync/service-module-mongodb-storage 0.15.3 → 0.16.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 +54 -0
- package/dist/migrations/db/migrations/1688556755264-initial-sync-rules.js +1 -1
- package/dist/migrations/db/migrations/1688556755264-initial-sync-rules.js.map +1 -1
- package/dist/migrations/db/migrations/1702295701188-sync-rule-state.js +3 -3
- package/dist/migrations/db/migrations/1702295701188-sync-rule-state.js.map +1 -1
- package/dist/migrations/db/migrations/1770213298299-storage-version.js.map +1 -1
- package/dist/storage/MongoBucketStorage.d.ts +5 -3
- package/dist/storage/MongoBucketStorage.js +50 -36
- package/dist/storage/MongoBucketStorage.js.map +1 -1
- package/dist/storage/MongoReportStorage.js.map +1 -1
- package/dist/storage/implementation/BucketDefinitionMapping.d.ts +17 -0
- package/dist/storage/implementation/BucketDefinitionMapping.js +58 -0
- package/dist/storage/implementation/BucketDefinitionMapping.js.map +1 -0
- package/dist/storage/implementation/MongoBucketBatch.d.ts +16 -14
- package/dist/storage/implementation/MongoBucketBatch.js +80 -115
- package/dist/storage/implementation/MongoBucketBatch.js.map +1 -1
- package/dist/storage/implementation/MongoBucketBatchShared.d.ts +5 -0
- package/dist/storage/implementation/MongoBucketBatchShared.js +8 -0
- package/dist/storage/implementation/MongoBucketBatchShared.js.map +1 -0
- package/dist/storage/implementation/MongoChecksums.d.ts +28 -17
- package/dist/storage/implementation/MongoChecksums.js +13 -72
- package/dist/storage/implementation/MongoChecksums.js.map +1 -1
- package/dist/storage/implementation/MongoCompactor.d.ts +98 -58
- package/dist/storage/implementation/MongoCompactor.js +229 -296
- package/dist/storage/implementation/MongoCompactor.js.map +1 -1
- package/dist/storage/implementation/MongoParameterCompactor.d.ts +11 -6
- package/dist/storage/implementation/MongoParameterCompactor.js +11 -8
- package/dist/storage/implementation/MongoParameterCompactor.js.map +1 -1
- package/dist/storage/implementation/MongoPersistedSyncRules.d.ts +14 -0
- package/dist/storage/implementation/MongoPersistedSyncRules.js +64 -0
- package/dist/storage/implementation/MongoPersistedSyncRules.js.map +1 -0
- package/dist/storage/implementation/MongoPersistedSyncRulesContent.d.ts +3 -0
- package/dist/storage/implementation/MongoPersistedSyncRulesContent.js +9 -0
- package/dist/storage/implementation/MongoPersistedSyncRulesContent.js.map +1 -1
- package/dist/storage/implementation/MongoStorageProvider.js +1 -1
- package/dist/storage/implementation/MongoStorageProvider.js.map +1 -1
- package/dist/storage/implementation/MongoSyncBucketStorage.d.ts +49 -30
- package/dist/storage/implementation/MongoSyncBucketStorage.js +96 -388
- package/dist/storage/implementation/MongoSyncBucketStorage.js.map +1 -1
- package/dist/storage/implementation/MongoSyncRulesLock.d.ts +5 -3
- package/dist/storage/implementation/MongoSyncRulesLock.js +12 -10
- package/dist/storage/implementation/MongoSyncRulesLock.js.map +1 -1
- package/dist/storage/implementation/MongoWriteCheckpointAPI.js +1 -1
- package/dist/storage/implementation/MongoWriteCheckpointAPI.js.map +1 -1
- package/dist/storage/implementation/OperationBatch.js +1 -1
- package/dist/storage/implementation/common/BucketDataDoc.d.ts +35 -0
- package/dist/storage/implementation/common/BucketDataDoc.js +2 -0
- package/dist/storage/implementation/common/BucketDataDoc.js.map +1 -0
- package/dist/storage/implementation/common/MongoSyncBucketStorageContext.d.ts +13 -0
- package/dist/storage/implementation/common/MongoSyncBucketStorageContext.js +2 -0
- package/dist/storage/implementation/common/MongoSyncBucketStorageContext.js.map +1 -0
- package/dist/storage/implementation/common/PersistedBatch.d.ts +108 -0
- package/dist/storage/implementation/common/PersistedBatch.js +237 -0
- package/dist/storage/implementation/common/PersistedBatch.js.map +1 -0
- package/dist/storage/implementation/common/SingleBucketStore.d.ts +54 -0
- package/dist/storage/implementation/common/SingleBucketStore.js +3 -0
- package/dist/storage/implementation/common/SingleBucketStore.js.map +1 -0
- package/dist/storage/implementation/common/SourceRecordStore.d.ts +36 -0
- package/dist/storage/implementation/common/SourceRecordStore.js +2 -0
- package/dist/storage/implementation/common/SourceRecordStore.js.map +1 -0
- package/dist/storage/implementation/common/VersionedPowerSyncMongoBase.d.ts +27 -0
- package/dist/storage/implementation/common/VersionedPowerSyncMongoBase.js +57 -0
- package/dist/storage/implementation/common/VersionedPowerSyncMongoBase.js.map +1 -0
- package/dist/storage/implementation/createMongoSyncBucketStorage.d.ts +7 -0
- package/dist/storage/implementation/createMongoSyncBucketStorage.js +9 -0
- package/dist/storage/implementation/createMongoSyncBucketStorage.js.map +1 -0
- package/dist/storage/implementation/db.d.ts +34 -34
- package/dist/storage/implementation/db.js +78 -98
- package/dist/storage/implementation/db.js.map +1 -1
- package/dist/storage/implementation/models.d.ts +63 -34
- package/dist/storage/implementation/models.js +21 -2
- package/dist/storage/implementation/models.js.map +1 -1
- package/dist/storage/implementation/v1/MongoBucketBatchV1.d.ts +13 -0
- package/dist/storage/implementation/v1/MongoBucketBatchV1.js +22 -0
- package/dist/storage/implementation/v1/MongoBucketBatchV1.js.map +1 -0
- package/dist/storage/implementation/v1/MongoChecksumsV1.d.ts +12 -0
- package/dist/storage/implementation/v1/MongoChecksumsV1.js +56 -0
- package/dist/storage/implementation/v1/MongoChecksumsV1.js.map +1 -0
- package/dist/storage/implementation/v1/MongoCompactorV1.d.ts +23 -0
- package/dist/storage/implementation/v1/MongoCompactorV1.js +52 -0
- package/dist/storage/implementation/v1/MongoCompactorV1.js.map +1 -0
- package/dist/storage/implementation/v1/MongoParameterCompactorV1.d.ts +9 -0
- package/dist/storage/implementation/v1/MongoParameterCompactorV1.js +20 -0
- package/dist/storage/implementation/v1/MongoParameterCompactorV1.js.map +1 -0
- package/dist/storage/implementation/v1/MongoSyncBucketStorageV1.d.ts +41 -0
- package/dist/storage/implementation/v1/MongoSyncBucketStorageV1.js +283 -0
- package/dist/storage/implementation/v1/MongoSyncBucketStorageV1.js.map +1 -0
- package/dist/storage/implementation/v1/PersistedBatchV1.d.ts +26 -0
- package/dist/storage/implementation/v1/PersistedBatchV1.js +183 -0
- package/dist/storage/implementation/v1/PersistedBatchV1.js.map +1 -0
- package/dist/storage/implementation/v1/SingleBucketStoreV1.d.ts +18 -0
- package/dist/storage/implementation/v1/SingleBucketStoreV1.js +57 -0
- package/dist/storage/implementation/v1/SingleBucketStoreV1.js.map +1 -0
- package/dist/storage/implementation/v1/SourceRecordStoreV1.d.ts +19 -0
- package/dist/storage/implementation/v1/SourceRecordStoreV1.js +105 -0
- package/dist/storage/implementation/v1/SourceRecordStoreV1.js.map +1 -0
- package/dist/storage/implementation/v1/VersionedPowerSyncMongoV1.d.ts +12 -0
- package/dist/storage/implementation/v1/VersionedPowerSyncMongoV1.js +20 -0
- package/dist/storage/implementation/v1/VersionedPowerSyncMongoV1.js.map +1 -0
- package/dist/storage/implementation/v1/models.d.ts +34 -0
- package/dist/storage/implementation/v1/models.js +37 -0
- package/dist/storage/implementation/v1/models.js.map +1 -0
- package/dist/storage/implementation/v3/MongoBucketBatchV3.d.ts +13 -0
- package/dist/storage/implementation/v3/MongoBucketBatchV3.js +34 -0
- package/dist/storage/implementation/v3/MongoBucketBatchV3.js.map +1 -0
- package/dist/storage/implementation/v3/MongoChecksumsV3.d.ts +15 -0
- package/dist/storage/implementation/v3/MongoChecksumsV3.js +84 -0
- package/dist/storage/implementation/v3/MongoChecksumsV3.js.map +1 -0
- package/dist/storage/implementation/v3/MongoCompactorV3.d.ts +23 -0
- package/dist/storage/implementation/v3/MongoCompactorV3.js +68 -0
- package/dist/storage/implementation/v3/MongoCompactorV3.js.map +1 -0
- package/dist/storage/implementation/v3/MongoParameterCompactorV3.d.ts +9 -0
- package/dist/storage/implementation/v3/MongoParameterCompactorV3.js +18 -0
- package/dist/storage/implementation/v3/MongoParameterCompactorV3.js.map +1 -0
- package/dist/storage/implementation/v3/MongoParameterLookupV3.d.ts +5 -0
- package/dist/storage/implementation/v3/MongoParameterLookupV3.js +9 -0
- package/dist/storage/implementation/v3/MongoParameterLookupV3.js.map +1 -0
- package/dist/storage/implementation/v3/MongoSyncBucketStorageV3.d.ts +41 -0
- package/dist/storage/implementation/v3/MongoSyncBucketStorageV3.js +407 -0
- package/dist/storage/implementation/v3/MongoSyncBucketStorageV3.js.map +1 -0
- package/dist/storage/implementation/v3/PersistedBatchV3.d.ts +29 -0
- package/dist/storage/implementation/v3/PersistedBatchV3.js +259 -0
- package/dist/storage/implementation/v3/PersistedBatchV3.js.map +1 -0
- package/dist/storage/implementation/v3/SingleBucketStoreV3.d.ts +18 -0
- package/dist/storage/implementation/v3/SingleBucketStoreV3.js +48 -0
- package/dist/storage/implementation/v3/SingleBucketStoreV3.js.map +1 -0
- package/dist/storage/implementation/v3/SourceRecordStoreV3.d.ts +22 -0
- package/dist/storage/implementation/v3/SourceRecordStoreV3.js +164 -0
- package/dist/storage/implementation/v3/SourceRecordStoreV3.js.map +1 -0
- package/dist/storage/implementation/v3/VersionedPowerSyncMongoV3.d.ts +21 -0
- package/dist/storage/implementation/v3/VersionedPowerSyncMongoV3.js +71 -0
- package/dist/storage/implementation/v3/VersionedPowerSyncMongoV3.js.map +1 -0
- package/dist/storage/implementation/v3/models.d.ts +43 -0
- package/dist/storage/implementation/v3/models.js +34 -0
- package/dist/storage/implementation/v3/models.js.map +1 -0
- package/dist/storage/storage-index.d.ts +8 -5
- package/dist/storage/storage-index.js +8 -5
- package/dist/storage/storage-index.js.map +1 -1
- package/dist/utils/util.d.ts +11 -4
- package/dist/utils/util.js +25 -4
- package/dist/utils/util.js.map +1 -1
- package/package.json +9 -9
- package/src/migrations/db/migrations/1688556755264-initial-sync-rules.ts +1 -1
- package/src/migrations/db/migrations/1702295701188-sync-rule-state.ts +7 -7
- package/src/migrations/db/migrations/1770213298299-storage-version.ts +1 -1
- package/src/storage/MongoBucketStorage.ts +97 -62
- package/src/storage/MongoReportStorage.ts +2 -2
- package/src/storage/implementation/BucketDefinitionMapping.ts +72 -0
- package/src/storage/implementation/MongoBucketBatch.ts +110 -144
- package/src/storage/implementation/MongoBucketBatchShared.ts +11 -0
- package/src/storage/implementation/MongoChecksums.ts +53 -76
- package/src/storage/implementation/MongoCompactor.ts +374 -404
- package/src/storage/implementation/MongoParameterCompactor.ts +37 -24
- package/src/storage/implementation/MongoPersistedSyncRules.ts +76 -0
- package/src/storage/implementation/MongoPersistedSyncRulesContent.ts +18 -1
- package/src/storage/implementation/MongoStorageProvider.ts +1 -1
- package/src/storage/implementation/MongoSyncBucketStorage.ts +190 -457
- package/src/storage/implementation/MongoSyncRulesLock.ts +12 -14
- package/src/storage/implementation/MongoWriteCheckpointAPI.ts +4 -2
- package/src/storage/implementation/OperationBatch.ts +1 -1
- package/src/storage/implementation/common/BucketDataDoc.ts +37 -0
- package/src/storage/implementation/common/MongoSyncBucketStorageContext.ts +15 -0
- package/src/storage/implementation/common/PersistedBatch.ts +364 -0
- package/src/storage/implementation/common/SingleBucketStore.ts +63 -0
- package/src/storage/implementation/common/SourceRecordStore.ts +49 -0
- package/src/storage/implementation/common/VersionedPowerSyncMongoBase.ts +80 -0
- package/src/storage/implementation/createMongoSyncBucketStorage.ts +25 -0
- package/src/storage/implementation/db.ts +107 -128
- package/src/storage/implementation/models.ts +84 -38
- package/src/storage/implementation/v1/MongoBucketBatchV1.ts +32 -0
- package/src/storage/implementation/v1/MongoChecksumsV1.ts +75 -0
- package/src/storage/implementation/v1/MongoCompactorV1.ts +93 -0
- package/src/storage/implementation/v1/MongoParameterCompactorV1.ts +26 -0
- package/src/storage/implementation/v1/MongoSyncBucketStorageV1.ts +448 -0
- package/src/storage/implementation/v1/PersistedBatchV1.ts +230 -0
- package/src/storage/implementation/v1/SingleBucketStoreV1.ts +74 -0
- package/src/storage/implementation/v1/SourceRecordStoreV1.ts +156 -0
- package/src/storage/implementation/v1/VersionedPowerSyncMongoV1.ts +28 -0
- package/src/storage/implementation/v1/models.ts +84 -0
- package/src/storage/implementation/v3/MongoBucketBatchV3.ts +44 -0
- package/src/storage/implementation/v3/MongoChecksumsV3.ts +120 -0
- package/src/storage/implementation/v3/MongoCompactorV3.ts +107 -0
- package/src/storage/implementation/v3/MongoParameterCompactorV3.ts +24 -0
- package/src/storage/implementation/v3/MongoParameterLookupV3.ts +12 -0
- package/src/storage/implementation/v3/MongoSyncBucketStorageV3.ts +550 -0
- package/src/storage/implementation/v3/PersistedBatchV3.ts +318 -0
- package/src/storage/implementation/v3/SingleBucketStoreV3.ts +68 -0
- package/src/storage/implementation/v3/SourceRecordStoreV3.ts +226 -0
- package/src/storage/implementation/v3/VersionedPowerSyncMongoV3.ts +112 -0
- package/src/storage/implementation/v3/models.ts +96 -0
- package/src/storage/storage-index.ts +8 -5
- package/src/utils/util.ts +36 -7
- package/test/src/__snapshots__/storage_sync.test.ts.snap +282 -0
- package/test/src/connection-report-storage.test.ts +3 -3
- package/test/src/setup.ts +1 -1
- package/test/src/storage.test.ts +2 -2
- package/test/src/storage_compacting.test.ts +57 -29
- package/test/src/storage_sync.test.ts +351 -5
- package/test/tsconfig.json +0 -1
- package/tsconfig.tsbuildinfo +1 -1
- package/dist/storage/implementation/PersistedBatch.d.ts +0 -71
- package/dist/storage/implementation/PersistedBatch.js +0 -354
- package/dist/storage/implementation/PersistedBatch.js.map +0 -1
- package/src/storage/implementation/PersistedBatch.ts +0 -432
|
@@ -1,6 +1,19 @@
|
|
|
1
|
-
import { BucketChecksumRequest, ChecksumMap, FetchPartialBucketChecksum, InternalOpId, PartialChecksumMap } from '@powersync/service-core';
|
|
2
|
-
import { VersionedPowerSyncMongo } from './db.js';
|
|
3
|
-
import
|
|
1
|
+
import { BucketChecksum, BucketChecksumRequest, ChecksumMap, FetchPartialBucketChecksum, InternalOpId, PartialChecksumMap, PartialOrFullChecksum } from '@powersync/service-core';
|
|
2
|
+
import type { VersionedPowerSyncMongo } from './db.js';
|
|
3
|
+
import * as lib_mongo from '@powersync/lib-service-mongodb';
|
|
4
|
+
import { BucketDefinitionId, BucketDefinitionMapping } from './BucketDefinitionMapping.js';
|
|
5
|
+
import { BucketDataDocumentBase, StorageConfig } from './models.js';
|
|
6
|
+
export interface FetchPartialBucketChecksumV3 {
|
|
7
|
+
bucket: string;
|
|
8
|
+
definitionId: BucketDefinitionId;
|
|
9
|
+
start?: InternalOpId;
|
|
10
|
+
end: InternalOpId;
|
|
11
|
+
}
|
|
12
|
+
export interface FetchPartialBucketChecksumByBucket {
|
|
13
|
+
bucket: string;
|
|
14
|
+
start?: InternalOpId;
|
|
15
|
+
end: InternalOpId;
|
|
16
|
+
}
|
|
4
17
|
/**
|
|
5
18
|
* Checksum calculation options, primarily for tests.
|
|
6
19
|
*/
|
|
@@ -14,20 +27,12 @@ export interface MongoChecksumOptions {
|
|
|
14
27
|
*/
|
|
15
28
|
operationBatchLimit?: number;
|
|
16
29
|
storageConfig: StorageConfig;
|
|
30
|
+
mapping?: BucketDefinitionMapping;
|
|
17
31
|
}
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
* 1. getChecksums() -> check cache for (partial) matches. If not found or partial match, query the remainder using computePartialChecksums().
|
|
23
|
-
* 2. computePartialChecksums() -> query bucket_state for partial matches. Query the remainder using computePartialChecksumsDirect().
|
|
24
|
-
* 3. computePartialChecksumsDirect() -> split into batches of 200 buckets at a time -> computePartialChecksumsInternal()
|
|
25
|
-
* 4. computePartialChecksumsInternal() -> aggregate over 50_000 operations in bucket_data at a time
|
|
26
|
-
*/
|
|
27
|
-
export declare class MongoChecksums {
|
|
28
|
-
private db;
|
|
29
|
-
private group_id;
|
|
30
|
-
private options;
|
|
32
|
+
export declare abstract class MongoChecksums {
|
|
33
|
+
protected readonly db: VersionedPowerSyncMongo;
|
|
34
|
+
protected readonly group_id: number;
|
|
35
|
+
protected readonly options: MongoChecksumOptions;
|
|
31
36
|
private _cache;
|
|
32
37
|
private readonly storageConfig;
|
|
33
38
|
constructor(db: VersionedPowerSyncMongo, group_id: number, options: MongoChecksumOptions);
|
|
@@ -71,5 +76,11 @@ export declare class MongoChecksums {
|
|
|
71
76
|
*
|
|
72
77
|
* `batch` must be limited to DEFAULT_BUCKET_BATCH_LIMIT buckets before calling this.
|
|
73
78
|
*/
|
|
74
|
-
|
|
79
|
+
protected abstract computePartialChecksumsInternal(batch: FetchPartialBucketChecksum[]): Promise<PartialChecksumMap>;
|
|
80
|
+
protected abstract fetchPreStates(batch: FetchPartialBucketChecksum[]): Promise<Map<string, {
|
|
81
|
+
opId: InternalOpId;
|
|
82
|
+
checksum: BucketChecksum;
|
|
83
|
+
}>>;
|
|
84
|
+
protected computePartialChecksumsForCollection<TRequest extends FetchPartialBucketChecksumByBucket, TBucketDataDocument extends BucketDataDocumentBase>(batch: TRequest[], collection: lib_mongo.mongo.Collection<TBucketDataDocument>, createFilter: (request: TRequest) => any): Promise<PartialChecksumMap>;
|
|
75
85
|
}
|
|
86
|
+
export declare function emptyChecksumForRequest(request: Pick<FetchPartialBucketChecksum | FetchPartialBucketChecksumV3, 'bucket' | 'start'>): PartialOrFullChecksum;
|
|
@@ -1,16 +1,7 @@
|
|
|
1
|
+
import { addPartialChecksums, ChecksumCache, isPartialChecksum } from '@powersync/service-core';
|
|
1
2
|
import * as lib_mongo from '@powersync/lib-service-mongodb';
|
|
2
|
-
import { addPartialChecksums, bson, ChecksumCache, isPartialChecksum } from '@powersync/service-core';
|
|
3
3
|
const DEFAULT_BUCKET_BATCH_LIMIT = 200;
|
|
4
4
|
const DEFAULT_OPERATION_BATCH_LIMIT = 50_000;
|
|
5
|
-
/**
|
|
6
|
-
* Checksum query implementation.
|
|
7
|
-
*
|
|
8
|
-
* General implementation flow is:
|
|
9
|
-
* 1. getChecksums() -> check cache for (partial) matches. If not found or partial match, query the remainder using computePartialChecksums().
|
|
10
|
-
* 2. computePartialChecksums() -> query bucket_state for partial matches. Query the remainder using computePartialChecksumsDirect().
|
|
11
|
-
* 3. computePartialChecksumsDirect() -> split into batches of 200 buckets at a time -> computePartialChecksumsInternal()
|
|
12
|
-
* 4. computePartialChecksumsInternal() -> aggregate over 50_000 operations in bucket_data at a time
|
|
13
|
-
*/
|
|
14
5
|
export class MongoChecksums {
|
|
15
6
|
db;
|
|
16
7
|
group_id;
|
|
@@ -59,38 +50,7 @@ export class MongoChecksums {
|
|
|
59
50
|
if (batch.length == 0) {
|
|
60
51
|
return new Map();
|
|
61
52
|
}
|
|
62
|
-
const
|
|
63
|
-
for (let request of batch) {
|
|
64
|
-
if (request.start == null) {
|
|
65
|
-
preFilters.push({
|
|
66
|
-
_id: {
|
|
67
|
-
g: this.group_id,
|
|
68
|
-
b: request.bucket
|
|
69
|
-
},
|
|
70
|
-
'compacted_state.op_id': { $exists: true, $lte: request.end }
|
|
71
|
-
});
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
const preStates = new Map();
|
|
75
|
-
if (preFilters.length > 0) {
|
|
76
|
-
// For un-cached bucket checksums, attempt to use the compacted state first.
|
|
77
|
-
const states = await this.db.bucket_state
|
|
78
|
-
.find({
|
|
79
|
-
$or: preFilters
|
|
80
|
-
})
|
|
81
|
-
.toArray();
|
|
82
|
-
for (let state of states) {
|
|
83
|
-
const compactedState = state.compacted_state;
|
|
84
|
-
preStates.set(state._id.b, {
|
|
85
|
-
opId: compactedState.op_id,
|
|
86
|
-
checksum: {
|
|
87
|
-
bucket: state._id.b,
|
|
88
|
-
checksum: Number(compactedState.checksum),
|
|
89
|
-
count: compactedState.count
|
|
90
|
-
}
|
|
91
|
-
});
|
|
92
|
-
}
|
|
93
|
-
}
|
|
53
|
+
const preStates = await this.fetchPreStates(batch);
|
|
94
54
|
const mappedRequests = batch.map((request) => {
|
|
95
55
|
let start = request.start;
|
|
96
56
|
if (start == null) {
|
|
@@ -143,14 +103,7 @@ export class MongoChecksums {
|
|
|
143
103
|
}
|
|
144
104
|
return results;
|
|
145
105
|
}
|
|
146
|
-
|
|
147
|
-
* Query a batch of checksums.
|
|
148
|
-
*
|
|
149
|
-
* We limit the number of operations that the query aggregates in each sub-batch, to avoid potential query timeouts.
|
|
150
|
-
*
|
|
151
|
-
* `batch` must be limited to DEFAULT_BUCKET_BATCH_LIMIT buckets before calling this.
|
|
152
|
-
*/
|
|
153
|
-
async computePartialChecksumsInternal(batch) {
|
|
106
|
+
async computePartialChecksumsForCollection(batch, collection, createFilter) {
|
|
154
107
|
const batchLimit = this.options?.operationBatchLimit ?? DEFAULT_OPERATION_BATCH_LIMIT;
|
|
155
108
|
// Map requests by bucket. We adjust this as we get partial results.
|
|
156
109
|
let requests = new Map();
|
|
@@ -159,23 +112,7 @@ export class MongoChecksums {
|
|
|
159
112
|
}
|
|
160
113
|
const partialChecksums = new Map();
|
|
161
114
|
while (requests.size > 0) {
|
|
162
|
-
const filters =
|
|
163
|
-
for (let request of requests.values()) {
|
|
164
|
-
filters.push({
|
|
165
|
-
_id: {
|
|
166
|
-
$gt: {
|
|
167
|
-
g: this.group_id,
|
|
168
|
-
b: request.bucket,
|
|
169
|
-
o: request.start ?? new bson.MinKey()
|
|
170
|
-
},
|
|
171
|
-
$lte: {
|
|
172
|
-
g: this.group_id,
|
|
173
|
-
b: request.bucket,
|
|
174
|
-
o: request.end
|
|
175
|
-
}
|
|
176
|
-
}
|
|
177
|
-
});
|
|
178
|
-
}
|
|
115
|
+
const filters = Array.from(requests.values(), createFilter);
|
|
179
116
|
// Historically, checksum may be stored as 'int' or 'double'.
|
|
180
117
|
// More recently, this should be a 'long'.
|
|
181
118
|
// $toLong ensures that we always sum it as a long, avoiding inaccuracies in the calculations.
|
|
@@ -189,7 +126,7 @@ export class MongoChecksums {
|
|
|
189
126
|
// Returns: B[3-10], C[1-4]
|
|
190
127
|
// 3. Query: C[5-end]
|
|
191
128
|
// Returns: C[5-10]
|
|
192
|
-
const aggregate = await
|
|
129
|
+
const aggregate = await collection
|
|
193
130
|
.aggregate([
|
|
194
131
|
{
|
|
195
132
|
$match: {
|
|
@@ -239,10 +176,8 @@ export class MongoChecksums {
|
|
|
239
176
|
limitReached = true;
|
|
240
177
|
const req = requests.get(bucket);
|
|
241
178
|
requests.set(bucket, {
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
start: doc.last_op,
|
|
245
|
-
end: req.end
|
|
179
|
+
...req,
|
|
180
|
+
start: doc.last_op
|
|
246
181
|
});
|
|
247
182
|
}
|
|
248
183
|
else {
|
|
@@ -276,6 +211,12 @@ export class MongoChecksums {
|
|
|
276
211
|
}));
|
|
277
212
|
}
|
|
278
213
|
}
|
|
214
|
+
export function emptyChecksumForRequest(request) {
|
|
215
|
+
if (request.start == null) {
|
|
216
|
+
return { bucket: request.bucket, count: 0, checksum: 0 };
|
|
217
|
+
}
|
|
218
|
+
return { bucket: request.bucket, partialCount: 0, partialChecksum: 0 };
|
|
219
|
+
}
|
|
279
220
|
/**
|
|
280
221
|
* Convert output of the $group stage into a checksum.
|
|
281
222
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MongoChecksums.js","sourceRoot":"","sources":["../../../src/storage/implementation/MongoChecksums.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"MongoChecksums.js","sourceRoot":"","sources":["../../../src/storage/implementation/MongoChecksums.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,80 +1,120 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
private idLimitBytes;
|
|
15
|
-
private moveBatchLimit;
|
|
16
|
-
private moveBatchQueryLimit;
|
|
17
|
-
private clearBatchLimit;
|
|
18
|
-
private minBucketChanges;
|
|
19
|
-
private minChangeRatio;
|
|
20
|
-
private maxOpId;
|
|
21
|
-
private buckets;
|
|
22
|
-
private signal?;
|
|
23
|
-
private group_id;
|
|
24
|
-
constructor(storage: MongoSyncBucketStorage, db: VersionedPowerSyncMongo, options: MongoCompactOptions);
|
|
1
|
+
import { mongo } from '@powersync/lib-service-mongodb';
|
|
2
|
+
import { Logger } from '@powersync/lib-services-framework';
|
|
3
|
+
import { InternalOpId, PopulateChecksumCacheResults, storage } from '@powersync/service-core';
|
|
4
|
+
import { BucketDefinitionId } from './BucketDefinitionMapping.js';
|
|
5
|
+
import { BucketDataDoc, BucketKey } from './common/BucketDataDoc.js';
|
|
6
|
+
import { BucketDataDocumentGeneric, SingleBucketStore } from './common/SingleBucketStore.js';
|
|
7
|
+
import type { VersionedPowerSyncMongo } from './db.js';
|
|
8
|
+
import { BucketStateDocumentBase } from './models.js';
|
|
9
|
+
import type { MongoSyncBucketStorage } from './MongoSyncBucketStorage.js';
|
|
10
|
+
interface CurrentBucketState {
|
|
11
|
+
/** Bucket name */
|
|
12
|
+
bucket: string;
|
|
13
|
+
definitionId: BucketDefinitionId;
|
|
25
14
|
/**
|
|
26
|
-
*
|
|
27
|
-
*
|
|
28
|
-
* See /docs/compacting-operations.md for details.
|
|
15
|
+
* Rows seen in the bucket, with the last op_id of each.
|
|
29
16
|
*/
|
|
30
|
-
|
|
31
|
-
private compactDirtyBuckets;
|
|
17
|
+
seen: Map<string, InternalOpId>;
|
|
32
18
|
/**
|
|
33
|
-
*
|
|
34
|
-
*
|
|
35
|
-
* This covers against occasional network or other database errors during a long compact job.
|
|
19
|
+
* Estimated memory usage of the seen Map.
|
|
36
20
|
*/
|
|
37
|
-
|
|
38
|
-
private compactSingleBucket;
|
|
21
|
+
trackingSize: number;
|
|
39
22
|
/**
|
|
40
|
-
*
|
|
23
|
+
* Last (lowest) seen op_id that is not a PUT.
|
|
41
24
|
*/
|
|
42
|
-
|
|
43
|
-
private flush;
|
|
25
|
+
lastNotPut: InternalOpId | null;
|
|
44
26
|
/**
|
|
45
|
-
*
|
|
46
|
-
|
|
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;
|
|
38
|
+
/**
|
|
39
|
+
* Byte size of ops covered by the checksum.
|
|
40
|
+
*/
|
|
41
|
+
opBytes: number;
|
|
42
|
+
}
|
|
43
|
+
export interface MongoCompactOptions extends storage.CompactOptions {
|
|
44
|
+
}
|
|
45
|
+
export interface DirtyBucket {
|
|
46
|
+
bucket: string;
|
|
47
|
+
definitionId: BucketDefinitionId | null;
|
|
48
|
+
estimatedCount: number;
|
|
49
|
+
dirtyRatio?: number;
|
|
50
|
+
}
|
|
51
|
+
export declare abstract class MongoCompactor {
|
|
52
|
+
protected readonly storage: MongoSyncBucketStorage;
|
|
53
|
+
protected readonly db: VersionedPowerSyncMongo;
|
|
54
|
+
protected updates: mongo.AnyBulkWriteOperation<BucketDataDocumentGeneric>[];
|
|
55
|
+
protected bucketStateUpdates: mongo.AnyBulkWriteOperation<BucketStateDocumentBase>[];
|
|
56
|
+
protected readonly idLimitBytes: number;
|
|
57
|
+
protected readonly moveBatchLimit: number;
|
|
58
|
+
protected readonly moveBatchQueryLimit: number;
|
|
59
|
+
protected readonly clearBatchLimit: number;
|
|
60
|
+
protected readonly minBucketChanges: number;
|
|
61
|
+
protected readonly minChangeRatio: number;
|
|
62
|
+
protected readonly maxOpId: bigint;
|
|
63
|
+
protected readonly buckets: string[] | undefined;
|
|
64
|
+
protected readonly signal?: AbortSignal;
|
|
65
|
+
protected readonly group_id: number;
|
|
66
|
+
protected readonly logger: Logger;
|
|
67
|
+
constructor(storage: MongoSyncBucketStorage, db: VersionedPowerSyncMongo, options: MongoCompactOptions);
|
|
68
|
+
/**
|
|
69
|
+
* Compact buckets by converting operations into MOVE and/or CLEAR operations.
|
|
47
70
|
*
|
|
48
|
-
*
|
|
49
|
-
* @param op op_id of the last non-PUT operation, which will be converted to CLEAR.
|
|
71
|
+
* See /docs/compacting-operations.md for details.
|
|
50
72
|
*/
|
|
51
|
-
|
|
73
|
+
compact(): Promise<void>;
|
|
52
74
|
/**
|
|
53
75
|
* Subset of compact, only populating checksums where relevant.
|
|
54
76
|
*/
|
|
55
77
|
populateChecksums(options: {
|
|
56
78
|
minBucketChanges: number;
|
|
57
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>;
|
|
58
93
|
/**
|
|
59
|
-
*
|
|
60
|
-
*
|
|
61
|
-
* Can be used to iterate through all buckets.
|
|
94
|
+
* Compaction for a single bucket, with retries on failure.
|
|
62
95
|
*
|
|
63
|
-
*
|
|
64
|
-
* minChangeRatio: minimum ratio of changes to total ops for a bucket to be included in the results, number between 0 and 1.
|
|
96
|
+
* This covers against occasional network or other database errors during a long compact job.
|
|
65
97
|
*/
|
|
66
|
-
|
|
98
|
+
protected compactSingleBucketRetried(bucket: string, definitionId?: BucketDefinitionId | null): Promise<void>;
|
|
99
|
+
protected compactSingleBucket(bucket: string, definitionId?: BucketDefinitionId | null): Promise<void>;
|
|
100
|
+
protected updateBucketChecksums(state: CurrentBucketState): void;
|
|
101
|
+
protected flush(col: SingleBucketStore): Promise<void>;
|
|
102
|
+
private flushBucketStateUpdates;
|
|
67
103
|
/**
|
|
68
|
-
*
|
|
69
|
-
*
|
|
70
|
-
* This cannot be used to iterate on its own - the client is expected to process these buckets and
|
|
71
|
-
* set estimate_since_compact.count: 0 when done, before fetching the next batch.
|
|
72
|
-
*
|
|
73
|
-
* Unlike dirtyBucketBatches, used for compacting, this is specifically designed to be resuamble after a restart,
|
|
74
|
-
* since it is used as the last step for initial replication.
|
|
104
|
+
* Perform a CLEAR compact for a bucket.
|
|
75
105
|
*
|
|
76
|
-
*
|
|
106
|
+
* @param currentState tracks the last non-PUT op, which will be converted to CLEAR.
|
|
77
107
|
*/
|
|
78
|
-
|
|
79
|
-
|
|
108
|
+
protected clearBucket(currentState: CurrentBucketState, col: SingleBucketStore): Promise<void>;
|
|
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>;
|
|
115
|
+
}
|
|
116
|
+
export interface BucketDataCollectionContext<TBucketData extends mongo.Document> {
|
|
117
|
+
bucketKey: BucketKey;
|
|
118
|
+
collection: mongo.Collection<TBucketData>;
|
|
80
119
|
}
|
|
120
|
+
export {};
|