@powersync/service-core 0.0.0-dev-20260602073133 → 0.0.0-dev-20260909133214
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +152 -4
- package/dist/api/RouteAPI.d.ts +42 -14
- package/dist/api/diagnostics.d.ts +12 -1
- package/dist/api/diagnostics.js +36 -22
- package/dist/api/diagnostics.js.map +1 -1
- package/dist/entry/commands/compact-action.js +30 -22
- package/dist/entry/commands/compact-action.js.map +1 -1
- package/dist/metrics/metrics-interfaces.d.ts +5 -1
- package/dist/metrics/metrics-interfaces.js.map +1 -1
- package/dist/metrics/open-telemetry/MetricAttributeFilteringExporter.d.ts +36 -0
- package/dist/metrics/open-telemetry/MetricAttributeFilteringExporter.js +70 -0
- package/dist/metrics/open-telemetry/MetricAttributeFilteringExporter.js.map +1 -0
- package/dist/metrics/open-telemetry/OpenTelemetryMetricsFactory.js +6 -1
- package/dist/metrics/open-telemetry/OpenTelemetryMetricsFactory.js.map +1 -1
- package/dist/metrics/open-telemetry/util.js +7 -3
- package/dist/metrics/open-telemetry/util.js.map +1 -1
- package/dist/modules/AbstractModule.d.ts +6 -2
- package/dist/modules/AbstractModule.js.map +1 -1
- package/dist/replication/AbstractReplicator.d.ts +31 -7
- package/dist/replication/AbstractReplicator.js +168 -74
- package/dist/replication/AbstractReplicator.js.map +1 -1
- package/dist/replication/ReplicationModule.d.ts +3 -3
- package/dist/replication/ReplicationModule.js.map +1 -1
- package/dist/routes/RouterEngine.d.ts +1 -0
- package/dist/routes/RouterEngine.js +6 -1
- package/dist/routes/RouterEngine.js.map +1 -1
- package/dist/routes/configure-fastify.d.ts +104 -56
- package/dist/routes/configure-fastify.js +15 -2
- package/dist/routes/configure-fastify.js.map +1 -1
- package/dist/routes/endpoints/admin.d.ts +42 -24
- package/dist/routes/endpoints/admin.js +49 -36
- package/dist/routes/endpoints/admin.js.map +1 -1
- package/dist/routes/endpoints/checkpointing.d.ts +62 -0
- package/dist/routes/endpoints/checkpointing.js +65 -7
- package/dist/routes/endpoints/checkpointing.js.map +1 -1
- package/dist/routes/endpoints/socket-route.js +3 -2
- package/dist/routes/endpoints/socket-route.js.map +1 -1
- package/dist/routes/endpoints/sync-rules.js +25 -14
- package/dist/routes/endpoints/sync-rules.js.map +1 -1
- package/dist/routes/endpoints/sync-stream.js +1 -1
- package/dist/routes/endpoints/sync-stream.js.map +1 -1
- package/dist/runner/teardown.js +8 -8
- package/dist/runner/teardown.js.map +1 -1
- package/dist/storage/BucketStorageBatch.d.ts +64 -17
- package/dist/storage/BucketStorageBatch.js.map +1 -1
- package/dist/storage/BucketStorageFactory.d.ts +50 -31
- package/dist/storage/BucketStorageFactory.js +10 -20
- package/dist/storage/BucketStorageFactory.js.map +1 -1
- package/dist/storage/CheckpointChecksumInvalidatedError.d.ts +12 -0
- package/dist/storage/CheckpointChecksumInvalidatedError.js +17 -0
- package/dist/storage/CheckpointChecksumInvalidatedError.js.map +1 -0
- package/dist/storage/ChecksumCache.d.ts +11 -6
- package/dist/storage/ChecksumCache.js +5 -4
- package/dist/storage/ChecksumCache.js.map +1 -1
- package/dist/storage/ParsedSyncConfigSet.d.ts +23 -0
- package/dist/storage/ParsedSyncConfigSet.js +2 -0
- package/dist/storage/ParsedSyncConfigSet.js.map +1 -0
- package/dist/storage/PersistedReplicationStream.d.ts +32 -0
- package/dist/storage/PersistedReplicationStream.js +26 -0
- package/dist/storage/PersistedReplicationStream.js.map +1 -0
- package/dist/storage/PersistedSyncConfigContent.d.ts +65 -0
- package/dist/storage/PersistedSyncConfigContent.js +138 -0
- package/dist/storage/PersistedSyncConfigContent.js.map +1 -0
- package/dist/storage/PersistedSyncConfigStatus.d.ts +13 -0
- package/dist/storage/PersistedSyncConfigStatus.js +2 -0
- package/dist/storage/PersistedSyncConfigStatus.js.map +1 -0
- package/dist/storage/ReplicationEventPayload.d.ts +6 -1
- package/dist/storage/SourceEntity.d.ts +13 -2
- package/dist/storage/SourceTable.d.ts +53 -4
- package/dist/storage/SourceTable.js +62 -7
- package/dist/storage/SourceTable.js.map +1 -1
- package/dist/storage/SourceTableReconciler.d.ts +83 -0
- package/dist/storage/SourceTableReconciler.js +95 -0
- package/dist/storage/SourceTableReconciler.js.map +1 -0
- package/dist/storage/StorageVersionConfig.d.ts +4 -0
- package/dist/storage/StorageVersionConfig.js +10 -1
- package/dist/storage/StorageVersionConfig.js.map +1 -1
- package/dist/storage/SyncRulesBucketStorage.d.ts +162 -26
- package/dist/storage/SyncRulesBucketStorage.js +3 -0
- package/dist/storage/SyncRulesBucketStorage.js.map +1 -1
- package/dist/storage/WriteCheckpointAPI.d.ts +85 -6
- package/dist/storage/WriteCheckpointAPI.js +33 -0
- package/dist/storage/WriteCheckpointAPI.js.map +1 -1
- package/dist/storage/implementation/BucketDefinitionMapping.d.ts +133 -0
- package/dist/storage/implementation/BucketDefinitionMapping.js +351 -0
- package/dist/storage/implementation/BucketDefinitionMapping.js.map +1 -0
- package/dist/storage/implementation/IncrementalReprocessingCompatibility.d.ts +6 -0
- package/dist/storage/implementation/IncrementalReprocessingCompatibility.js +31 -0
- package/dist/storage/implementation/IncrementalReprocessingCompatibility.js.map +1 -0
- package/dist/storage/implementation/IncrementalReprocessingSyncConfigLog.d.ts +17 -0
- package/dist/storage/implementation/IncrementalReprocessingSyncConfigLog.js +70 -0
- package/dist/storage/implementation/IncrementalReprocessingSyncConfigLog.js.map +1 -0
- package/dist/storage/implementation/ReplicationStreamStorageIds.d.ts +15 -0
- package/dist/storage/implementation/ReplicationStreamStorageIds.js +20 -0
- package/dist/storage/implementation/ReplicationStreamStorageIds.js.map +1 -0
- package/dist/storage/storage-index.d.ts +10 -1
- package/dist/storage/storage-index.js +10 -1
- package/dist/storage/storage-index.js.map +1 -1
- package/dist/storage/storage-metrics.js +120 -4
- package/dist/storage/storage-metrics.js.map +1 -1
- package/dist/sync/BucketChecksumState.d.ts +12 -2
- package/dist/sync/BucketChecksumState.js +69 -21
- package/dist/sync/BucketChecksumState.js.map +1 -1
- package/dist/sync/RequestTracker.d.ts +7 -0
- package/dist/sync/RequestTracker.js +12 -0
- package/dist/sync/RequestTracker.js.map +1 -1
- package/dist/sync/sync.js +184 -43
- package/dist/sync/sync.js.map +1 -1
- package/dist/sync/util.d.ts +5 -0
- package/dist/sync/util.js +19 -1
- package/dist/sync/util.js.map +1 -1
- package/dist/system/ServiceContext.d.ts +2 -0
- package/dist/system/ServiceContext.js +2 -0
- package/dist/system/ServiceContext.js.map +1 -1
- package/dist/tracing/PerformanceTracer.d.ts +23 -1
- package/dist/tracing/PerformanceTracer.js +11 -0
- package/dist/tracing/PerformanceTracer.js.map +1 -1
- package/dist/util/checkpointing.d.ts +4 -8
- package/dist/util/checkpointing.js +1 -16
- package/dist/util/checkpointing.js.map +1 -1
- package/dist/util/config/compound-config-collector.js +23 -2
- package/dist/util/config/compound-config-collector.js.map +1 -1
- package/dist/util/config/defaults.d.ts +2 -0
- package/dist/util/config/defaults.js +2 -0
- package/dist/util/config/defaults.js.map +1 -1
- package/dist/util/config/sync-rules/impl/base64-sync-rules-collector.js +1 -0
- package/dist/util/config/sync-rules/impl/base64-sync-rules-collector.js.map +1 -1
- package/dist/util/config/sync-rules/impl/filesystem-sync-rules-collector.js +1 -0
- package/dist/util/config/sync-rules/impl/filesystem-sync-rules-collector.js.map +1 -1
- package/dist/util/config/sync-rules/sync-rules-provider.d.ts +2 -0
- package/dist/util/config/sync-rules/sync-rules-provider.js +3 -0
- package/dist/util/config/sync-rules/sync-rules-provider.js.map +1 -1
- package/dist/util/config/types.d.ts +4 -1
- package/dist/util/lsn.d.ts +4 -0
- package/dist/util/lsn.js +10 -0
- package/dist/util/lsn.js.map +1 -1
- package/dist/util/protocol-types.d.ts +4 -4
- package/dist/util/protocol-types.js +3 -2
- package/dist/util/protocol-types.js.map +1 -1
- package/dist/util/util-index.d.ts +1 -0
- package/dist/util/util-index.js +1 -0
- package/dist/util/util-index.js.map +1 -1
- package/dist/util/utils.d.ts +3 -2
- package/dist/util/utils.js +17 -2
- package/dist/util/utils.js.map +1 -1
- package/dist/util/write-checkpoint-batcher.d.ts +19 -0
- package/dist/util/write-checkpoint-batcher.js +100 -0
- package/dist/util/write-checkpoint-batcher.js.map +1 -0
- package/package.json +7 -7
- package/src/api/RouteAPI.ts +43 -14
- package/src/api/diagnostics.ts +45 -26
- package/src/entry/commands/compact-action.ts +37 -23
- package/src/metrics/metrics-interfaces.ts +6 -1
- package/src/metrics/open-telemetry/MetricAttributeFilteringExporter.ts +85 -0
- package/src/metrics/open-telemetry/OpenTelemetryMetricsFactory.ts +7 -2
- package/src/metrics/open-telemetry/util.ts +7 -3
- package/src/modules/AbstractModule.ts +6 -2
- package/src/replication/AbstractReplicator.ts +212 -78
- package/src/replication/ReplicationModule.ts +2 -3
- package/src/routes/RouterEngine.ts +7 -1
- package/src/routes/configure-fastify.ts +25 -2
- package/src/routes/endpoints/admin.ts +75 -51
- package/src/routes/endpoints/checkpointing.ts +79 -8
- package/src/routes/endpoints/socket-route.ts +3 -2
- package/src/routes/endpoints/sync-rules.ts +26 -14
- package/src/routes/endpoints/sync-stream.ts +1 -1
- package/src/runner/teardown.ts +8 -8
- package/src/storage/BucketStorageBatch.ts +65 -18
- package/src/storage/BucketStorageFactory.ts +73 -46
- package/src/storage/CheckpointChecksumInvalidatedError.ts +17 -0
- package/src/storage/ChecksumCache.ts +27 -14
- package/src/storage/ParsedSyncConfigSet.ts +25 -0
- package/src/storage/PersistedReplicationStream.ts +55 -0
- package/src/storage/PersistedSyncConfigContent.ts +207 -0
- package/src/storage/PersistedSyncConfigStatus.ts +14 -0
- package/src/storage/ReplicationEventPayload.ts +6 -1
- package/src/storage/SourceEntity.ts +12 -2
- package/src/storage/SourceTable.ts +96 -8
- package/src/storage/SourceTableReconciler.ts +188 -0
- package/src/storage/StorageVersionConfig.ts +11 -1
- package/src/storage/SyncRulesBucketStorage.ts +189 -27
- package/src/storage/WriteCheckpointAPI.ts +140 -6
- package/src/storage/implementation/BucketDefinitionMapping.ts +539 -0
- package/src/storage/implementation/IncrementalReprocessingCompatibility.ts +41 -0
- package/src/storage/implementation/IncrementalReprocessingSyncConfigLog.ts +126 -0
- package/src/storage/implementation/ReplicationStreamStorageIds.ts +21 -0
- package/src/storage/storage-index.ts +11 -1
- package/src/storage/storage-metrics.ts +154 -8
- package/src/sync/BucketChecksumState.ts +105 -21
- package/src/sync/RequestTracker.ts +20 -0
- package/src/sync/sync.ts +214 -50
- package/src/sync/util.ts +33 -8
- package/src/system/ServiceContext.ts +7 -0
- package/src/tracing/PerformanceTracer.ts +41 -1
- package/src/util/checkpointing.ts +4 -22
- package/src/util/config/compound-config-collector.ts +31 -1
- package/src/util/config/defaults.ts +2 -0
- package/src/util/config/sync-rules/impl/base64-sync-rules-collector.ts +1 -0
- package/src/util/config/sync-rules/impl/filesystem-sync-rules-collector.ts +1 -0
- package/src/util/config/sync-rules/sync-rules-provider.ts +5 -0
- package/src/util/config/types.ts +4 -1
- package/src/util/lsn.ts +9 -0
- package/src/util/protocol-types.ts +3 -2
- package/src/util/util-index.ts +1 -0
- package/src/util/utils.ts +16 -2
- package/src/util/write-checkpoint-batcher.ts +142 -0
- package/test/src/AbstractReplicator.test.ts +177 -0
- package/test/src/MetricAttributeFilteringExporter.test.ts +96 -0
- package/test/src/PersistedSyncConfigContent.test.ts +152 -0
- package/test/src/checksum_cache.test.ts +22 -0
- package/test/src/config.test.ts +142 -0
- package/test/src/diagnostics.test.ts +87 -34
- package/test/src/module-loader.test.ts +33 -1
- package/test/src/routes/admin.test.ts +188 -18
- package/test/src/routes/checkpointing.test.ts +54 -0
- package/test/src/routes/mocks.ts +6 -2
- package/test/src/routes/stream.test.ts +123 -2
- package/test/src/source-table-reconciler.test.ts +244 -0
- package/test/src/storage/SourceTable.test.ts +92 -0
- package/test/src/storage-metrics.test.ts +148 -0
- package/test/src/sync/BucketChecksumState.test.ts +98 -12
- package/test/src/sync/util.test.ts +28 -1
- package/test/src/util/checkpointing.test.ts +249 -0
- package/test/src/util/utils.test.ts +23 -0
- package/tsconfig.json +1 -4
- package/tsconfig.tsbuildinfo +1 -1
- package/dist/storage/PersistedSyncRulesContent.d.ts +0 -59
- package/dist/storage/PersistedSyncRulesContent.js +0 -100
- package/dist/storage/PersistedSyncRulesContent.js.map +0 -1
- package/src/storage/PersistedSyncRulesContent.ts +0 -174
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { DataPointType } from '@opentelemetry/sdk-metrics';
|
|
2
|
+
/**
|
|
3
|
+
* Decorates a push exporter and removes selected attributes from every metric data point before
|
|
4
|
+
* delegating the export. The input metrics are not mutated, so another reader can export the
|
|
5
|
+
* original attributes.
|
|
6
|
+
*
|
|
7
|
+
* This exporter deliberately does not merge data points when filtering makes their attribute sets
|
|
8
|
+
* identical. Both points are forwarded with the same attributes. There is no generally correct
|
|
9
|
+
* merge operation at this layer: gauges, counters, and histograms have different aggregation
|
|
10
|
+
* semantics. Callers must therefore ensure that an excluded attribute does not distinguish data
|
|
11
|
+
* points for the same metric, resource, and instrumentation scope. Otherwise, the resulting
|
|
12
|
+
* duplicate series identity may be rejected or interpreted unpredictably downstream.
|
|
13
|
+
*
|
|
14
|
+
* Lifecycle methods and aggregation selection are delegated unchanged to the wrapped exporter.
|
|
15
|
+
*/
|
|
16
|
+
export class MetricAttributeFilteringExporter {
|
|
17
|
+
delegate;
|
|
18
|
+
excludedAttributes;
|
|
19
|
+
selectAggregation;
|
|
20
|
+
selectAggregationTemporality;
|
|
21
|
+
constructor(
|
|
22
|
+
/** The exporter that receives the filtered copy of the metrics. */
|
|
23
|
+
delegate,
|
|
24
|
+
/** Attribute names to remove from every exported data point. */
|
|
25
|
+
excludedAttributes) {
|
|
26
|
+
this.delegate = delegate;
|
|
27
|
+
this.excludedAttributes = excludedAttributes;
|
|
28
|
+
this.selectAggregation = delegate.selectAggregation?.bind(delegate);
|
|
29
|
+
this.selectAggregationTemporality = delegate.selectAggregationTemporality?.bind(delegate);
|
|
30
|
+
}
|
|
31
|
+
export(metrics, resultCallback) {
|
|
32
|
+
this.delegate.export(this.filterAttributes(metrics), resultCallback);
|
|
33
|
+
}
|
|
34
|
+
forceFlush() {
|
|
35
|
+
return this.delegate.forceFlush();
|
|
36
|
+
}
|
|
37
|
+
shutdown() {
|
|
38
|
+
return this.delegate.shutdown();
|
|
39
|
+
}
|
|
40
|
+
filterAttributes(metrics) {
|
|
41
|
+
return {
|
|
42
|
+
...metrics,
|
|
43
|
+
scopeMetrics: metrics.scopeMetrics.map((scopeMetrics) => ({
|
|
44
|
+
...scopeMetrics,
|
|
45
|
+
metrics: scopeMetrics.metrics.map((metric) => this.filterMetricAttributes(metric))
|
|
46
|
+
}))
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
filterMetricAttributes(metric) {
|
|
50
|
+
switch (metric.dataPointType) {
|
|
51
|
+
case DataPointType.SUM:
|
|
52
|
+
case DataPointType.GAUGE:
|
|
53
|
+
return { ...metric, dataPoints: metric.dataPoints.map((dataPoint) => this.filterDataPoint(dataPoint)) };
|
|
54
|
+
case DataPointType.HISTOGRAM:
|
|
55
|
+
return { ...metric, dataPoints: metric.dataPoints.map((dataPoint) => this.filterDataPoint(dataPoint)) };
|
|
56
|
+
case DataPointType.EXPONENTIAL_HISTOGRAM:
|
|
57
|
+
return { ...metric, dataPoints: metric.dataPoints.map((dataPoint) => this.filterDataPoint(dataPoint)) };
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
filterDataPoint(dataPoint) {
|
|
61
|
+
return {
|
|
62
|
+
...dataPoint,
|
|
63
|
+
attributes: this.filterDataPointAttributes(dataPoint.attributes)
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
filterDataPointAttributes(attributes) {
|
|
67
|
+
return Object.fromEntries(Object.entries(attributes).filter(([name]) => !this.excludedAttributes.has(name)));
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=MetricAttributeFilteringExporter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MetricAttributeFilteringExporter.js","sourceRoot":"","sources":["../../../src/metrics/open-telemetry/MetricAttributeFilteringExporter.ts"],"names":[],"mappings":"AAEA,OAAO,EAIL,aAAa,EAId,MAAM,4BAA4B,CAAC;AAEpC;;;;;;;;;;;;;GAaG;AACH,MAAM,OAAO,gCAAgC;IAMxB;IAEA;IAPV,iBAAiB,CAAuB;IACxC,4BAA4B,CAAkC;IAEvE;IACE,mEAAmE;IAClD,QAA4B;IAC7C,gEAAgE;IAC/C,kBAAuC;QAFvC,aAAQ,GAAR,QAAQ,CAAoB;QAE5B,uBAAkB,GAAlB,kBAAkB,CAAqB;QAExD,IAAI,CAAC,iBAAiB,GAAG,QAAQ,CAAC,iBAAiB,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QACpE,IAAI,CAAC,4BAA4B,GAAG,QAAQ,CAAC,4BAA4B,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC5F,CAAC;IAED,MAAM,CAAC,OAAwB,EAAE,cAA8C;QAC7E,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,EAAE,cAAc,CAAC,CAAC;IACvE,CAAC;IAED,UAAU;QACR,OAAO,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC;IACpC,CAAC;IAED,QAAQ;QACN,OAAO,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC;IAClC,CAAC;IAEO,gBAAgB,CAAC,OAAwB;QAC/C,OAAO;YACL,GAAG,OAAO;YACV,YAAY,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;gBACxD,GAAG,YAAY;gBACf,OAAO,EAAE,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,sBAAsB,CAAC,MAAM,CAAC,CAAC;aACnF,CAAC,CAAC;SACJ,CAAC;IACJ,CAAC;IAEO,sBAAsB,CAAC,MAAkB;QAC/C,QAAQ,MAAM,CAAC,aAAa,EAAE,CAAC;YAC7B,KAAK,aAAa,CAAC,GAAG,CAAC;YACvB,KAAK,aAAa,CAAC,KAAK;gBACtB,OAAO,EAAE,GAAG,MAAM,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC;YAC1G,KAAK,aAAa,CAAC,SAAS;gBAC1B,OAAO,EAAE,GAAG,MAAM,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC;YAC1G,KAAK,aAAa,CAAC,qBAAqB;gBACtC,OAAO,EAAE,GAAG,MAAM,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC;QAC5G,CAAC;IACH,CAAC;IAEO,eAAe,CAAI,SAAuB;QAChD,OAAO;YACL,GAAG,SAAS;YACZ,UAAU,EAAE,IAAI,CAAC,yBAAyB,CAAC,SAAS,CAAC,UAAU,CAAC;SACjE,CAAC;IACJ,CAAC;IAEO,yBAAyB,CAAC,UAAsB;QACtD,OAAO,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC/G,CAAC;CACF"}
|
|
@@ -22,9 +22,14 @@ export class OpenTelemetryMetricsFactory {
|
|
|
22
22
|
setValueProvider(valueProvider) {
|
|
23
23
|
gauge.addCallback(async (result) => {
|
|
24
24
|
const value = await valueProvider();
|
|
25
|
-
if (value
|
|
25
|
+
if (typeof value === 'number') {
|
|
26
26
|
result.observe(value);
|
|
27
27
|
}
|
|
28
|
+
else if (value != undefined) {
|
|
29
|
+
for (const observation of value) {
|
|
30
|
+
result.observe(observation.value, observation.attributes);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
28
33
|
});
|
|
29
34
|
}
|
|
30
35
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OpenTelemetryMetricsFactory.js","sourceRoot":"","sources":["../../../src/metrics/open-telemetry/OpenTelemetryMetricsFactory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,
|
|
1
|
+
{"version":3,"file":"OpenTelemetryMetricsFactory.js","sourceRoot":"","sources":["../../../src/metrics/open-telemetry/OpenTelemetryMetricsFactory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAML,SAAS,EAEV,MAAM,0BAA0B,CAAC;AAElC,MAAM,OAAO,2BAA2B;IAC9B,KAAK,CAAQ;IAErB,YAAY,KAAY;QACtB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IAED,aAAa,CAAC,QAAwB;QACpC,OAAO,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,EAAE;YAC7C,WAAW,EAAE,QAAQ,CAAC,WAAW;YACjC,IAAI,EAAE,QAAQ,CAAC,IAAI;YACnB,SAAS,EAAE,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,SAAS,CAAC;SAChD,CAAC,CAAC;IACL,CAAC;IAED,qBAAqB,CAAC,QAAwB;QAC5C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,qBAAqB,CAAC,QAAQ,CAAC,IAAI,EAAE;YAC5D,WAAW,EAAE,QAAQ,CAAC,WAAW;YACjC,IAAI,EAAE,QAAQ,CAAC,IAAI;YACnB,SAAS,EAAE,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,SAAS,CAAC;SAChD,CAAC,CAAC;QAEH,OAAO;YACL,gBAAgB,CAAC,aAA+E;gBAC9F,KAAK,CAAC,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;oBACjC,MAAM,KAAK,GAAG,MAAM,aAAa,EAAE,CAAC;oBAEpC,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;wBAC9B,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;oBACxB,CAAC;yBAAM,IAAI,KAAK,IAAI,SAAS,EAAE,CAAC;wBAC9B,KAAK,MAAM,WAAW,IAAI,KAAK,EAAE,CAAC;4BAChC,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,KAAK,EAAE,WAAW,CAAC,UAAU,CAAC,CAAC;wBAC5D,CAAC;oBACH,CAAC;gBACH,CAAC,CAAC,CAAC;YACL,CAAC;SACF,CAAC;IACJ,CAAC;IAED,mBAAmB,CAAC,QAAwB;QAC1C,OAAO,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,QAAQ,CAAC,IAAI,EAAE;YACnD,WAAW,EAAE,QAAQ,CAAC,WAAW;YACjC,IAAI,EAAE,QAAQ,CAAC,IAAI;YACnB,SAAS,EAAE,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,SAAS,CAAC;SAChD,CAAC,CAAC;IACL,CAAC;IAEO,WAAW,CAAC,SAAqB;QACvC,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,OAAO,SAAS,CAAC,GAAG,CAAC;QACvB,CAAC;QAED,QAAQ,SAAS,EAAE,CAAC;YAClB,KAAK,SAAS,CAAC,GAAG;gBAChB,OAAO,SAAS,CAAC,GAAG,CAAC;YACvB,KAAK,SAAS,CAAC,MAAM;gBACnB,OAAO,SAAS,CAAC,MAAM,CAAC;QAC5B,CAAC;IACH,CAAC;CACF"}
|
|
@@ -2,6 +2,7 @@ import { OTLPMetricExporter } from '@opentelemetry/exporter-metrics-otlp-http';
|
|
|
2
2
|
import { PrometheusExporter } from '@opentelemetry/exporter-prometheus';
|
|
3
3
|
import { MeterProvider, PeriodicExportingMetricReader } from '@opentelemetry/sdk-metrics';
|
|
4
4
|
import { logger } from '@powersync/lib-services-framework';
|
|
5
|
+
import { MetricAttributeFilteringExporter } from './MetricAttributeFilteringExporter.js';
|
|
5
6
|
import { OpenTelemetryMetricsFactory } from './OpenTelemetryMetricsFactory.js';
|
|
6
7
|
import { resourceFromAttributes } from '@opentelemetry/resources';
|
|
7
8
|
import pkg from '../../../package.json' with { type: 'json' };
|
|
@@ -22,10 +23,13 @@ export function createOpenTelemetryMetricsFactory(context) {
|
|
|
22
23
|
});
|
|
23
24
|
}
|
|
24
25
|
if (!configuration.telemetry.disable_telemetry_sharing) {
|
|
26
|
+
const otlpExporter = new OTLPMetricExporter({
|
|
27
|
+
url: configuration.telemetry.internal_service_endpoint
|
|
28
|
+
});
|
|
25
29
|
const periodicExporter = new PeriodicExportingMetricReader({
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
30
|
+
// sync_config_id uniquely identifies these metric series after version_label is removed,
|
|
31
|
+
// so filtering cannot create duplicate data points.
|
|
32
|
+
exporter: new MetricAttributeFilteringExporter(otlpExporter, new Set(['version_label'])),
|
|
29
33
|
exportIntervalMillis: 1000 * 60 * 5 // 5 minutes
|
|
30
34
|
});
|
|
31
35
|
configuredExporters.push(periodicExporter);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"util.js","sourceRoot":"","sources":["../../../src/metrics/open-telemetry/util.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,2CAA2C,CAAC;AAC/E,OAAO,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AACxE,OAAO,EAAE,aAAa,EAAgB,6BAA6B,EAAE,MAAM,4BAA4B,CAAC;AACxG,OAAO,EAAE,MAAM,EAAE,MAAM,mCAAmC,CAAC;AAG3D,OAAO,EAAE,2BAA2B,EAAE,MAAM,kCAAkC,CAAC;AAE/E,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,GAAG,MAAM,uBAAuB,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AAE9D,MAAM,UAAU,iCAAiC,CAAC,OAAuB;IACvE,MAAM,EAAE,aAAa,EAAE,eAAe,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC;IAClE,MAAM,mBAAmB,GAAmB,EAAE,CAAC;IAE/C,IAAI,aAAa,CAAC,SAAS,CAAC,eAAe,EAAE,CAAC;QAC5C,MAAM,kBAAkB,GAAG,IAAI,kBAAkB,CAAC;YAChD,IAAI,EAAE,aAAa,CAAC,SAAS,CAAC,eAAe;YAC7C,kBAAkB,EAAE,IAAI;SACzB,CAAC,CAAC;QACH,mBAAmB,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QAE7C,eAAe,CAAC,aAAa,CAAC,kBAAkB,EAAE;YAChD,KAAK,EAAE,KAAK,IAAI,EAAE;gBAChB,MAAM,kBAAkB,CAAC,WAAW,EAAE,CAAC;gBACvC,MAAM,CAAC,IAAI,CAAC,4CAA4C,aAAa,CAAC,SAAS,CAAC,eAAe,EAAE,CAAC,CAAC;YACrG,CAAC;SACF,CAAC,CAAC;IACL,CAAC;IAED,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,yBAAyB,EAAE,CAAC;QACvD,MAAM,gBAAgB,GAAG,IAAI,6BAA6B,CAAC;YACzD,QAAQ,EAAE,IAAI,
|
|
1
|
+
{"version":3,"file":"util.js","sourceRoot":"","sources":["../../../src/metrics/open-telemetry/util.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,11 +1,15 @@
|
|
|
1
1
|
import winston from 'winston';
|
|
2
|
-
import {
|
|
2
|
+
import { PersistedReplicationStream } from '../storage/storage-index.js';
|
|
3
3
|
import { ServiceContextContainer } from '../system/ServiceContext.js';
|
|
4
4
|
export interface TearDownOptions {
|
|
5
5
|
/**
|
|
6
6
|
* If required, tear down any configuration/state for the specific replication stream
|
|
7
7
|
*/
|
|
8
|
-
|
|
8
|
+
replicationStreams?: PersistedReplicationStream[];
|
|
9
|
+
/**
|
|
10
|
+
* @deprecated Use replicationStreams.
|
|
11
|
+
*/
|
|
12
|
+
syncRules?: PersistedReplicationStream[];
|
|
9
13
|
}
|
|
10
14
|
export interface AbstractModuleOptions {
|
|
11
15
|
name: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AbstractModule.js","sourceRoot":"","sources":["../../src/modules/AbstractModule.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,mCAAmC,CAAC;
|
|
1
|
+
{"version":3,"file":"AbstractModule.js","sourceRoot":"","sources":["../../src/modules/AbstractModule.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,mCAAmC,CAAC;AAoB3D,MAAM,OAAgB,cAAc;IAGF;IAFtB,MAAM,CAAiB;IAEjC,YAAgC,OAA8B;QAA9B,YAAO,GAAP,OAAO,CAAuB;QAC5D,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,UAAU,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACjE,CAAC;IAYD,IAAW,IAAI;QACb,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;IAC3B,CAAC;CACF"}
|
|
@@ -19,6 +19,10 @@ export interface AbstractReplicatorOptions {
|
|
|
19
19
|
* This limits the effect of retries when there is a persistent issue.
|
|
20
20
|
*/
|
|
21
21
|
rateLimiter: ErrorRateLimiter;
|
|
22
|
+
/**
|
|
23
|
+
* Interval in seconds between source connection pings. Null or undefined uses the default; 0 disables pings.
|
|
24
|
+
*/
|
|
25
|
+
heartbeatIntervalSeconds?: number | null;
|
|
22
26
|
}
|
|
23
27
|
/**
|
|
24
28
|
* A replicator manages the mechanics for replicating data from a data source to a storage bucket.
|
|
@@ -28,26 +32,31 @@ export interface AbstractReplicatorOptions {
|
|
|
28
32
|
export declare abstract class AbstractReplicator<T extends AbstractReplicationJob = AbstractReplicationJob> {
|
|
29
33
|
private options;
|
|
30
34
|
protected logger: winston.Logger;
|
|
31
|
-
private
|
|
35
|
+
private lastReplicationStreamInfoLogs;
|
|
32
36
|
/**
|
|
33
|
-
* Map of replication jobs by replication stream id. Usually there is only one running job, but there could be two
|
|
34
|
-
* transitioning to a new replication stream.
|
|
37
|
+
* Map of replication jobs by replication stream job id. Usually there is only one running job, but there could be two
|
|
38
|
+
* when transitioning to a new replication stream.
|
|
35
39
|
*/
|
|
36
40
|
private replicationJobs;
|
|
37
41
|
/**
|
|
38
|
-
* Map of
|
|
42
|
+
* Map of replication stream ids to promises that are clearing the replication stream.
|
|
39
43
|
*
|
|
40
|
-
* We primarily do this to keep track of what we're currently clearing
|
|
41
|
-
* use the Promise value.
|
|
44
|
+
* We primarily do this to keep track of what we're currently clearing.
|
|
42
45
|
*/
|
|
43
|
-
|
|
46
|
+
protected readonly clearingJobs: Map<number, Promise<void>>;
|
|
44
47
|
/**
|
|
45
48
|
* Used for replication lag computation.
|
|
46
49
|
*/
|
|
47
50
|
private activeReplicationJob;
|
|
48
51
|
private lastPing;
|
|
52
|
+
private readonly heartbeatIntervalNanos;
|
|
49
53
|
private abortController;
|
|
50
54
|
protected constructor(options: AbstractReplicatorOptions);
|
|
55
|
+
/**
|
|
56
|
+
* Create the source-specific replication job for a locked storage stream.
|
|
57
|
+
*
|
|
58
|
+
* The job owns the per-stream snapshot and streaming work for this attempt.
|
|
59
|
+
*/
|
|
51
60
|
abstract createJob(options: CreateJobOptions): T;
|
|
52
61
|
/**
|
|
53
62
|
* Clean up any configuration or state for the specified replication stream on the datasource.
|
|
@@ -64,8 +73,23 @@ export declare abstract class AbstractReplicator<T extends AbstractReplicationJo
|
|
|
64
73
|
stop(): Promise<void>;
|
|
65
74
|
private runLoop;
|
|
66
75
|
private refresh;
|
|
76
|
+
private logReplicationStreamInfoOnce;
|
|
77
|
+
private clearReplicationStreamInfoLog;
|
|
78
|
+
/**
|
|
79
|
+
* When we load sync config from the filesystem/config source, we ignore any config loaded by other processes.
|
|
80
|
+
* The idea is that if a different process loads updated config, that process should process it, not this one.
|
|
81
|
+
*
|
|
82
|
+
* This specifically helps for cases with rolling deploys.
|
|
83
|
+
*
|
|
84
|
+
* This does not apply when sync config is loaded from the database/API, instead of in the config.
|
|
85
|
+
*/
|
|
86
|
+
private shouldHandleReplicationStream;
|
|
67
87
|
protected createJobId(syncRuleId: number): string;
|
|
88
|
+
protected terminateStoppedReplicationStream(replicationStream: storage.PersistedReplicationStream, syncRuleStorage: storage.SyncRulesBucketStorage): Promise<void>;
|
|
68
89
|
protected terminateSyncRules(syncRuleStorage: storage.SyncRulesBucketStorage): Promise<void>;
|
|
90
|
+
/**
|
|
91
|
+
* Check source connectivity using the replicator's decoded connection config.
|
|
92
|
+
*/
|
|
69
93
|
abstract testConnection(): Promise<ConnectionTestResult>;
|
|
70
94
|
/**
|
|
71
95
|
* Measure replication lag in milliseconds.
|
|
@@ -1,9 +1,15 @@
|
|
|
1
|
-
import { container, ErrorCode, logger } from '@powersync/lib-services-framework';
|
|
1
|
+
import { container, ErrorCode, logger, ReplicationAbortedError } from '@powersync/lib-services-framework';
|
|
2
2
|
import { ReplicationMetric } from '@powersync/service-types';
|
|
3
3
|
import { hrtime } from 'node:process';
|
|
4
|
+
import { setTimeout as sleep } from 'node:timers/promises';
|
|
4
5
|
import * as storage from '../storage/storage-index.js';
|
|
5
|
-
// 1 minute
|
|
6
|
-
const
|
|
6
|
+
// Default to 1 minute when no source-specific interval is configured.
|
|
7
|
+
const DEFAULT_HEARTBEAT_INTERVAL_SECONDS = 60;
|
|
8
|
+
// In the initial startup period, we use a short refresh interval. This helps to take over replication quickly in the case
|
|
9
|
+
// of rolling deploys. After the initial period, we switch to a longer refresh interval to reduce load.
|
|
10
|
+
const FAST_REFRESH_INTERVAL_MS = 500;
|
|
11
|
+
const FAST_REFRESH_TIMEOUT_MS = 120_000;
|
|
12
|
+
const REFRESH_INTERVAL_MS = 5_000;
|
|
7
13
|
/**
|
|
8
14
|
* A replicator manages the mechanics for replicating data from a data source to a storage bucket.
|
|
9
15
|
* This includes copying across the original data set and then keeping it in sync with the data source using Replication Jobs.
|
|
@@ -12,29 +18,32 @@ const PING_INTERVAL = 1000000000n * 60n;
|
|
|
12
18
|
export class AbstractReplicator {
|
|
13
19
|
options;
|
|
14
20
|
logger;
|
|
15
|
-
|
|
21
|
+
lastReplicationStreamInfoLogs = new Map();
|
|
16
22
|
/**
|
|
17
|
-
* Map of replication jobs by replication stream id. Usually there is only one running job, but there could be two
|
|
18
|
-
* transitioning to a new replication stream.
|
|
23
|
+
* Map of replication jobs by replication stream job id. Usually there is only one running job, but there could be two
|
|
24
|
+
* when transitioning to a new replication stream.
|
|
19
25
|
*/
|
|
20
26
|
replicationJobs = new Map();
|
|
21
27
|
/**
|
|
22
|
-
* Map of
|
|
28
|
+
* Map of replication stream ids to promises that are clearing the replication stream.
|
|
23
29
|
*
|
|
24
|
-
* We primarily do this to keep track of what we're currently clearing
|
|
25
|
-
* use the Promise value.
|
|
30
|
+
* We primarily do this to keep track of what we're currently clearing.
|
|
26
31
|
*/
|
|
27
32
|
clearingJobs = new Map();
|
|
28
33
|
/**
|
|
29
34
|
* Used for replication lag computation.
|
|
30
35
|
*/
|
|
31
36
|
activeReplicationJob = undefined;
|
|
32
|
-
//
|
|
37
|
+
// The first ping is only after the configured interval, not when starting.
|
|
33
38
|
lastPing = hrtime.bigint();
|
|
39
|
+
heartbeatIntervalNanos;
|
|
34
40
|
abortController;
|
|
35
41
|
constructor(options) {
|
|
36
42
|
this.options = options;
|
|
37
43
|
this.logger = logger.child({ name: `Replicator:${options.id}` });
|
|
44
|
+
const heartbeatIntervalSeconds = options.heartbeatIntervalSeconds ?? DEFAULT_HEARTBEAT_INTERVAL_SECONDS;
|
|
45
|
+
this.heartbeatIntervalNanos =
|
|
46
|
+
heartbeatIntervalSeconds === 0 ? null : BigInt(Math.round(heartbeatIntervalSeconds * 1_000_000_000));
|
|
38
47
|
}
|
|
39
48
|
get id() {
|
|
40
49
|
return this.options.id;
|
|
@@ -84,17 +93,26 @@ export class AbstractReplicator {
|
|
|
84
93
|
for (const job of this.replicationJobs.values()) {
|
|
85
94
|
promises.push(job.stop());
|
|
86
95
|
}
|
|
96
|
+
promises.push(...this.clearingJobs.values());
|
|
87
97
|
await Promise.all(promises);
|
|
88
98
|
}
|
|
89
99
|
async runLoop() {
|
|
90
|
-
const
|
|
100
|
+
const loadedSyncConfig = await this.syncRuleProvider.get();
|
|
91
101
|
let configuredLock = undefined;
|
|
92
|
-
if (
|
|
93
|
-
this.
|
|
102
|
+
if (loadedSyncConfig != null) {
|
|
103
|
+
const versionLabel = this.syncRuleProvider.versionLabel;
|
|
104
|
+
this.logger.info(`Loaded sync config${versionLabel == null ? '' : ` ${versionLabel}`}`);
|
|
94
105
|
try {
|
|
95
106
|
// Configure new sync config, if they have changed.
|
|
96
107
|
// In that case, also immediately take out a lock, so that another process doesn't start replication on it.
|
|
97
|
-
|
|
108
|
+
// This upfront lock is mostly superseded by the replicationStreamLoadedSyncConfigMatch() check. However, that doesn't cover old
|
|
109
|
+
// versions before that check was added, so we keep the lock for now - for where te service version and sync config is updated at
|
|
110
|
+
// the same time.
|
|
111
|
+
const { lock } = await this.storage.configureSyncRules(storage.updateSyncRulesFromYaml(loadedSyncConfig, {
|
|
112
|
+
lock: true,
|
|
113
|
+
validate: this.syncRuleProvider.exitOnError,
|
|
114
|
+
version_label: versionLabel
|
|
115
|
+
}));
|
|
98
116
|
if (lock) {
|
|
99
117
|
configuredLock = lock;
|
|
100
118
|
}
|
|
@@ -109,17 +127,26 @@ export class AbstractReplicator {
|
|
|
109
127
|
else {
|
|
110
128
|
this.logger.info('No sync streams or rules configured - configure via API');
|
|
111
129
|
}
|
|
130
|
+
let useFastRefresh = true;
|
|
131
|
+
const fastRefreshDeadline = Date.now() + FAST_REFRESH_TIMEOUT_MS;
|
|
112
132
|
while (!this.stopped) {
|
|
113
133
|
await container.probes.touch();
|
|
114
134
|
try {
|
|
115
|
-
await this.refresh({
|
|
135
|
+
const refreshResult = await this.refresh({
|
|
136
|
+
configuredLock,
|
|
137
|
+
loadedSyncConfig,
|
|
138
|
+
loadedVersionLabel: this.syncRuleProvider.versionLabel
|
|
139
|
+
});
|
|
140
|
+
if (refreshResult.replicationJobStarted || Date.now() >= fastRefreshDeadline) {
|
|
141
|
+
useFastRefresh = false;
|
|
142
|
+
}
|
|
116
143
|
// The lock is only valid on the first refresh.
|
|
117
144
|
configuredLock = undefined;
|
|
118
145
|
// Ensure that the replication jobs' connections are kept alive.
|
|
119
146
|
// We don't ping while in error retry back-off, to avoid having too failures.
|
|
120
|
-
if (this.rateLimiter.mayPing()) {
|
|
147
|
+
if (this.heartbeatIntervalNanos != null && this.rateLimiter.mayPing()) {
|
|
121
148
|
const now = hrtime.bigint();
|
|
122
|
-
if (now - this.lastPing >=
|
|
149
|
+
if (now - this.lastPing >= this.heartbeatIntervalNanos) {
|
|
123
150
|
for (const activeJob of this.replicationJobs.values()) {
|
|
124
151
|
await activeJob.keepAlive();
|
|
125
152
|
}
|
|
@@ -130,76 +157,54 @@ export class AbstractReplicator {
|
|
|
130
157
|
catch (e) {
|
|
131
158
|
this.logger.error('Failed to refresh replication jobs', e);
|
|
132
159
|
}
|
|
133
|
-
|
|
160
|
+
if (Date.now() >= fastRefreshDeadline) {
|
|
161
|
+
useFastRefresh = false;
|
|
162
|
+
}
|
|
163
|
+
await sleep(useFastRefresh ? FAST_REFRESH_INTERVAL_MS : REFRESH_INTERVAL_MS);
|
|
134
164
|
}
|
|
135
165
|
}
|
|
136
166
|
async refresh(options) {
|
|
137
167
|
if (this.stopped) {
|
|
138
|
-
return;
|
|
168
|
+
return { replicationJobStarted: false };
|
|
139
169
|
}
|
|
140
|
-
let configuredLock = options?.
|
|
170
|
+
let configuredLock = options?.configuredLock;
|
|
171
|
+
let replicationJobStarted = false;
|
|
141
172
|
const existingJobs = new Map(this.replicationJobs.entries());
|
|
142
|
-
const
|
|
173
|
+
const replicatingStreams = await this.storage.getReplicatingReplicationStreams();
|
|
143
174
|
const newJobs = new Map();
|
|
175
|
+
const streamsToStart = [];
|
|
144
176
|
let activeJob = undefined;
|
|
145
|
-
for (let
|
|
146
|
-
const
|
|
147
|
-
|
|
177
|
+
for (let replicationStream of replicatingStreams) {
|
|
178
|
+
const jobId = replicationStream.replicationJobId;
|
|
179
|
+
const existingJob = existingJobs.get(jobId);
|
|
180
|
+
const syncConfigMismatchMessage = 'Ignoring replication stream for sync config not loaded by this process';
|
|
181
|
+
if (!this.shouldHandleReplicationStream(replicationStream, options?.loadedSyncConfig, options?.loadedVersionLabel)) {
|
|
182
|
+
this.logReplicationStreamInfoOnce(replicationStream, 'sync-config-mismatch', () => {
|
|
183
|
+
replicationStream.logger.info(syncConfigMismatchMessage);
|
|
184
|
+
});
|
|
185
|
+
continue;
|
|
186
|
+
}
|
|
187
|
+
this.clearReplicationStreamInfoLog(replicationStream, 'sync-config-mismatch');
|
|
188
|
+
if (replicationStream.state == storage.SyncRuleState.ACTIVE && activeJob == null) {
|
|
148
189
|
activeJob = existingJob;
|
|
149
190
|
}
|
|
150
191
|
if (existingJob && !existingJob.isStopped) {
|
|
151
192
|
// No change
|
|
152
|
-
existingJobs.delete(
|
|
153
|
-
newJobs.set(
|
|
193
|
+
existingJobs.delete(jobId);
|
|
194
|
+
newJobs.set(jobId, existingJob);
|
|
154
195
|
}
|
|
155
196
|
else if (existingJob && existingJob.isStopped) {
|
|
156
197
|
// Stopped (e.g. fatal error).
|
|
157
198
|
// Remove from the list. Next refresh call will restart the job.
|
|
158
|
-
existingJobs.delete(
|
|
199
|
+
existingJobs.delete(jobId);
|
|
159
200
|
}
|
|
160
201
|
else {
|
|
161
202
|
// New sync config was found (or resume after restart)
|
|
162
|
-
|
|
163
|
-
let lock;
|
|
164
|
-
if (configuredLock?.sync_rules_id == syncRules.id) {
|
|
165
|
-
lock = configuredLock;
|
|
166
|
-
}
|
|
167
|
-
else {
|
|
168
|
-
lock = await syncRules.lock();
|
|
169
|
-
}
|
|
170
|
-
const storage = this.storage.getInstance(syncRules);
|
|
171
|
-
const newJob = this.createJob({
|
|
172
|
-
lock: lock,
|
|
173
|
-
storage: storage
|
|
174
|
-
});
|
|
175
|
-
newJobs.set(syncRules.id, newJob);
|
|
176
|
-
newJob.start();
|
|
177
|
-
if (syncRules.active) {
|
|
178
|
-
activeJob = newJob;
|
|
179
|
-
}
|
|
180
|
-
this.lockAlerted = false;
|
|
181
|
-
}
|
|
182
|
-
catch (e) {
|
|
183
|
-
if (e?.errorData?.code === ErrorCode.PSYNC_S1003) {
|
|
184
|
-
if (!this.lockAlerted) {
|
|
185
|
-
syncRules.logger.info(`[${e.errorData.code}] ${e.errorData.description}`);
|
|
186
|
-
this.lockAlerted = true;
|
|
187
|
-
}
|
|
188
|
-
}
|
|
189
|
-
else {
|
|
190
|
-
// Could be a sync config parse error,
|
|
191
|
-
// for example from stricter validation that was added.
|
|
192
|
-
// This will be retried every couple of seconds.
|
|
193
|
-
// When new (valid) sync config is deployed and processed, this one be disabled.
|
|
194
|
-
syncRules.logger.error('Failed to start replication for new sync config', e);
|
|
195
|
-
}
|
|
196
|
-
}
|
|
203
|
+
streamsToStart.push(replicationStream);
|
|
197
204
|
}
|
|
198
205
|
}
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
// Stop any orphaned jobs that no longer have a replication stream.
|
|
202
|
-
// Termination happens below
|
|
206
|
+
// Stop any orphaned jobs that no longer have a replication stream before starting replacements.
|
|
207
|
+
// Termination happens below.
|
|
203
208
|
for (let job of existingJobs.values()) {
|
|
204
209
|
// Old - stop and clean up
|
|
205
210
|
try {
|
|
@@ -210,30 +215,119 @@ export class AbstractReplicator {
|
|
|
210
215
|
job.storage.logger.warn('Failed to stop old replication job', e);
|
|
211
216
|
}
|
|
212
217
|
}
|
|
218
|
+
for (let replicationStream of streamsToStart) {
|
|
219
|
+
const jobId = replicationStream.replicationJobId;
|
|
220
|
+
try {
|
|
221
|
+
let lock;
|
|
222
|
+
if (configuredLock?.sync_rules_id == replicationStream.replicationStreamId) {
|
|
223
|
+
lock = configuredLock;
|
|
224
|
+
}
|
|
225
|
+
else {
|
|
226
|
+
lock = await replicationStream.lock();
|
|
227
|
+
}
|
|
228
|
+
const syncRuleStorage = this.storage.getInstance(replicationStream);
|
|
229
|
+
const newJob = this.createJob({
|
|
230
|
+
lock: lock,
|
|
231
|
+
storage: syncRuleStorage
|
|
232
|
+
});
|
|
233
|
+
newJobs.set(jobId, newJob);
|
|
234
|
+
newJob.start();
|
|
235
|
+
replicationJobStarted = true;
|
|
236
|
+
if (replicationStream.state == storage.SyncRuleState.ACTIVE) {
|
|
237
|
+
activeJob = newJob;
|
|
238
|
+
}
|
|
239
|
+
this.lastReplicationStreamInfoLogs.delete(replicationStream.replicationStreamName);
|
|
240
|
+
}
|
|
241
|
+
catch (e) {
|
|
242
|
+
if (e?.errorData?.code === ErrorCode.PSYNC_S1003) {
|
|
243
|
+
this.logReplicationStreamInfoOnce(replicationStream, 'replication-stream-locked', () => {
|
|
244
|
+
replicationStream.logger.info(`[${e.errorData.code}] ${e.errorData.description}`);
|
|
245
|
+
});
|
|
246
|
+
}
|
|
247
|
+
else {
|
|
248
|
+
// Could be a sync config parse error,
|
|
249
|
+
// for example from stricter validation that was added.
|
|
250
|
+
// This will be retried every couple of seconds.
|
|
251
|
+
// When new (valid) sync config is deployed and processed, this one be disabled.
|
|
252
|
+
replicationStream.logger.error('Failed to start replication for new sync config', e);
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
this.replicationJobs = newJobs;
|
|
257
|
+
this.activeReplicationJob = activeJob;
|
|
213
258
|
// Replication stream stopped previously, including by a different process.
|
|
214
|
-
const stopped = await this.storage.
|
|
215
|
-
for (let
|
|
216
|
-
if (this.clearingJobs.has(
|
|
259
|
+
const stopped = await this.storage.getStoppedReplicationStreams();
|
|
260
|
+
for (let replicationStream of stopped) {
|
|
261
|
+
if (this.clearingJobs.has(replicationStream.replicationStreamId)) {
|
|
217
262
|
// Already in progress
|
|
218
263
|
continue;
|
|
219
264
|
}
|
|
220
265
|
// We clear storage asynchronously.
|
|
221
266
|
// It is important to be able to continue running the refresh loop, otherwise we cannot
|
|
222
267
|
// retry locked replication stream, for example.
|
|
223
|
-
const syncRuleStorage = this.storage.getInstance(
|
|
224
|
-
const promise = this.
|
|
268
|
+
const syncRuleStorage = this.storage.getInstance(replicationStream, { skipLifecycleHooks: true });
|
|
269
|
+
const promise = this.terminateStoppedReplicationStream(replicationStream, syncRuleStorage)
|
|
225
270
|
.catch((e) => {
|
|
226
|
-
|
|
271
|
+
if (e instanceof ReplicationAbortedError) {
|
|
272
|
+
// Expected when shutdown aborts an in-progress cleanup.
|
|
273
|
+
}
|
|
274
|
+
else if (e?.errorData?.code === ErrorCode.PSYNC_S1003) {
|
|
275
|
+
this.logReplicationStreamInfoOnce(replicationStream, 'replication-stream-cleanup-locked', () => {
|
|
276
|
+
replicationStream.logger.info(`[${e.errorData.code}] ${e.errorData.description}`);
|
|
277
|
+
});
|
|
278
|
+
}
|
|
279
|
+
else {
|
|
280
|
+
syncRuleStorage.logger.warn(`Failed clean up replication config`, e);
|
|
281
|
+
}
|
|
227
282
|
})
|
|
228
283
|
.finally(() => {
|
|
229
|
-
this.clearingJobs.delete(
|
|
284
|
+
this.clearingJobs.delete(replicationStream.replicationStreamId);
|
|
230
285
|
});
|
|
231
|
-
this.clearingJobs.set(
|
|
286
|
+
this.clearingJobs.set(replicationStream.replicationStreamId, promise);
|
|
287
|
+
}
|
|
288
|
+
return { replicationJobStarted };
|
|
289
|
+
}
|
|
290
|
+
logReplicationStreamInfoOnce(replicationStream, category, log) {
|
|
291
|
+
if (this.lastReplicationStreamInfoLogs.get(replicationStream.replicationStreamName) == category) {
|
|
292
|
+
return;
|
|
232
293
|
}
|
|
294
|
+
log();
|
|
295
|
+
this.lastReplicationStreamInfoLogs.set(replicationStream.replicationStreamName, category);
|
|
296
|
+
}
|
|
297
|
+
clearReplicationStreamInfoLog(replicationStream, category) {
|
|
298
|
+
if (this.lastReplicationStreamInfoLogs.get(replicationStream.replicationStreamName) == category) {
|
|
299
|
+
this.lastReplicationStreamInfoLogs.delete(replicationStream.replicationStreamName);
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
/**
|
|
303
|
+
* When we load sync config from the filesystem/config source, we ignore any config loaded by other processes.
|
|
304
|
+
* The idea is that if a different process loads updated config, that process should process it, not this one.
|
|
305
|
+
*
|
|
306
|
+
* This specifically helps for cases with rolling deploys.
|
|
307
|
+
*
|
|
308
|
+
* This does not apply when sync config is loaded from the database/API, instead of in the config.
|
|
309
|
+
*/
|
|
310
|
+
shouldHandleReplicationStream(replicationStream, loadedSyncRules, loadedVersionLabel) {
|
|
311
|
+
if (loadedSyncRules == null) {
|
|
312
|
+
return true;
|
|
313
|
+
}
|
|
314
|
+
const processingConfig = replicationStream.syncConfigContent.find((syncConfig) => syncConfig.syncConfigState == storage.SyncRuleState.PROCESSING);
|
|
315
|
+
return (processingConfig == null ||
|
|
316
|
+
(processingConfig.sync_rules_content == loadedSyncRules && processingConfig.version_label == loadedVersionLabel));
|
|
233
317
|
}
|
|
234
318
|
createJobId(syncRuleId) {
|
|
235
319
|
return `${this.id}-${syncRuleId}`;
|
|
236
320
|
}
|
|
321
|
+
async terminateStoppedReplicationStream(replicationStream, syncRuleStorage) {
|
|
322
|
+
const lock = await replicationStream.lock();
|
|
323
|
+
this.clearReplicationStreamInfoLog(replicationStream, 'replication-stream-cleanup-locked');
|
|
324
|
+
try {
|
|
325
|
+
await this.terminateSyncRules(syncRuleStorage);
|
|
326
|
+
}
|
|
327
|
+
finally {
|
|
328
|
+
await lock.release();
|
|
329
|
+
}
|
|
330
|
+
}
|
|
237
331
|
async terminateSyncRules(syncRuleStorage) {
|
|
238
332
|
syncRuleStorage.logger.info(`Terminating replication stream...`);
|
|
239
333
|
// This deletes postgres replication slots - should complete quickly.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AbstractReplicator.js","sourceRoot":"","sources":["../../src/replication/AbstractReplicator.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"AbstractReplicator.js","sourceRoot":"","sources":["../../src/replication/AbstractReplicator.ts"],"names":[],"mappings":"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"}
|