@powersync/service-module-mongodb-storage 0.20.0 → 0.21.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 +45 -0
- package/dist/storage/MongoBucketStorage.d.ts +31 -3
- package/dist/storage/MongoBucketStorage.js +365 -206
- package/dist/storage/MongoBucketStorage.js.map +1 -1
- package/dist/storage/implementation/MongoBucketBatch.d.ts +15 -4
- package/dist/storage/implementation/MongoBucketBatch.js +35 -9
- package/dist/storage/implementation/MongoBucketBatch.js.map +1 -1
- package/dist/storage/implementation/MongoCompactor.d.ts +19 -79
- package/dist/storage/implementation/MongoCompactor.js +27 -238
- package/dist/storage/implementation/MongoCompactor.js.map +1 -1
- package/dist/storage/implementation/MongoParameterCompactor.d.ts +83 -10
- package/dist/storage/implementation/MongoParameterCompactor.js +309 -96
- package/dist/storage/implementation/MongoParameterCompactor.js.map +1 -1
- package/dist/storage/implementation/MongoParsedSyncConfigSet.d.ts +9 -1
- package/dist/storage/implementation/MongoParsedSyncConfigSet.js +29 -0
- package/dist/storage/implementation/MongoParsedSyncConfigSet.js.map +1 -1
- package/dist/storage/implementation/MongoPersistedSyncConfigContent.js +4 -2
- package/dist/storage/implementation/MongoPersistedSyncConfigContent.js.map +1 -1
- package/dist/storage/implementation/MongoStorageProvider.js +3 -1
- package/dist/storage/implementation/MongoStorageProvider.js.map +1 -1
- package/dist/storage/implementation/MongoSyncBucketStorage.d.ts +27 -11
- package/dist/storage/implementation/MongoSyncBucketStorage.js +78 -31
- package/dist/storage/implementation/MongoSyncBucketStorage.js.map +1 -1
- package/dist/storage/implementation/MongoSyncRulesLock.js +21 -9
- package/dist/storage/implementation/MongoSyncRulesLock.js.map +1 -1
- package/dist/storage/implementation/MongoWriteCheckpointAPI.d.ts +9 -7
- package/dist/storage/implementation/MongoWriteCheckpointAPI.js +7 -28
- 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 +27 -0
- package/dist/storage/implementation/common/PersistedBatch.js +43 -2
- package/dist/storage/implementation/common/PersistedBatch.js.map +1 -1
- package/dist/storage/implementation/db.d.ts +4 -1
- package/dist/storage/implementation/db.js +14 -1
- package/dist/storage/implementation/db.js.map +1 -1
- package/dist/storage/implementation/models.d.ts +31 -0
- package/dist/storage/implementation/models.js.map +1 -1
- package/dist/storage/implementation/v1/MongoBucketBatchV1.d.ts +2 -0
- package/dist/storage/implementation/v1/MongoBucketBatchV1.js +22 -0
- package/dist/storage/implementation/v1/MongoBucketBatchV1.js.map +1 -1
- package/dist/storage/implementation/v1/MongoCompactorV1.d.ts +36 -5
- package/dist/storage/implementation/v1/MongoCompactorV1.js +229 -8
- package/dist/storage/implementation/v1/MongoCompactorV1.js.map +1 -1
- package/dist/storage/implementation/v1/MongoParameterCompactorV1.d.ts +16 -2
- package/dist/storage/implementation/v1/MongoParameterCompactorV1.js +20 -9
- package/dist/storage/implementation/v1/MongoParameterCompactorV1.js.map +1 -1
- package/dist/storage/implementation/v1/MongoSyncBucketStorageV1.d.ts +18 -11
- package/dist/storage/implementation/v1/MongoSyncBucketStorageV1.js +65 -16
- package/dist/storage/implementation/v1/MongoSyncBucketStorageV1.js.map +1 -1
- package/dist/storage/implementation/v1/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 +8 -1
- package/dist/storage/implementation/v3/MongoBucketBatchV3.js +90 -19
- package/dist/storage/implementation/v3/MongoBucketBatchV3.js.map +1 -1
- package/dist/storage/implementation/v3/MongoCompactorV3.d.ts +77 -25
- package/dist/storage/implementation/v3/MongoCompactorV3.js +585 -141
- package/dist/storage/implementation/v3/MongoCompactorV3.js.map +1 -1
- package/dist/storage/implementation/v3/MongoParameterCompactorV3.d.ts +18 -0
- package/dist/storage/implementation/v3/MongoParameterCompactorV3.js +23 -0
- package/dist/storage/implementation/v3/MongoParameterCompactorV3.js.map +1 -0
- package/dist/storage/implementation/v3/MongoStoppedSyncConfigCleanup.d.ts +2 -15
- package/dist/storage/implementation/v3/MongoStoppedSyncConfigCleanup.js +60 -92
- package/dist/storage/implementation/v3/MongoStoppedSyncConfigCleanup.js.map +1 -1
- package/dist/storage/implementation/v3/MongoSyncBucketStorageV3.d.ts +19 -9
- package/dist/storage/implementation/v3/MongoSyncBucketStorageV3.js +91 -31
- package/dist/storage/implementation/v3/MongoSyncBucketStorageV3.js.map +1 -1
- package/dist/storage/implementation/v3/MongoWriteCheckpointAPIV3.d.ts +26 -0
- package/dist/storage/implementation/v3/MongoWriteCheckpointAPIV3.js +82 -0
- package/dist/storage/implementation/v3/MongoWriteCheckpointAPIV3.js.map +1 -0
- package/dist/storage/implementation/v3/PersistedBatchV3.d.ts +2 -0
- package/dist/storage/implementation/v3/PersistedBatchV3.js +52 -11
- package/dist/storage/implementation/v3/PersistedBatchV3.js.map +1 -1
- package/dist/storage/implementation/v3/VersionedPowerSyncMongoV3.d.ts +12 -2
- package/dist/storage/implementation/v3/VersionedPowerSyncMongoV3.js +42 -3
- package/dist/storage/implementation/v3/VersionedPowerSyncMongoV3.js.map +1 -1
- package/dist/storage/implementation/v3/bucket-format.js +2 -0
- package/dist/storage/implementation/v3/bucket-format.js.map +1 -1
- package/dist/storage/implementation/v3/compact-utils.d.ts +107 -0
- package/dist/storage/implementation/v3/compact-utils.js +216 -0
- package/dist/storage/implementation/v3/compact-utils.js.map +1 -0
- package/dist/storage/implementation/v3/compaction-constants.d.ts +5 -0
- package/dist/storage/implementation/v3/compaction-constants.js +6 -0
- package/dist/storage/implementation/v3/compaction-constants.js.map +1 -0
- package/dist/storage/implementation/v3/models.d.ts +84 -4
- package/dist/storage/implementation/v3/models.js.map +1 -1
- package/dist/storage/implementation/v3/object-storage/BucketDataObjectStorage.d.ts +7 -8
- package/dist/storage/implementation/v3/object-storage/BucketDataObjectStorage.js +8 -4
- 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 +3 -5
- package/dist/storage/implementation/v3/object-storage/ObjectStorageLifecycle.js +10 -2
- package/dist/storage/implementation/v3/object-storage/ObjectStorageLifecycle.js.map +1 -1
- package/dist/storage/implementation/v3/object-storage/ObjectStorageUsage.d.ts +37 -0
- package/dist/storage/implementation/v3/object-storage/ObjectStorageUsage.js +167 -0
- package/dist/storage/implementation/v3/object-storage/ObjectStorageUsage.js.map +1 -0
- package/dist/storage/implementation/v3/object-storage/S3ObjectStorage.d.ts +37 -12
- package/dist/storage/implementation/v3/object-storage/S3ObjectStorage.js +177 -23
- package/dist/storage/implementation/v3/object-storage/S3ObjectStorage.js.map +1 -1
- package/dist/storage/implementation/v3/source-table-utils.d.ts +6 -6
- package/dist/storage/implementation/v3/source-table-utils.js +30 -37
- package/dist/storage/implementation/v3/source-table-utils.js.map +1 -1
- package/dist/storage/storage-index.d.ts +2 -1
- package/dist/storage/storage-index.js +1 -0
- package/dist/storage/storage-index.js.map +1 -1
- package/dist/types/types.d.ts +23 -1
- package/dist/types/types.js +16 -7
- package/dist/types/types.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 +495 -268
- package/src/storage/implementation/MongoBucketBatch.ts +54 -14
- package/src/storage/implementation/MongoCompactor.ts +35 -346
- package/src/storage/implementation/MongoParameterCompactor.ts +388 -102
- package/src/storage/implementation/MongoParsedSyncConfigSet.ts +34 -0
- package/src/storage/implementation/MongoPersistedSyncConfigContent.ts +4 -2
- package/src/storage/implementation/MongoStorageProvider.ts +3 -1
- package/src/storage/implementation/MongoSyncBucketStorage.ts +114 -40
- package/src/storage/implementation/MongoSyncRulesLock.ts +22 -9
- package/src/storage/implementation/MongoWriteCheckpointAPI.ts +12 -44
- package/src/storage/implementation/SyncRuleStateUpdate.ts +13 -6
- package/src/storage/implementation/common/MongoSyncBucketStorageCheckpoint.ts +24 -2
- package/src/storage/implementation/common/PersistedBatch.ts +54 -2
- package/src/storage/implementation/db.ts +21 -2
- package/src/storage/implementation/models.ts +34 -0
- package/src/storage/implementation/v1/MongoBucketBatchV1.ts +31 -0
- package/src/storage/implementation/v1/MongoCompactorV1.ts +303 -19
- package/src/storage/implementation/v1/MongoParameterCompactorV1.ts +25 -9
- package/src/storage/implementation/v1/MongoSyncBucketStorageV1.ts +87 -27
- 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 +124 -22
- package/src/storage/implementation/v3/MongoCompactorV3.ts +744 -190
- package/src/storage/implementation/v3/MongoParameterCompactorV3.ts +34 -0
- package/src/storage/implementation/v3/MongoStoppedSyncConfigCleanup.ts +100 -109
- package/src/storage/implementation/v3/MongoSyncBucketStorageV3.ts +111 -41
- package/src/storage/implementation/v3/MongoWriteCheckpointAPIV3.ts +111 -0
- package/src/storage/implementation/v3/PersistedBatchV3.ts +57 -12
- package/src/storage/implementation/v3/VersionedPowerSyncMongoV3.ts +55 -4
- package/src/storage/implementation/v3/bucket-format.ts +2 -0
- package/src/storage/implementation/v3/compact-utils.ts +320 -0
- package/src/storage/implementation/v3/compaction-constants.ts +5 -0
- package/src/storage/implementation/v3/models.ts +91 -3
- package/src/storage/implementation/v3/object-storage/BucketDataObjectStorage.ts +16 -8
- package/src/storage/implementation/v3/object-storage/ObjectStorage.ts +20 -5
- package/src/storage/implementation/v3/object-storage/ObjectStorageLifecycle.ts +15 -4
- package/src/storage/implementation/v3/object-storage/ObjectStorageUsage.ts +230 -0
- package/src/storage/implementation/v3/object-storage/S3ObjectStorage.ts +257 -27
- package/src/storage/implementation/v3/source-table-utils.ts +39 -41
- package/src/storage/storage-index.ts +2 -0
- package/src/types/types.ts +24 -7
- package/src/utils/util.ts +3 -1
- package/test/src/__snapshots__/storage.test.ts.snap +25 -0
- package/test/src/__snapshots__/storage_sync.test.ts.snap +605 -16
- package/test/src/cleanup-stopped-sync-configs.test.ts +40 -13
- package/test/src/compact-utils.test.ts +226 -0
- package/test/src/helpers/MemoryObjectStorage.ts +14 -6
- package/test/src/object_storage_usage.test.ts +255 -0
- package/test/src/parameter_compacting_v1.test.ts +120 -0
- package/test/src/parameter_compacting_v3.test.ts +192 -0
- package/test/src/parameter_compaction_fence.test.ts +276 -0
- package/test/src/storage.test.ts +273 -22
- package/test/src/storage_compacting.test.ts +714 -244
- package/test/src/storage_s3_checksums.test.ts +3 -4
- package/test/src/storage_s3_compaction_lifecycle.test.ts +138 -12
- package/test/src/storage_s3_reading.test.ts +243 -1
- package/test/src/storage_s3_writing.test.ts +1 -0
- package/test/src/storage_sync.test.ts +336 -41
- package/test/src/util.ts +1 -1
- package/tsconfig.tsbuildinfo +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compact-utils.js","sourceRoot":"","sources":["../../../../src/storage/implementation/v3/compact-utils.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,yBAAyB,EAAE,MAAM,mCAAmC,CAAC;AAC9E,OAAO,EAAE,YAAY,EAAgB,MAAM,yBAAyB,CAAC;AAErE,OAAO,EAAE,oBAAoB,EAAmB,MAAM,sBAAsB,CAAC;AAG7E;;;;;;;GAOG;AACH,MAAM,sBAAsB,GAAG,CAAC,CAAC;AAEjC,MAAM,CAAC,MAAM,iCAAiC,GAAG,EAAE,GAAG,IAAI,CAAC;AAsB3D,MAAM,CAAN,IAAY,cAGX;AAHD,WAAY,cAAc;IACxB,+BAAa,CAAA;IACb,mCAAiB,CAAA;AACnB,CAAC,EAHW,cAAc,KAAd,cAAc,QAGzB;AAcD,MAAM,OAAO,iBAAiB;IAEjB;IACA;IACA;IACA;IACA;IALX,YACW,KAAsB,EACtB,IAAoB,EACpB,QAA4B,EAC5B,mBAAqC,EACrC,QAAsB;QAJtB,UAAK,GAAL,KAAK,CAAiB;QACtB,SAAI,GAAJ,IAAI,CAAgB;QACpB,aAAQ,GAAR,QAAQ,CAAoB;QAC5B,wBAAmB,GAAnB,mBAAmB,CAAkB;QACrC,aAAQ,GAAR,QAAQ,CAAc;IAC9B,CAAC;IAEJ,IAAI,KAAK;QACP,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;IAC1B,CAAC;IAED,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC;IAC9B,CAAC;IAED,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;IAC3B,CAAC;CACF;AAoBD,MAAM,UAAU,WAAW,CAAC,KAA4B;IACtD,OAAO;QACL,KAAK,EAAE,KAAK,CAAC,YAAY,CAAC,KAAK;QAC/B,KAAK,EAAE,KAAK,CAAC,YAAY,CAAC,KAAK;QAC/B,MAAM,EAAE,KAAK,CAAC,YAAY,CAAC,MAAM;KAClC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;AACzD,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC9B,QAAmE;IAEnE,OAAO;QACL,KAAK,EAAE,QAAQ,CAAC,KAAK;QACrB,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;QAC5B,MAAM,EAAE,CAAC;QACT,QAAQ,EAAE,YAAY,CAAC,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;KACrD,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,SAA8E;IAE9E,IAAI,MAAM,GAAG,gBAAgB,EAAE,CAAC;IAChC,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,MAAM,GAAG,oBAAoB,CAAC,MAAM,EAAE,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC;IACpE,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,oEAAoE;AACpE,MAAM,UAAU,qBAAqB,CAAC,KAA4B;IAChE,IAAI,KAAK,CAAC,uBAAuB,IAAI,IAAI,EAAE,CAAC;QAC1C,MAAM,IAAI,yBAAyB,CAAC,uBAAuB,KAAK,CAAC,GAAG,CAAC,CAAC,iCAAiC,CAAC,CAAC;IAC3G,CAAC;IACD,OAAO,KAAK,CAAC,uBAAuB,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,QAA+D,EAC/D,aAAsC,EACtC,yBAAkD;IAElD,OAAO;QACL,KAAK,EAAE,QAAQ,CAAC,KAAK,GAAG,yBAAyB,CAAC,KAAK,GAAG,aAAa,CAAC,KAAK;QAC7E,KAAK,EAAE,QAAQ,CAAC,KAAK,GAAG,yBAAyB,CAAC,KAAK,GAAG,aAAa,CAAC,KAAK;QAC7E,MAAM,EAAE,QAAQ,CAAC,MAAM,GAAG,CAAC,GAAG,aAAa,CAAC,MAAM;QAClD,QAAQ,EAAE,YAAY,CACpB,YAAY,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,yBAAyB,CAAC,QAAQ,CAAC,EAC5E,aAAa,CAAC,QAAQ,CACvB;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,KAA8B,EAC9B,MAA+B;IAE/B,OAAO;QACL,KAAK,EAAE,KAAK,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK;QACjC,KAAK,EAAE,KAAK,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK;QACjC,MAAM,EAAE,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM;QACpC,QAAQ,EAAE,YAAY,CAAC,KAAK,CAAC,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC;KACxD,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,KAAkB,EAClB,MAA+B,EAC/B,KAA8B;IAE9B,OAAO;QACL,KAAK,EAAE,KAAK,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK;QAC/C,KAAK,EAAE,KAAK,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK;QAC/C,MAAM,EAAE,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM;KACpD,CAAC;AACJ,CAAC;AAED,sEAAsE;AACtE,MAAM,UAAU,qBAAqB,CACnC,KAA8B,EAC9B,MAA+B,EAC/B,KAA8B;IAE9B,OAAO;QACL,GAAG,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC;QAC7C,QAAQ,EAAE,YAAY,CAAC,YAAY,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,KAAK,CAAC,QAAQ,CAAC;KACvF,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,uBAAuB,CAAC,KAA4B;IAClE,OAAO;QACL,GAAG,EAAE,KAAK,CAAC,GAAG;QACd,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,kBAAkB,EAAE,KAAK,CAAC,kBAAkB;QAC5C,uBAAuB,EAAE,KAAK,CAAC,uBAAuB,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE;QAC5E,YAAY,EAAE,KAAK,CAAC,YAAY;QAChC,eAAe,EAAE,KAAK,CAAC,eAAe,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE;QAC5D,iBAAiB,EAAE,KAAK,CAAC,iBAAiB,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE;QAChE,GAAG,oBAAoB;KACxB,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CAAC,KAA4B,EAAE,MAA6B;IAC/F,MAAM,UAAU,GAAG,qBAAqB,CAAC,KAAK,CAAC,CAAC;IAChD,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;IACjC,MAAM,QAAQ,GAAG,KAAK,CAAC,iBAAiB,CAAC;IAEzC,wDAAwD;IACxD,gGAAgG;IAChG,+EAA+E;IAC/E,MAAM,gBAAgB,GAAG,QAAQ,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IACpG,MAAM,aAAa,GAAG,QAAQ,EAAE,IAAI,IAAI,CAAC,CAAC;IAE1C,iGAAiG;IACjG,8IAA8I;IAC9I,4GAA4G;IAC5G,mFAAmF;IACnF,MAAM,KAAK,GAAG,gBAAgB,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,gBAAgB,GAAG,CAAC,aAAa,GAAG,gBAAgB,CAAC,CAAC;IAChG,MAAM,cAAc,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,wBAAwB,CAAC,CAAC,CAAC,MAAM,CAAC,wBAAwB,GAAG,KAAK,CAAC;IAC9G,OAAO,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,cAAc,EAAE,MAAM,CAAC,wBAAwB,CAAC,CAAC,CAAC;AACpG,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,KAA4B,EAC5B,GAAS,EACT,MAA6B;IAE7B,gEAAgE;IAChE,4GAA4G;IAC5G,yEAAyE;IACzE,0BAA0B;IAC1B,MAAM,WAAW,GAAG,qBAAqB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IACzD,yEAAyE;IACzE,+DAA+D;IAC/D,MAAM,mBAAmB,GAAG,IAAI,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,GAAG,iCAAiC,CAAC,CAAC;IAChG,MAAM,SAAS,GAAG,KAAK,CAAC,eAAe,CAAC;IACxC,MAAM,kBAAkB,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,SAAS,EAAE,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC;IAC7F,MAAM,mBAAmB,GAAG,kBAAkB,IAAI,sBAAsB,CAAC;IACzE,MAAM,cAAc,GAClB,SAAS,IAAI,IAAI,IAAI,GAAG,CAAC,OAAO,EAAE,GAAG,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,IAAI,MAAM,CAAC,yBAAyB,CAAC;IAClG,6EAA6E;IAC7E,oFAAoF;IACpF,MAAM,gBAAgB,GAAmB,CAAC,mBAAmB;QAC3D,CAAC,CAAC,mBAAmB;QACrB,CAAC,CAAC;YACE,IAAI,EAAE;gBACJ,mBAAmB;gBACnB,EAAE,QAAQ,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,CAAC,yBAAyB,EAAE,EAAE;aACpG;SACF,CAAC;IACN,IAAI,IAAI,GAA0B,IAAI,CAAC;IACvC,IAAI,GAAG,IAAI,WAAW,EAAE,CAAC;QACvB,IAAI,GAAG,cAAc,CAAC,IAAI,CAAC;IAC7B,CAAC;SAAM,IAAI,cAAc,IAAI,mBAAmB,EAAE,CAAC;QACjD,IAAI,GAAG,cAAc,CAAC,MAAM,CAAC;IAC/B,CAAC;IACD,OAAO;QACL,IAAI;QACJ,gBAAgB;KACjB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,KAA4B,EAC5B,SAAqC,EACrC,MAA2B;IAE3B,IAAI,SAAS,IAAI,IAAI,EAAE,CAAC;QACtB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,IAAI,IAAI,IAAI,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC;IACnH,OAAO,KAAK,CAAC,eAAe,IAAI,IAAI,IAAI,KAAK,CAAC,eAAe,CAAC,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC;AACnG,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,MAAqD,EACrD,OAAqD;IAErD,MAAM,SAAS,GAA2B,EAAE,CAAC;IAC7C,IAAI,eAAe,GAAG,CAAC,CAAC;IAExB,IAAI,CAAC;QACH,IAAI,KAAK,EAAE,MAAM,QAAQ,IAAI,MAAM,EAAE,CAAC;YACpC,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,IAAI,eAAe,GAAG,QAAQ,CAAC,IAAI,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;gBAChF,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;YACtC,CAAC;YAED,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACzB,eAAe,IAAI,QAAQ,CAAC,IAAI,CAAC;YAEjC,IAAI,SAAS,CAAC,MAAM,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;gBAC9C,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;YACtC,CAAC;QACH,CAAC;QACD,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IACvC,CAAC;YAAS,CAAC;QACT,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Writers use this delay before scheduling their first chunk compaction.
|
|
3
|
+
* Initial replication includes the same delay when it picks up that work.
|
|
4
|
+
*/
|
|
5
|
+
export const DEFAULT_MIN_COMPACT_CHUNK_INTERVAL_MS = 5 * 60 * 1000;
|
|
6
|
+
//# sourceMappingURL=compaction-constants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compaction-constants.js","sourceRoot":"","sources":["../../../../src/storage/implementation/v3/compaction-constants.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,CAAC,MAAM,qCAAqC,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { InternalOpId, JsonValue, PersistedDefinitionMapping, SerializedSyncPlan, SyncRuleState } from '@powersync/service-core';
|
|
2
|
-
import { BucketDefinitionId, ParameterIndexId, ScopedParameterLookup, SqliteJsonValue } from '@powersync/service-sync-rules';
|
|
2
|
+
import { BucketDefinitionId, EventDefinitionId, ParameterIndexId, ScopedParameterLookup, SqliteJsonValue } from '@powersync/service-sync-rules';
|
|
3
3
|
import * as bson from 'bson';
|
|
4
|
-
import { BucketDataKey, BucketParameterDocumentBase,
|
|
4
|
+
import { BucketDataKey, BucketParameterDocumentBase, CurrentBucket, OpType, ReplicaId, SourceTableDocumentSnapshotStatus, SourceTableKey, SyncRuleCheckpointFields, SyncRuleDocumentBase, TaggedBucketParameterDocument } from '../models.js';
|
|
5
5
|
/**
|
|
6
6
|
* Embedded in sync_rules.sync_configs.
|
|
7
7
|
*/
|
|
@@ -71,6 +71,8 @@ export interface SyncConfigDefinition {
|
|
|
71
71
|
*/
|
|
72
72
|
replication_stream_id: number;
|
|
73
73
|
content: string;
|
|
74
|
+
/** Optional operator-supplied label identifying this sync config version. */
|
|
75
|
+
version_label?: string;
|
|
74
76
|
serialized_plan?: SerializedSyncPlan | null;
|
|
75
77
|
rule_mapping: PersistedDefinitionMapping;
|
|
76
78
|
}
|
|
@@ -113,22 +115,68 @@ export interface SourceTableDocumentV3 {
|
|
|
113
115
|
snapshot_status: SourceTableDocumentSnapshotStatus | undefined;
|
|
114
116
|
bucket_data_source_ids: BucketDefinitionId[];
|
|
115
117
|
parameter_lookup_source_ids: ParameterIndexId[];
|
|
118
|
+
/**
|
|
119
|
+
* Stream-local ids of the compiled event definitions evaluated by this source table.
|
|
120
|
+
*/
|
|
121
|
+
event_definition_ids: EventDefinitionId[];
|
|
116
122
|
latest_pending_delete?: InternalOpId | undefined;
|
|
117
123
|
/**
|
|
118
124
|
* Source-specific metadata. Absent for legacy records.
|
|
119
125
|
*/
|
|
120
126
|
source_metadata?: JsonValue;
|
|
121
127
|
}
|
|
122
|
-
export interface BucketStateDocumentV3
|
|
123
|
-
_id:
|
|
128
|
+
export interface BucketStateDocumentV3 {
|
|
129
|
+
_id: {
|
|
130
|
+
b: string;
|
|
124
131
|
d: BucketDefinitionId;
|
|
125
132
|
};
|
|
133
|
+
/** Must always identify an actual operation in this logical stream. */
|
|
134
|
+
last_op: bigint;
|
|
135
|
+
/** The next time a compact worker should inspect this bucket. */
|
|
136
|
+
next_compact_check: Date | undefined;
|
|
137
|
+
/**
|
|
138
|
+
* Scheduling epoch for work not covered by a full compact. Writers set the
|
|
139
|
+
* first actual write time; a partial full compact advances it to completion.
|
|
140
|
+
*/
|
|
141
|
+
first_uncompacted_write: Date | undefined;
|
|
142
|
+
/**
|
|
143
|
+
* A checksum cache and the statistics captured by the latest compact (full
|
|
144
|
+
* or chunk). Keeping these separate from bucket_stats lets writers only
|
|
145
|
+
* update one set of counters.
|
|
146
|
+
*/
|
|
147
|
+
compacted_state?: {
|
|
148
|
+
op_id: InternalOpId;
|
|
149
|
+
checksum: bigint;
|
|
150
|
+
count: number;
|
|
151
|
+
bytes: bigint;
|
|
152
|
+
at: Date;
|
|
153
|
+
chunks: number;
|
|
154
|
+
};
|
|
155
|
+
/** Statistics for the prefix covered by the most recent full compact. */
|
|
156
|
+
last_full_compact?: {
|
|
157
|
+
op_id: InternalOpId;
|
|
158
|
+
count: number;
|
|
159
|
+
at: Date;
|
|
160
|
+
puts: number;
|
|
161
|
+
};
|
|
162
|
+
/** Current aggregate bucket statistics, maintained by writers and compactors. */
|
|
163
|
+
bucket_stats: {
|
|
164
|
+
count: number;
|
|
165
|
+
bytes: bigint;
|
|
166
|
+
chunks: number;
|
|
167
|
+
};
|
|
168
|
+
/** A short-lived ownership marker used to distribute bucket compaction. */
|
|
169
|
+
compact_lease?: {
|
|
170
|
+
expires_at: Date;
|
|
171
|
+
id: unknown;
|
|
172
|
+
};
|
|
126
173
|
}
|
|
127
174
|
export interface BucketOperation {
|
|
128
175
|
o: bigint;
|
|
129
176
|
op: OpType;
|
|
130
177
|
source_table?: bson.ObjectId;
|
|
131
178
|
source_key?: ReplicaId;
|
|
179
|
+
subkey?: string;
|
|
132
180
|
table?: string;
|
|
133
181
|
row_id?: string;
|
|
134
182
|
checksum: bigint;
|
|
@@ -138,6 +186,14 @@ export interface StorageRef {
|
|
|
138
186
|
path: string;
|
|
139
187
|
file_size: number;
|
|
140
188
|
}
|
|
189
|
+
export interface ObjectStorageUsageDocument {
|
|
190
|
+
_id: {
|
|
191
|
+
g: number;
|
|
192
|
+
w: string;
|
|
193
|
+
};
|
|
194
|
+
updated_at: Date;
|
|
195
|
+
definitions: Record<BucketDefinitionId, bigint>;
|
|
196
|
+
}
|
|
141
197
|
/** An S3 object that may be deleted once its grace period has elapsed. */
|
|
142
198
|
export interface ObjectStorageDeletionMarker {
|
|
143
199
|
_id: bson.ObjectId;
|
|
@@ -180,6 +236,30 @@ export interface BucketDataDocumentV3 {
|
|
|
180
236
|
*/
|
|
181
237
|
has_clear_op?: true;
|
|
182
238
|
}
|
|
239
|
+
/**
|
|
240
|
+
* v3 Custom checkpoints (new name for legacy write checkpoints) are related to
|
|
241
|
+
* a replication stream and a specific event (in a sync config) which created them.
|
|
242
|
+
* Unchanged events, between sync configs, can share the documents.
|
|
243
|
+
* For v3, we store each replication stream's custom checkpoint requests in their own collection:
|
|
244
|
+
* `custom_checkpoint_requests_${replicationStreamId}_${eventId}`
|
|
245
|
+
*/
|
|
246
|
+
export interface CustomCheckpointRequestDocumentV3 {
|
|
247
|
+
_id: bson.ObjectId;
|
|
248
|
+
user_id: string;
|
|
249
|
+
checkpoint: bigint;
|
|
250
|
+
/**
|
|
251
|
+
* Unlike managed write checkpoints, custom write checkpoints are flushed together with
|
|
252
|
+
* normal ops. This means we can assign an op_id for ordering / correlating with read checkpoints.
|
|
253
|
+
*
|
|
254
|
+
* This is not unique - multiple write checkpoints can have the same op_id.
|
|
255
|
+
*/
|
|
256
|
+
op_id?: InternalOpId;
|
|
257
|
+
/**
|
|
258
|
+
* Set when this checkpoint was created from a client-supplied checkpoint
|
|
259
|
+
* request rather than a persistent custom write checkpoint.
|
|
260
|
+
*/
|
|
261
|
+
checkpoint_requested_at?: Date | null;
|
|
262
|
+
}
|
|
183
263
|
export declare function serializeParameterLookup(lookup: ScopedParameterLookup): bson.Binary;
|
|
184
264
|
export declare function deserializeParameterLookup(lookup: bson.Binary, indexId: ParameterIndexId): SqliteJsonValue[];
|
|
185
265
|
export declare function taggedBucketParameterDocumentToTagged(document: TaggedBucketParameterDocument): BucketParameterDocumentV3;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"models.js","sourceRoot":"","sources":["../../../../src/storage/implementation/v3/models.ts"],"names":[],"mappings":"AAAA,OAAO,EAML,0BAA0B,IAAI,8BAA8B,EAC7D,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"models.js","sourceRoot":"","sources":["../../../../src/storage/implementation/v3/models.ts"],"names":[],"mappings":"AAAA,OAAO,EAML,0BAA0B,IAAI,8BAA8B,EAC7D,MAAM,yBAAyB,CAAC;AAQjC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AA4H7B,MAAM,UAAU,iCAAiC,CAAC,QAAuC;IACvF,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,QAAQ,CAAC;IAC5C,OAAO,IAAiC,CAAC;AAC3C,CAAC;AAkLD,MAAM,UAAU,wBAAwB,CAAC,MAA6B;IACpE,OAAO,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AACxE,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,MAAmB,EAAE,OAAyB;IACvF,OAAO,CAAC,OAAO,EAAE,EAAE,EAAE,GAAG,8BAA8B,CAAC,MAAM,CAAC,CAAC,CAAC;AAClE,CAAC;AAED,MAAM,UAAU,qCAAqC,CACnD,QAAuC;IAEvC,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,QAAQ,CAAC;IAC5C,OAAO,IAAiC,CAAC;AAC3C,CAAC"}
|
|
@@ -1,21 +1,20 @@
|
|
|
1
|
+
import { PerformanceTracer } from '@powersync/service-core';
|
|
1
2
|
import { BucketDataDocumentV3, BucketOperation } from '../models.js';
|
|
2
|
-
import { ObjectStorage } from './ObjectStorage.js';
|
|
3
|
+
import { ObjectStorage, ObjectStorageOperationOptions } from './ObjectStorage.js';
|
|
3
4
|
export declare class BucketDataObjectStorage {
|
|
4
5
|
private readonly storage;
|
|
5
6
|
constructor(storage: ObjectStorage);
|
|
6
|
-
store(path: string, ops: BucketOperation[]): Promise<{
|
|
7
|
+
store(path: string, ops: BucketOperation[], options?: ObjectStorageOperationOptions): Promise<{
|
|
7
8
|
fileSize: number;
|
|
8
9
|
}>;
|
|
9
|
-
retrieve(path: string, options:
|
|
10
|
-
|
|
11
|
-
}): Promise<BucketOperation[]>;
|
|
12
|
-
delete(paths: string[]): Promise<void>;
|
|
10
|
+
retrieve(path: string, options: ObjectStorageOperationOptions): Promise<BucketOperation[]>;
|
|
11
|
+
delete(paths: string[], options?: ObjectStorageOperationOptions): Promise<void>;
|
|
13
12
|
}
|
|
14
13
|
/**
|
|
15
14
|
* Load offloaded operations and patch them onto their MongoDB metadata documents.
|
|
16
15
|
* The object-storage implementation is responsible for limiting request
|
|
17
16
|
* concurrency across all callers.
|
|
18
17
|
*/
|
|
19
|
-
export declare function hydrateBucketDataDocuments(documents: BucketDataDocumentV3[], objectStorage: ObjectStorage | undefined, options: {
|
|
20
|
-
|
|
18
|
+
export declare function hydrateBucketDataDocuments(documents: BucketDataDocumentV3[], objectStorage: ObjectStorage | undefined, options: ObjectStorageOperationOptions & {
|
|
19
|
+
tracer?: PerformanceTracer<string>;
|
|
21
20
|
}): Promise<void>;
|
|
@@ -5,9 +5,9 @@ export class BucketDataObjectStorage {
|
|
|
5
5
|
constructor(storage) {
|
|
6
6
|
this.storage = storage;
|
|
7
7
|
}
|
|
8
|
-
async store(path, ops) {
|
|
8
|
+
async store(path, ops, options) {
|
|
9
9
|
const bsonBuffer = bson.serialize({ ops });
|
|
10
|
-
await this.storage.put(path, bsonBuffer, { contentType: 'application/bson', contentEncoding: null });
|
|
10
|
+
await this.storage.put(path, bsonBuffer, { contentType: 'application/bson', contentEncoding: null }, options);
|
|
11
11
|
return { fileSize: bsonBuffer.byteLength };
|
|
12
12
|
}
|
|
13
13
|
async retrieve(path, options) {
|
|
@@ -21,8 +21,8 @@ export class BucketDataObjectStorage {
|
|
|
21
21
|
const wrapper = bson.deserialize(data, storage.BSON_DESERIALIZE_INTERNAL_OPTIONS);
|
|
22
22
|
return wrapper.ops;
|
|
23
23
|
}
|
|
24
|
-
async delete(paths) {
|
|
25
|
-
return this.storage.delete(paths);
|
|
24
|
+
async delete(paths, options) {
|
|
25
|
+
return this.storage.delete(paths, options);
|
|
26
26
|
}
|
|
27
27
|
}
|
|
28
28
|
/**
|
|
@@ -37,6 +37,10 @@ export async function hydrateBucketDataDocuments(documents, objectStorage, optio
|
|
|
37
37
|
options.signal?.throwIfAborted();
|
|
38
38
|
const store = new BucketDataObjectStorage(objectStorage);
|
|
39
39
|
const storedDocuments = documents.filter((document) => document.storage_ref);
|
|
40
|
+
if (storedDocuments.length == 0) {
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
using _ = options?.tracer?.span('s3', 'read');
|
|
40
44
|
await Promise.all(storedDocuments.map(async (document) => {
|
|
41
45
|
document.ops = await store.retrieve(document.storage_ref.path, { signal: options.signal });
|
|
42
46
|
}));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BucketDataObjectStorage.js","sourceRoot":"","sources":["../../../../../src/storage/implementation/v3/object-storage/BucketDataObjectStorage.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"BucketDataObjectStorage.js","sourceRoot":"","sources":["../../../../../src/storage/implementation/v3/object-storage/BucketDataObjectStorage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqB,OAAO,EAAE,MAAM,yBAAyB,CAAC;AACrE,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAI7B,MAAM,OAAO,uBAAuB;IACL;IAA7B,YAA6B,OAAsB;QAAtB,YAAO,GAAP,OAAO,CAAe;IAAG,CAAC;IAEvD,KAAK,CAAC,KAAK,CACT,IAAY,EACZ,GAAsB,EACtB,OAAuC;QAEvC,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;QAC3C,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,UAAU,EAAE,EAAE,WAAW,EAAE,kBAAkB,EAAE,eAAe,EAAE,IAAI,EAAE,EAAE,OAAO,CAAC,CAAC;QAC9G,OAAO,EAAE,QAAQ,EAAE,UAAU,CAAC,UAAU,EAAE,CAAC;IAC7C,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,IAAY,EAAE,OAAsC;QACjE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;QACpF,IAAI,QAAQ,CAAC,eAAe,IAAI,IAAI,EAAE,CAAC;YACrC,MAAM,IAAI,KAAK,CAAC,gCAAgC,QAAQ,CAAC,eAAe,EAAE,CAAC,CAAC;QAC9E,CAAC;QACD,IAAI,QAAQ,CAAC,WAAW,KAAK,kBAAkB,EAAE,CAAC;YAChD,MAAM,IAAI,KAAK,CAAC,4BAA4B,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC;QACtE,CAAC;QACD,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,OAAO,CAAC,iCAAiC,CAAC,CAAC;QAClF,OAAO,OAAO,CAAC,GAAG,CAAC;IACrB,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,KAAe,EAAE,OAAuC;QACnE,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAC7C,CAAC;CACF;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAC9C,SAAiC,EACjC,aAAwC,EACxC,OAA+E;IAE/E,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,OAAO;IACT,CAAC;IAED,OAAO,CAAC,MAAM,EAAE,cAAc,EAAE,CAAC;IACjC,MAAM,KAAK,GAAG,IAAI,uBAAuB,CAAC,aAAa,CAAC,CAAC;IACzD,MAAM,eAAe,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IAC7E,IAAI,eAAe,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;QAChC,OAAO;IACT,CAAC;IACD,MAAM,CAAC,GAAG,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC9C,MAAM,OAAO,CAAC,GAAG,CACf,eAAe,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE;QACrC,QAAQ,CAAC,GAAG,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,WAAY,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC9F,CAAC,CAAC,CACH,CAAC;AACJ,CAAC"}
|
|
@@ -10,21 +10,24 @@ export declare class ObjectStorageError extends Error {
|
|
|
10
10
|
});
|
|
11
11
|
}
|
|
12
12
|
export declare function isRetryableObjectStorageError(error: unknown): error is ObjectStorageError;
|
|
13
|
+
export interface ObjectStorageOperationOptions {
|
|
14
|
+
/**
|
|
15
|
+
* Cancels the operation, including while it waits for a concurrency slot.
|
|
16
|
+
*
|
|
17
|
+
* Operations are bounded by their own timeouts regardless, but a signal releases the slot as
|
|
18
|
+
* soon as the caller no longer needs the result.
|
|
19
|
+
*/
|
|
20
|
+
signal?: AbortSignal;
|
|
21
|
+
}
|
|
13
22
|
export interface ObjectStorage {
|
|
14
|
-
put(path: string, data: Uint8Array, metadata: ObjectStoragePutMetadata): Promise<void>;
|
|
15
|
-
get(path: string, options?: {
|
|
16
|
-
signal?: AbortSignal;
|
|
17
|
-
}): Promise<{
|
|
23
|
+
put(path: string, data: Uint8Array, metadata: ObjectStoragePutMetadata, options?: ObjectStorageOperationOptions): Promise<void>;
|
|
24
|
+
get(path: string, options?: ObjectStorageOperationOptions): Promise<{
|
|
18
25
|
data: Uint8Array;
|
|
19
26
|
metadata: ObjectStoragePutMetadata;
|
|
20
27
|
}>;
|
|
21
|
-
list(prefix: string, options?:
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
delete(paths: string[]): Promise<void>;
|
|
25
|
-
deletePrefix(prefix: string, options?: {
|
|
26
|
-
signal?: AbortSignal;
|
|
27
|
-
}): Promise<{
|
|
28
|
+
list(prefix: string, options?: ObjectStorageOperationOptions): AsyncIterable<string>;
|
|
29
|
+
delete(paths: string[], options?: ObjectStorageOperationOptions): Promise<void>;
|
|
30
|
+
deletePrefix(prefix: string, options?: ObjectStorageOperationOptions): Promise<{
|
|
28
31
|
objectCount: number;
|
|
29
32
|
}>;
|
|
30
33
|
}
|
|
@@ -3,7 +3,7 @@ import { Logger } from '@powersync/lib-services-framework';
|
|
|
3
3
|
import * as bson from 'bson';
|
|
4
4
|
import { VersionedPowerSyncMongoV3 } from '../VersionedPowerSyncMongoV3.js';
|
|
5
5
|
import { BucketDataObjectStorage } from './BucketDataObjectStorage.js';
|
|
6
|
-
import { ObjectStorage } from './ObjectStorage.js';
|
|
6
|
+
import { ObjectStorage, ObjectStorageOperationOptions } from './ObjectStorage.js';
|
|
7
7
|
export declare const OBJECT_STORAGE_UPLOAD_LEASE_MS: number;
|
|
8
8
|
export declare const OBJECT_STORAGE_PUBLICATION_SAFETY_MARGIN_MS: number;
|
|
9
9
|
export declare const OBJECT_STORAGE_REFERENCE_GRACE_MS: number;
|
|
@@ -61,10 +61,8 @@ export declare class ObjectStorageLifecycle {
|
|
|
61
61
|
* Discover and delete objects by their storage prefix
|
|
62
62
|
* without touching the database.
|
|
63
63
|
*/
|
|
64
|
-
deletePrefix(prefix: string, options?: {
|
|
65
|
-
signal?: AbortSignal;
|
|
66
|
-
}): Promise<{
|
|
64
|
+
deletePrefix(prefix: string, options?: ObjectStorageOperationOptions): Promise<{
|
|
67
65
|
objectCount: number;
|
|
68
66
|
}>;
|
|
69
|
-
cleanup(logger: Logger): Promise<void>;
|
|
67
|
+
cleanup(logger: Logger, options?: ObjectStorageOperationOptions): Promise<void>;
|
|
70
68
|
}
|
|
@@ -116,7 +116,8 @@ export class ObjectStorageLifecycle {
|
|
|
116
116
|
async deletePrefix(prefix, options) {
|
|
117
117
|
return this.objectStorage.deletePrefix(prefix, { signal: options?.signal });
|
|
118
118
|
}
|
|
119
|
-
async cleanup(logger) {
|
|
119
|
+
async cleanup(logger, options) {
|
|
120
|
+
const signal = options?.signal;
|
|
120
121
|
const markers = this.db.pendingObjectStorageDeletes(this.replicationStreamId);
|
|
121
122
|
const cursor = markers.find({ delete_after: { $lte: new Date() } });
|
|
122
123
|
let batch = [];
|
|
@@ -127,14 +128,21 @@ export class ObjectStorageLifecycle {
|
|
|
127
128
|
const deleting = batch;
|
|
128
129
|
batch = [];
|
|
129
130
|
try {
|
|
130
|
-
await this.bucketData.delete(deleting.map((marker) => marker.path));
|
|
131
|
+
await this.bucketData.delete(deleting.map((marker) => marker.path), { signal });
|
|
131
132
|
await markers.deleteMany({ _id: { $in: deleting.map((marker) => marker._id) } });
|
|
132
133
|
}
|
|
133
134
|
catch (error) {
|
|
135
|
+
if (signal?.aborted) {
|
|
136
|
+
// Shutting down: stop instead of working through the remaining markers. They stay
|
|
137
|
+
// pending, and are cleaned up during the next compaction. Checked on the signal rather
|
|
138
|
+
// than the error, since a caller may abort with any reason.
|
|
139
|
+
throw error;
|
|
140
|
+
}
|
|
134
141
|
logger.warn('Failed to clean up object storage deletion markers; will retry during the next compaction', error);
|
|
135
142
|
}
|
|
136
143
|
};
|
|
137
144
|
for await (const marker of cursor) {
|
|
145
|
+
signal?.throwIfAborted();
|
|
138
146
|
batch.push(marker);
|
|
139
147
|
if (batch.length === 500) {
|
|
140
148
|
await deleteBatch();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ObjectStorageLifecycle.js","sourceRoot":"","sources":["../../../../../src/storage/implementation/v3/object-storage/ObjectStorageLifecycle.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"ObjectStorageLifecycle.js","sourceRoot":"","sources":["../../../../../src/storage/implementation/v3/object-storage/ObjectStorageLifecycle.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { mongo } from '@powersync/lib-service-mongodb';
|
|
2
|
+
import { BucketDefinitionId } from '@powersync/service-sync-rules';
|
|
3
|
+
import { BucketDataDocumentV3 } from '../models.js';
|
|
4
|
+
import { VersionedPowerSyncMongoV3 } from '../VersionedPowerSyncMongoV3.js';
|
|
5
|
+
export declare const OBJECT_STORAGE_USAGE_BASE_WRITER_ID = "__base__";
|
|
6
|
+
export declare const DEFAULT_OBJECT_STORAGE_USAGE_STALE_WRITER_MS: number;
|
|
7
|
+
export declare const DEFAULT_OBJECT_STORAGE_USAGE_FOLD_LIMIT = 100;
|
|
8
|
+
export interface ReplicationStreamObjectStorageDefinitionUsageResult {
|
|
9
|
+
replication_stream_id: number;
|
|
10
|
+
definition_id: BucketDefinitionId;
|
|
11
|
+
active_bytes: bigint;
|
|
12
|
+
}
|
|
13
|
+
export declare function createObjectStorageUsageWriterId(): string;
|
|
14
|
+
/**
|
|
15
|
+
* Tracks active S3 references. Values are signed writer-local deltas, so reference changes and
|
|
16
|
+
* accounting updates can be committed together without making replication and compaction share a
|
|
17
|
+
* hot counter document.
|
|
18
|
+
*/
|
|
19
|
+
export declare class ObjectStorageUsage {
|
|
20
|
+
private readonly db;
|
|
21
|
+
private readonly replicationStreamId;
|
|
22
|
+
readonly writerId?: string | undefined;
|
|
23
|
+
constructor(db: VersionedPowerSyncMongoV3, replicationStreamId: number, writerId?: string | undefined);
|
|
24
|
+
static bytes(document: Pick<BucketDataDocumentV3, 'storage_ref'>): bigint;
|
|
25
|
+
static readAllDefinitionUsage(db: VersionedPowerSyncMongoV3): Promise<ReplicationStreamObjectStorageDefinitionUsageResult[]>;
|
|
26
|
+
applyDelta(definitionId: BucketDefinitionId, delta: bigint, session: mongo.ClientSession): Promise<void>;
|
|
27
|
+
applyDeltas(deltas: ReadonlyMap<BucketDefinitionId, bigint>, session: mongo.ClientSession): Promise<void>;
|
|
28
|
+
removeDefinition(definitionId: BucketDefinitionId, session: mongo.ClientSession): Promise<void>;
|
|
29
|
+
removeStream(session: mongo.ClientSession): Promise<void>;
|
|
30
|
+
foldStaleWriterDeltas(options?: {
|
|
31
|
+
staleWriterMs?: number;
|
|
32
|
+
limit?: number;
|
|
33
|
+
}): Promise<void>;
|
|
34
|
+
private definitionPath;
|
|
35
|
+
private documentId;
|
|
36
|
+
private validateDefinitionId;
|
|
37
|
+
}
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
import * as lib_mongo from '@powersync/lib-service-mongodb';
|
|
2
|
+
import { ReplicationAssertionError } from '@powersync/lib-services-framework';
|
|
3
|
+
import { randomUUID } from 'node:crypto';
|
|
4
|
+
export const OBJECT_STORAGE_USAGE_BASE_WRITER_ID = '__base__';
|
|
5
|
+
export const DEFAULT_OBJECT_STORAGE_USAGE_STALE_WRITER_MS = 30 * 60 * 1000;
|
|
6
|
+
export const DEFAULT_OBJECT_STORAGE_USAGE_FOLD_LIMIT = 100;
|
|
7
|
+
export function createObjectStorageUsageWriterId() {
|
|
8
|
+
return randomUUID();
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Tracks active S3 references. Values are signed writer-local deltas, so reference changes and
|
|
12
|
+
* accounting updates can be committed together without making replication and compaction share a
|
|
13
|
+
* hot counter document.
|
|
14
|
+
*/
|
|
15
|
+
export class ObjectStorageUsage {
|
|
16
|
+
db;
|
|
17
|
+
replicationStreamId;
|
|
18
|
+
writerId;
|
|
19
|
+
constructor(db, replicationStreamId, writerId) {
|
|
20
|
+
this.db = db;
|
|
21
|
+
this.replicationStreamId = replicationStreamId;
|
|
22
|
+
this.writerId = writerId;
|
|
23
|
+
if (writerId === OBJECT_STORAGE_USAGE_BASE_WRITER_ID) {
|
|
24
|
+
throw new ReplicationAssertionError('The reserved object-storage usage writer id cannot be used by a writer');
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
static bytes(document) {
|
|
28
|
+
return BigInt(document.storage_ref?.file_size ?? 0);
|
|
29
|
+
}
|
|
30
|
+
static async readAllDefinitionUsage(db) {
|
|
31
|
+
return db.client.withSession({ snapshot: true }, async (session) => {
|
|
32
|
+
// Deliberately read the whole usage collection. The number of replication streams is
|
|
33
|
+
// expected to stay low, so a collection scan is cheaper than issuing one _id range query
|
|
34
|
+
// per stream (and the usage collection is bounded by streams and writers, not buckets).
|
|
35
|
+
const entries = await db.objectStorageUsage
|
|
36
|
+
.aggregate([
|
|
37
|
+
{ $project: { replication_stream_id: '$_id.g', definitions: { $objectToArray: '$definitions' } } },
|
|
38
|
+
{ $unwind: '$definitions' },
|
|
39
|
+
{
|
|
40
|
+
$group: {
|
|
41
|
+
_id: {
|
|
42
|
+
replication_stream_id: '$replication_stream_id',
|
|
43
|
+
definition_id: '$definitions.k'
|
|
44
|
+
},
|
|
45
|
+
active_bytes: { $sum: '$definitions.v' }
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
], { session, readConcern: 'snapshot' })
|
|
49
|
+
.toArray()
|
|
50
|
+
.catch((error) => {
|
|
51
|
+
if (lib_mongo.isMongoNamespaceNotFoundError(error)) {
|
|
52
|
+
return [];
|
|
53
|
+
}
|
|
54
|
+
throw error;
|
|
55
|
+
});
|
|
56
|
+
return entries.map((entry) => {
|
|
57
|
+
const activeBytes = BigInt(entry.active_bytes ?? 0);
|
|
58
|
+
if (activeBytes < 0n) {
|
|
59
|
+
return {
|
|
60
|
+
replication_stream_id: entry._id.replication_stream_id,
|
|
61
|
+
definition_id: entry._id.definition_id,
|
|
62
|
+
active_bytes: 0n
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
return {
|
|
66
|
+
replication_stream_id: entry._id.replication_stream_id,
|
|
67
|
+
definition_id: entry._id.definition_id,
|
|
68
|
+
active_bytes: activeBytes
|
|
69
|
+
};
|
|
70
|
+
});
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
async applyDelta(definitionId, delta, session) {
|
|
74
|
+
await this.applyDeltas(new Map([[definitionId, delta]]), session);
|
|
75
|
+
}
|
|
76
|
+
async applyDeltas(deltas, session) {
|
|
77
|
+
if (this.writerId == null) {
|
|
78
|
+
throw new ReplicationAssertionError('A writer id is required to apply object-storage usage');
|
|
79
|
+
}
|
|
80
|
+
const increments = {};
|
|
81
|
+
for (const [definitionId, delta] of deltas) {
|
|
82
|
+
if (delta === 0n) {
|
|
83
|
+
continue;
|
|
84
|
+
}
|
|
85
|
+
increments[this.definitionPath(definitionId)] = delta;
|
|
86
|
+
}
|
|
87
|
+
if (Object.keys(increments).length === 0) {
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
await this.db.objectStorageUsage.updateOne({ _id: this.documentId() }, {
|
|
91
|
+
$inc: increments,
|
|
92
|
+
$currentDate: { updated_at: true }
|
|
93
|
+
}, { upsert: true, session });
|
|
94
|
+
}
|
|
95
|
+
async removeDefinition(definitionId, session) {
|
|
96
|
+
await this.db.objectStorageUsage.updateMany({ '_id.g': this.replicationStreamId }, { $unset: { [this.definitionPath(definitionId)]: 1 } }, { session });
|
|
97
|
+
}
|
|
98
|
+
async removeStream(session) {
|
|
99
|
+
await this.db.objectStorageUsage.deleteMany({ '_id.g': this.replicationStreamId }, { session });
|
|
100
|
+
}
|
|
101
|
+
async foldStaleWriterDeltas(options = {}) {
|
|
102
|
+
const staleWriterMs = options.staleWriterMs ?? DEFAULT_OBJECT_STORAGE_USAGE_STALE_WRITER_MS;
|
|
103
|
+
const limit = options.limit ?? DEFAULT_OBJECT_STORAGE_USAGE_FOLD_LIMIT;
|
|
104
|
+
if (limit <= 0) {
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
await this.db.client.withSession((session) => session.withTransaction(async () => {
|
|
108
|
+
const staleDocuments = await this.db.objectStorageUsage
|
|
109
|
+
.find({
|
|
110
|
+
'_id.g': this.replicationStreamId,
|
|
111
|
+
'_id.w': { $ne: OBJECT_STORAGE_USAGE_BASE_WRITER_ID },
|
|
112
|
+
$expr: {
|
|
113
|
+
$lt: [
|
|
114
|
+
'$updated_at',
|
|
115
|
+
{ $dateSubtract: { startDate: '$$NOW', unit: 'millisecond', amount: staleWriterMs } }
|
|
116
|
+
]
|
|
117
|
+
}
|
|
118
|
+
}, { session, sort: { updated_at: 1 }, limit })
|
|
119
|
+
.toArray();
|
|
120
|
+
if (staleDocuments.length === 0) {
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
const deltas = new Map();
|
|
124
|
+
for (const document of staleDocuments) {
|
|
125
|
+
for (const [definitionId, delta] of Object.entries(document.definitions ?? {})) {
|
|
126
|
+
this.validateDefinitionId(definitionId);
|
|
127
|
+
deltas.set(definitionId, (deltas.get(definitionId) ?? 0n) + BigInt(delta));
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
const increments = {};
|
|
131
|
+
for (const [definitionId, delta] of deltas) {
|
|
132
|
+
if (delta !== 0n) {
|
|
133
|
+
increments[this.definitionPath(definitionId)] = delta;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
if (Object.keys(increments).length > 0) {
|
|
137
|
+
await this.db.objectStorageUsage.updateOne({ _id: this.documentId(OBJECT_STORAGE_USAGE_BASE_WRITER_ID) }, {
|
|
138
|
+
$inc: increments,
|
|
139
|
+
$currentDate: { updated_at: true }
|
|
140
|
+
}, { upsert: true, session });
|
|
141
|
+
}
|
|
142
|
+
await this.db.objectStorageUsage.deleteMany({
|
|
143
|
+
'_id.g': this.replicationStreamId,
|
|
144
|
+
_id: { $in: staleDocuments.map((document) => document._id) }
|
|
145
|
+
}, { session });
|
|
146
|
+
}, { readConcern: { level: 'snapshot' }, writeConcern: { w: 'majority' } }));
|
|
147
|
+
}
|
|
148
|
+
definitionPath(definitionId) {
|
|
149
|
+
this.validateDefinitionId(definitionId);
|
|
150
|
+
return `definitions.${definitionId}`;
|
|
151
|
+
}
|
|
152
|
+
documentId(writerId = this.writerId) {
|
|
153
|
+
if (writerId == null) {
|
|
154
|
+
throw new ReplicationAssertionError('A writer id is required to identify object-storage usage');
|
|
155
|
+
}
|
|
156
|
+
return {
|
|
157
|
+
g: this.replicationStreamId,
|
|
158
|
+
w: writerId
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
validateDefinitionId(definitionId) {
|
|
162
|
+
if (definitionId.length === 0 || definitionId.includes('.') || definitionId.includes('$')) {
|
|
163
|
+
throw new ReplicationAssertionError(`Invalid bucket definition id for object-storage usage: ${definitionId}`);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
//# sourceMappingURL=ObjectStorageUsage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ObjectStorageUsage.js","sourceRoot":"","sources":["../../../../../src/storage/implementation/v3/object-storage/ObjectStorageUsage.ts"],"names":[],"mappings":"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"}
|