@streamr/node 100.0.0-rc.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/LICENSE +78 -0
- package/README.md +54 -0
- package/bin/broker.ts +36 -0
- package/bin/config-wizard.js +4 -0
- package/bin/config-wizard.ts +17 -0
- package/bin/delete-expired-data.ts +41 -0
- package/bin/entry-point.ts +27 -0
- package/configs/development-1.env.json +68 -0
- package/configs/development-2.env.json +53 -0
- package/configs/development-3.env.json +53 -0
- package/configs/development-prod-resend.env.json +21 -0
- package/configs/docker-1.env.json +72 -0
- package/configs/docker-2.env.json +58 -0
- package/configs/docker-3.env.json +58 -0
- package/configuration.md +38 -0
- package/dist/bin/broker.d.ts +2 -0
- package/dist/bin/broker.js +42 -0
- package/dist/bin/broker.js.map +1 -0
- package/dist/bin/config-wizard.d.ts +2 -0
- package/dist/bin/config-wizard.js +22 -0
- package/dist/bin/config-wizard.js.map +1 -0
- package/dist/bin/delete-expired-data.d.ts +2 -0
- package/dist/bin/delete-expired-data.js +44 -0
- package/dist/bin/delete-expired-data.js.map +1 -0
- package/dist/bin/entry-point.d.ts +2 -0
- package/dist/bin/entry-point.js +28 -0
- package/dist/bin/entry-point.js.map +1 -0
- package/dist/package.json +78 -0
- package/dist/src/Plugin.d.ts +33 -0
- package/dist/src/Plugin.js +43 -0
- package/dist/src/Plugin.js.map +1 -0
- package/dist/src/apiAuthentication.d.ts +4 -0
- package/dist/src/apiAuthentication.js +16 -0
- package/dist/src/apiAuthentication.js.map +1 -0
- package/dist/src/broker.d.ts +8 -0
- package/dist/src/broker.js +69 -0
- package/dist/src/broker.js.map +1 -0
- package/dist/src/config/ConfigWizard.d.ts +5 -0
- package/dist/src/config/ConfigWizard.js +466 -0
- package/dist/src/config/ConfigWizard.js.map +1 -0
- package/dist/src/config/config.d.ts +26 -0
- package/dist/src/config/config.js +92 -0
- package/dist/src/config/config.js.map +1 -0
- package/dist/src/config/config.schema.json +86 -0
- package/dist/src/config/definitions.schema.json +35 -0
- package/dist/src/config/migration.d.ts +6 -0
- package/dist/src/config/migration.js +210 -0
- package/dist/src/config/migration.js.map +1 -0
- package/dist/src/config/validateConfig.d.ts +4 -0
- package/dist/src/config/validateConfig.js +40 -0
- package/dist/src/config/validateConfig.js.map +1 -0
- package/dist/src/exports.d.ts +3 -0
- package/dist/src/exports.js +6 -0
- package/dist/src/exports.js.map +1 -0
- package/dist/src/helpers/PayloadFormat.d.ts +19 -0
- package/dist/src/helpers/PayloadFormat.js +85 -0
- package/dist/src/helpers/PayloadFormat.js.map +1 -0
- package/dist/src/helpers/applyPluginClientConfigs.d.ts +3 -0
- package/dist/src/helpers/applyPluginClientConfigs.js +29 -0
- package/dist/src/helpers/applyPluginClientConfigs.js.map +1 -0
- package/dist/src/helpers/fetchOrThrow.d.ts +2 -0
- package/dist/src/helpers/fetchOrThrow.js +20 -0
- package/dist/src/helpers/fetchOrThrow.js.map +1 -0
- package/dist/src/helpers/generateMnemonicFromAddress.d.ts +5 -0
- package/dist/src/helpers/generateMnemonicFromAddress.js +16 -0
- package/dist/src/helpers/generateMnemonicFromAddress.js.map +1 -0
- package/dist/src/helpers/multiply.d.ts +1 -0
- package/dist/src/helpers/multiply.js +10 -0
- package/dist/src/helpers/multiply.js.map +1 -0
- package/dist/src/helpers/parser.d.ts +9 -0
- package/dist/src/helpers/parser.js +62 -0
- package/dist/src/helpers/parser.js.map +1 -0
- package/dist/src/helpers/partitions.d.ts +8 -0
- package/dist/src/helpers/partitions.js +32 -0
- package/dist/src/helpers/partitions.js.map +1 -0
- package/dist/src/helpers/weightedSample.d.ts +16 -0
- package/dist/src/helpers/weightedSample.js +35 -0
- package/dist/src/helpers/weightedSample.js.map +1 -0
- package/dist/src/httpServer.d.ts +16 -0
- package/dist/src/httpServer.js +71 -0
- package/dist/src/httpServer.js.map +1 -0
- package/dist/src/pluginRegistry.d.ts +3 -0
- package/dist/src/pluginRegistry.js +35 -0
- package/dist/src/pluginRegistry.js.map +1 -0
- package/dist/src/plugins/consoleMetrics/ConsoleMetricsPlugin.d.ts +12 -0
- package/dist/src/plugins/consoleMetrics/ConsoleMetricsPlugin.js +36 -0
- package/dist/src/plugins/consoleMetrics/ConsoleMetricsPlugin.js.map +1 -0
- package/dist/src/plugins/consoleMetrics/config.schema.json +18 -0
- package/dist/src/plugins/http/HttpPlugin.d.ts +8 -0
- package/dist/src/plugins/http/HttpPlugin.js +23 -0
- package/dist/src/plugins/http/HttpPlugin.js.map +1 -0
- package/dist/src/plugins/http/config.schema.json +12 -0
- package/dist/src/plugins/http/publishEndpoint.d.ts +3 -0
- package/dist/src/plugins/http/publishEndpoint.js +72 -0
- package/dist/src/plugins/http/publishEndpoint.js.map +1 -0
- package/dist/src/plugins/info/InfoPlugin.d.ts +9 -0
- package/dist/src/plugins/info/InfoPlugin.js +31 -0
- package/dist/src/plugins/info/InfoPlugin.js.map +1 -0
- package/dist/src/plugins/info/config.schema.json +12 -0
- package/dist/src/plugins/mqtt/Bridge.d.ts +40 -0
- package/dist/src/plugins/mqtt/Bridge.js +136 -0
- package/dist/src/plugins/mqtt/Bridge.js.map +1 -0
- package/dist/src/plugins/mqtt/MqttPlugin.d.ts +14 -0
- package/dist/src/plugins/mqtt/MqttPlugin.js +30 -0
- package/dist/src/plugins/mqtt/MqttPlugin.js.map +1 -0
- package/dist/src/plugins/mqtt/MqttServer.d.ts +22 -0
- package/dist/src/plugins/mqtt/MqttServer.js +109 -0
- package/dist/src/plugins/mqtt/MqttServer.js.map +1 -0
- package/dist/src/plugins/mqtt/config.schema.json +26 -0
- package/dist/src/plugins/operator/ConsistentHashRing.d.ts +20 -0
- package/dist/src/plugins/operator/ConsistentHashRing.js +64 -0
- package/dist/src/plugins/operator/ConsistentHashRing.js.map +1 -0
- package/dist/src/plugins/operator/ContractFacade.d.ts +80 -0
- package/dist/src/plugins/operator/ContractFacade.js +364 -0
- package/dist/src/plugins/operator/ContractFacade.js.map +1 -0
- package/dist/src/plugins/operator/MaintainTopologyHelper.d.ts +23 -0
- package/dist/src/plugins/operator/MaintainTopologyHelper.js +75 -0
- package/dist/src/plugins/operator/MaintainTopologyHelper.js.map +1 -0
- package/dist/src/plugins/operator/MaintainTopologyService.d.ts +11 -0
- package/dist/src/plugins/operator/MaintainTopologyService.js +57 -0
- package/dist/src/plugins/operator/MaintainTopologyService.js.map +1 -0
- package/dist/src/plugins/operator/OperatorFleetState.d.ts +33 -0
- package/dist/src/plugins/operator/OperatorFleetState.js +112 -0
- package/dist/src/plugins/operator/OperatorFleetState.js.map +1 -0
- package/dist/src/plugins/operator/OperatorPlugin.d.ts +50 -0
- package/dist/src/plugins/operator/OperatorPlugin.js +159 -0
- package/dist/src/plugins/operator/OperatorPlugin.js.map +1 -0
- package/dist/src/plugins/operator/StreamPartAssignments.d.ts +28 -0
- package/dist/src/plugins/operator/StreamPartAssignments.js +104 -0
- package/dist/src/plugins/operator/StreamPartAssignments.js.map +1 -0
- package/dist/src/plugins/operator/announceNodeToContract.d.ts +3 -0
- package/dist/src/plugins/operator/announceNodeToContract.js +39 -0
- package/dist/src/plugins/operator/announceNodeToContract.js.map +1 -0
- package/dist/src/plugins/operator/announceNodeToStream.d.ts +3 -0
- package/dist/src/plugins/operator/announceNodeToStream.js +25 -0
- package/dist/src/plugins/operator/announceNodeToStream.js.map +1 -0
- package/dist/src/plugins/operator/checkOperatorValueBreach.d.ts +2 -0
- package/dist/src/plugins/operator/checkOperatorValueBreach.js +21 -0
- package/dist/src/plugins/operator/checkOperatorValueBreach.js.map +1 -0
- package/dist/src/plugins/operator/closeExpiredFlags.d.ts +3 -0
- package/dist/src/plugins/operator/closeExpiredFlags.js +24 -0
- package/dist/src/plugins/operator/closeExpiredFlags.js.map +1 -0
- package/dist/src/plugins/operator/config.schema.json +152 -0
- package/dist/src/plugins/operator/createIsLeaderFn.d.ts +4 -0
- package/dist/src/plugins/operator/createIsLeaderFn.js +14 -0
- package/dist/src/plugins/operator/createIsLeaderFn.js.map +1 -0
- package/dist/src/plugins/operator/fetchRedundancyFactor.d.ts +2 -0
- package/dist/src/plugins/operator/fetchRedundancyFactor.js +43 -0
- package/dist/src/plugins/operator/fetchRedundancyFactor.js.map +1 -0
- package/dist/src/plugins/operator/formCoordinationStreamId.d.ts +3 -0
- package/dist/src/plugins/operator/formCoordinationStreamId.js +9 -0
- package/dist/src/plugins/operator/formCoordinationStreamId.js.map +1 -0
- package/dist/src/plugins/operator/heartbeatUtils.d.ts +67 -0
- package/dist/src/plugins/operator/heartbeatUtils.js +26 -0
- package/dist/src/plugins/operator/heartbeatUtils.js.map +1 -0
- package/dist/src/plugins/operator/inspectOverTime.d.ts +22 -0
- package/dist/src/plugins/operator/inspectOverTime.js +146 -0
- package/dist/src/plugins/operator/inspectOverTime.js.map +1 -0
- package/dist/src/plugins/operator/inspectRandomNode.d.ts +8 -0
- package/dist/src/plugins/operator/inspectRandomNode.js +44 -0
- package/dist/src/plugins/operator/inspectRandomNode.js.map +1 -0
- package/dist/src/plugins/operator/inspectionUtils.d.ts +23 -0
- package/dist/src/plugins/operator/inspectionUtils.js +120 -0
- package/dist/src/plugins/operator/inspectionUtils.js.map +1 -0
- package/dist/src/plugins/operator/maintainOperatorValue.d.ts +2 -0
- package/dist/src/plugins/operator/maintainOperatorValue.js +21 -0
- package/dist/src/plugins/operator/maintainOperatorValue.js.map +1 -0
- package/dist/src/plugins/operator/reviewSuspectNode.d.ts +24 -0
- package/dist/src/plugins/operator/reviewSuspectNode.js +56 -0
- package/dist/src/plugins/operator/reviewSuspectNode.js.map +1 -0
- package/dist/src/plugins/storage/Batch.d.ts +51 -0
- package/dist/src/plugins/storage/Batch.js +121 -0
- package/dist/src/plugins/storage/Batch.js.map +1 -0
- package/dist/src/plugins/storage/BatchManager.d.ts +27 -0
- package/dist/src/plugins/storage/BatchManager.js +117 -0
- package/dist/src/plugins/storage/BatchManager.js.map +1 -0
- package/dist/src/plugins/storage/Bucket.d.ts +23 -0
- package/dist/src/plugins/storage/Bucket.js +90 -0
- package/dist/src/plugins/storage/Bucket.js.map +1 -0
- package/dist/src/plugins/storage/BucketManager.d.ts +56 -0
- package/dist/src/plugins/storage/BucketManager.js +306 -0
- package/dist/src/plugins/storage/BucketManager.js.map +1 -0
- package/dist/src/plugins/storage/DataQueryFormat.d.ts +10 -0
- package/dist/src/plugins/storage/DataQueryFormat.js +51 -0
- package/dist/src/plugins/storage/DataQueryFormat.js.map +1 -0
- package/dist/src/plugins/storage/DeleteExpiredCmd.d.ts +28 -0
- package/dist/src/plugins/storage/DeleteExpiredCmd.js +155 -0
- package/dist/src/plugins/storage/DeleteExpiredCmd.js.map +1 -0
- package/dist/src/plugins/storage/SetMembershipSynchronizer.d.ts +33 -0
- package/dist/src/plugins/storage/SetMembershipSynchronizer.js +102 -0
- package/dist/src/plugins/storage/SetMembershipSynchronizer.js.map +1 -0
- package/dist/src/plugins/storage/Storage.d.ts +47 -0
- package/dist/src/plugins/storage/Storage.js +459 -0
- package/dist/src/plugins/storage/Storage.js.map +1 -0
- package/dist/src/plugins/storage/StorageConfig.d.ts +43 -0
- package/dist/src/plugins/storage/StorageConfig.js +83 -0
- package/dist/src/plugins/storage/StorageConfig.js.map +1 -0
- package/dist/src/plugins/storage/StorageEventListener.d.ts +17 -0
- package/dist/src/plugins/storage/StorageEventListener.js +46 -0
- package/dist/src/plugins/storage/StorageEventListener.js.map +1 -0
- package/dist/src/plugins/storage/StoragePlugin.d.ts +32 -0
- package/dist/src/plugins/storage/StoragePlugin.js +103 -0
- package/dist/src/plugins/storage/StoragePlugin.js.map +1 -0
- package/dist/src/plugins/storage/StoragePoller.d.ts +15 -0
- package/dist/src/plugins/storage/StoragePoller.js +47 -0
- package/dist/src/plugins/storage/StoragePoller.js.map +1 -0
- package/dist/src/plugins/storage/config.schema.json +88 -0
- package/dist/src/plugins/storage/dataMetadataEndpoint.d.ts +3 -0
- package/dist/src/plugins/storage/dataMetadataEndpoint.js +35 -0
- package/dist/src/plugins/storage/dataMetadataEndpoint.js.map +1 -0
- package/dist/src/plugins/storage/dataQueryEndpoint.d.ts +6 -0
- package/dist/src/plugins/storage/dataQueryEndpoint.js +181 -0
- package/dist/src/plugins/storage/dataQueryEndpoint.js.map +1 -0
- package/dist/src/plugins/storage/storageConfigEndpoint.d.ts +3 -0
- package/dist/src/plugins/storage/storageConfigEndpoint.js +31 -0
- package/dist/src/plugins/storage/storageConfigEndpoint.js.map +1 -0
- package/dist/src/plugins/subscriber/SubscriberPlugin.d.ts +16 -0
- package/dist/src/plugins/subscriber/SubscriberPlugin.js +22 -0
- package/dist/src/plugins/subscriber/SubscriberPlugin.js.map +1 -0
- package/dist/src/plugins/subscriber/config.schema.json +31 -0
- package/dist/src/plugins/websocket/Connection.d.ts +9 -0
- package/dist/src/plugins/websocket/Connection.js +45 -0
- package/dist/src/plugins/websocket/Connection.js.map +1 -0
- package/dist/src/plugins/websocket/PublishConnection.d.ts +12 -0
- package/dist/src/plugins/websocket/PublishConnection.js +46 -0
- package/dist/src/plugins/websocket/PublishConnection.js.map +1 -0
- package/dist/src/plugins/websocket/SubscribeConnection.d.ts +13 -0
- package/dist/src/plugins/websocket/SubscribeConnection.js +50 -0
- package/dist/src/plugins/websocket/SubscribeConnection.js.map +1 -0
- package/dist/src/plugins/websocket/WebsocketPlugin.d.ts +19 -0
- package/dist/src/plugins/websocket/WebsocketPlugin.js +26 -0
- package/dist/src/plugins/websocket/WebsocketPlugin.js.map +1 -0
- package/dist/src/plugins/websocket/WebsocketServer.d.ts +16 -0
- package/dist/src/plugins/websocket/WebsocketServer.js +132 -0
- package/dist/src/plugins/websocket/WebsocketServer.js.map +1 -0
- package/dist/src/plugins/websocket/config.schema.json +51 -0
- package/package.json +78 -0
- package/plugins.md +318 -0
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.DeleteExpiredCmd = void 0;
|
|
7
|
+
const cassandra_driver_1 = __importDefault(require("cassandra-driver"));
|
|
8
|
+
const p_limit_1 = __importDefault(require("p-limit"));
|
|
9
|
+
const utils_1 = require("@streamr/utils");
|
|
10
|
+
const logger = new utils_1.Logger(module);
|
|
11
|
+
const totalSizeOfBuckets = (buckets) => buckets.reduce((mem, { size }) => mem + size, 0) / (1024 * 1024);
|
|
12
|
+
const totalRecordCount = (buckets) => buckets.reduce((mem, { records }) => mem + records, 0);
|
|
13
|
+
class DeleteExpiredCmd {
|
|
14
|
+
streamrBaseUrl;
|
|
15
|
+
dryRun;
|
|
16
|
+
bucketLimit;
|
|
17
|
+
cassandraClient;
|
|
18
|
+
limit;
|
|
19
|
+
constructor({ streamrBaseUrl, cassandraUsername, cassandraPassword, cassandraHosts, cassandraDatacenter, cassandraKeyspace, bucketLimit, dryRun = true }) {
|
|
20
|
+
this.streamrBaseUrl = streamrBaseUrl;
|
|
21
|
+
this.dryRun = dryRun;
|
|
22
|
+
this.bucketLimit = bucketLimit || 10000000;
|
|
23
|
+
const authProvider = new cassandra_driver_1.default.auth.PlainTextAuthProvider(cassandraUsername, cassandraPassword);
|
|
24
|
+
this.cassandraClient = new cassandra_driver_1.default.Client({
|
|
25
|
+
contactPoints: [...cassandraHosts],
|
|
26
|
+
localDataCenter: cassandraDatacenter,
|
|
27
|
+
keyspace: cassandraKeyspace,
|
|
28
|
+
authProvider,
|
|
29
|
+
});
|
|
30
|
+
// used for limited concurrency
|
|
31
|
+
this.limit = (0, p_limit_1.default)(5);
|
|
32
|
+
}
|
|
33
|
+
async run(client) {
|
|
34
|
+
const streams = await this.getStreams();
|
|
35
|
+
logger.info(`Found ${streams.length} unique streams`);
|
|
36
|
+
const streamsInfo = await this.fetchStreamsInfo(streams, client);
|
|
37
|
+
const potentialBuckets = await this.getPotentiallyExpiredBuckets(streamsInfo);
|
|
38
|
+
logger.info(`Found ${potentialBuckets.length} potentially expired buckets`);
|
|
39
|
+
const cutPotentialBuckets = potentialBuckets.slice(0, this.bucketLimit);
|
|
40
|
+
logger.info(`Left with ${cutPotentialBuckets.length} potentially expired buckets after cutting`);
|
|
41
|
+
const expiredBuckets = await this.filterExpiredBuckets(cutPotentialBuckets);
|
|
42
|
+
logger.info(`Found ${expiredBuckets.length} expired buckets`, {
|
|
43
|
+
totalRecords: totalRecordCount(expiredBuckets),
|
|
44
|
+
totalSizeOfBucketsInMb: totalSizeOfBuckets(expiredBuckets)
|
|
45
|
+
});
|
|
46
|
+
if (!this.dryRun) {
|
|
47
|
+
await this.deleteExpired(expiredBuckets);
|
|
48
|
+
}
|
|
49
|
+
await this.cassandraClient.shutdown();
|
|
50
|
+
}
|
|
51
|
+
async getStreams() {
|
|
52
|
+
const query = 'SELECT DISTINCT stream_id, partition FROM bucket';
|
|
53
|
+
const resultSet = await this.cassandraClient.execute(query, [], {
|
|
54
|
+
fetchSize: 100000
|
|
55
|
+
});
|
|
56
|
+
return resultSet.rows.map((row) => ({
|
|
57
|
+
streamId: row.stream_id,
|
|
58
|
+
partition: row.partition
|
|
59
|
+
}));
|
|
60
|
+
}
|
|
61
|
+
async fetchStreamsInfo(streams, client) {
|
|
62
|
+
const tasks = streams.filter(Boolean).map((stream) => {
|
|
63
|
+
return this.limit(async () => {
|
|
64
|
+
try {
|
|
65
|
+
const streamFromChain = await client.getStream(stream.streamId);
|
|
66
|
+
return {
|
|
67
|
+
streamId: stream.streamId,
|
|
68
|
+
partition: stream.partition,
|
|
69
|
+
storageDays: streamFromChain.getMetadata().storageDays ?? 365
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
catch (err) {
|
|
73
|
+
logger.error('Failed to fetch stream info', { err });
|
|
74
|
+
}
|
|
75
|
+
});
|
|
76
|
+
});
|
|
77
|
+
return Promise.all(tasks);
|
|
78
|
+
}
|
|
79
|
+
async getPotentiallyExpiredBuckets(streamsInfo) {
|
|
80
|
+
const result = [];
|
|
81
|
+
const query = 'SELECT * FROM bucket WHERE stream_id = ? AND partition = ? AND date_create <= ?';
|
|
82
|
+
// @ts-expect-error void filtering
|
|
83
|
+
const tasks = streamsInfo.filter(Boolean).map((stream) => {
|
|
84
|
+
const { streamId, partition, storageDays } = stream;
|
|
85
|
+
const timestampBefore = Date.now() - 1000 * 60 * 60 * 24 * storageDays;
|
|
86
|
+
const params = [streamId, partition, timestampBefore];
|
|
87
|
+
return this.limit(async () => {
|
|
88
|
+
const resultSet = await this.cassandraClient.execute(query, params, {
|
|
89
|
+
prepare: true,
|
|
90
|
+
}).catch((err) => logger.error('Failed to execute query', { err, query }));
|
|
91
|
+
if (resultSet) {
|
|
92
|
+
resultSet.rows.forEach((row) => {
|
|
93
|
+
result.push({
|
|
94
|
+
bucketId: row.id,
|
|
95
|
+
dateCreate: row.date_create,
|
|
96
|
+
streamId: row.stream_id,
|
|
97
|
+
partition: row.partition,
|
|
98
|
+
records: row.records,
|
|
99
|
+
size: row.size,
|
|
100
|
+
storageDays
|
|
101
|
+
});
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
});
|
|
105
|
+
});
|
|
106
|
+
await Promise.all(tasks);
|
|
107
|
+
return result;
|
|
108
|
+
}
|
|
109
|
+
async filterExpiredBuckets(potentialBuckets) {
|
|
110
|
+
const result = [];
|
|
111
|
+
const query = 'SELECT MAX(ts) AS m FROM stream_data WHERE stream_id = ? AND partition = ? AND bucket_id = ?';
|
|
112
|
+
const tasks = potentialBuckets.filter(Boolean).map((bucket) => {
|
|
113
|
+
const { streamId, partition, bucketId, storageDays } = bucket;
|
|
114
|
+
const timestampBefore = Date.now() - 1000 * 60 * 60 * 24 * storageDays;
|
|
115
|
+
const params = [streamId, partition, bucketId];
|
|
116
|
+
return this.limit(async () => {
|
|
117
|
+
const resultSet = await this.cassandraClient.execute(query, params, {
|
|
118
|
+
prepare: true,
|
|
119
|
+
}).catch((err) => logger.error('Failed to execute query', { err, query }));
|
|
120
|
+
if (resultSet && (resultSet.rows.length === 0
|
|
121
|
+
|| resultSet.rows[0].m === null
|
|
122
|
+
|| resultSet.rows[0].m.getTime() < timestampBefore)) {
|
|
123
|
+
result.push(bucket);
|
|
124
|
+
}
|
|
125
|
+
});
|
|
126
|
+
});
|
|
127
|
+
await Promise.all(tasks);
|
|
128
|
+
return result;
|
|
129
|
+
}
|
|
130
|
+
async deleteExpired(expiredBuckets) {
|
|
131
|
+
const tasks = expiredBuckets.filter(Boolean).map((stream) => {
|
|
132
|
+
const { bucketId, dateCreate, streamId, partition } = stream;
|
|
133
|
+
const queries = [
|
|
134
|
+
{
|
|
135
|
+
query: 'DELETE FROM bucket WHERE stream_id = ? AND partition = ? AND date_create = ?',
|
|
136
|
+
params: [streamId, partition, dateCreate]
|
|
137
|
+
},
|
|
138
|
+
{
|
|
139
|
+
query: 'DELETE FROM stream_data WHERE stream_id = ? AND partition = ? AND bucket_id = ?',
|
|
140
|
+
params: [streamId, partition, bucketId]
|
|
141
|
+
}
|
|
142
|
+
];
|
|
143
|
+
logger.info('Delete expired bucket', { streamId, partition, bucketId });
|
|
144
|
+
return this.limit(async () => {
|
|
145
|
+
await this.cassandraClient.batch(queries, {
|
|
146
|
+
prepare: true
|
|
147
|
+
}).catch((err) => logger.error('Failed to delete expired buckets', { err, queries }));
|
|
148
|
+
return undefined;
|
|
149
|
+
});
|
|
150
|
+
});
|
|
151
|
+
return Promise.all(tasks);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
exports.DeleteExpiredCmd = DeleteExpiredCmd;
|
|
155
|
+
//# sourceMappingURL=DeleteExpiredCmd.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DeleteExpiredCmd.js","sourceRoot":"","sources":["../../../../src/plugins/storage/DeleteExpiredCmd.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
export interface Diff<E extends string> {
|
|
2
|
+
added: E[];
|
|
3
|
+
removed: E[];
|
|
4
|
+
}
|
|
5
|
+
export declare const EMPTY_DIFF: Diff<never>;
|
|
6
|
+
/**
|
|
7
|
+
* Represents a set that evolves over (discrete) time. The set is updated in
|
|
8
|
+
* two distinct ways:
|
|
9
|
+
* 1. Snapshots that define the set at a given time step.
|
|
10
|
+
* 2. Patches that add or remove a subset at a given time step.
|
|
11
|
+
*/
|
|
12
|
+
export declare class SetMembershipSynchronizer<E extends string> {
|
|
13
|
+
private lastSnapshotSequenceNo;
|
|
14
|
+
private state;
|
|
15
|
+
private lastSequenceNoByElement;
|
|
16
|
+
/**
|
|
17
|
+
* Get up-to-date view of state
|
|
18
|
+
*/
|
|
19
|
+
getState(): ReadonlySet<E>;
|
|
20
|
+
/**
|
|
21
|
+
* Ingest a snapshot at a given sequence number
|
|
22
|
+
* @param elements the set of _all_ elements in this snapshot
|
|
23
|
+
* @param sequenceNo the sequence number for this snapshot
|
|
24
|
+
*/
|
|
25
|
+
ingestSnapshot(elements: Set<E>, sequenceNo: number): Diff<E>;
|
|
26
|
+
/**
|
|
27
|
+
* Ingest a patch
|
|
28
|
+
* @param elements the set of elements relevant to this patch
|
|
29
|
+
* @param operation indicates whether this is an addition or a removal
|
|
30
|
+
* @param sequenceNo the sequence number for this patch
|
|
31
|
+
*/
|
|
32
|
+
ingestPatch(elements: Set<E>, operation: 'added' | 'removed', sequenceNo: number): Diff<E>;
|
|
33
|
+
}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SetMembershipSynchronizer = exports.EMPTY_DIFF = void 0;
|
|
4
|
+
const utils_1 = require("@streamr/utils");
|
|
5
|
+
const logger = new utils_1.Logger(module);
|
|
6
|
+
exports.EMPTY_DIFF = Object.freeze({
|
|
7
|
+
added: [],
|
|
8
|
+
removed: []
|
|
9
|
+
});
|
|
10
|
+
function setDifference(setA, setB) {
|
|
11
|
+
return [...setA].filter((el) => !setB.has(el));
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Represents a set that evolves over (discrete) time. The set is updated in
|
|
15
|
+
* two distinct ways:
|
|
16
|
+
* 1. Snapshots that define the set at a given time step.
|
|
17
|
+
* 2. Patches that add or remove a subset at a given time step.
|
|
18
|
+
*/
|
|
19
|
+
class SetMembershipSynchronizer {
|
|
20
|
+
lastSnapshotSequenceNo = 0;
|
|
21
|
+
state = new Set(); // snapshot + patches
|
|
22
|
+
lastSequenceNoByElement = new Map();
|
|
23
|
+
/**
|
|
24
|
+
* Get up-to-date view of state
|
|
25
|
+
*/
|
|
26
|
+
getState() {
|
|
27
|
+
return this.state;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Ingest a snapshot at a given sequence number
|
|
31
|
+
* @param elements the set of _all_ elements in this snapshot
|
|
32
|
+
* @param sequenceNo the sequence number for this snapshot
|
|
33
|
+
*/
|
|
34
|
+
ingestSnapshot(elements, sequenceNo) {
|
|
35
|
+
if (sequenceNo <= this.lastSnapshotSequenceNo) {
|
|
36
|
+
logger.warn('Ignore snapshot (stale sequenceNo)', {
|
|
37
|
+
sequenceNo,
|
|
38
|
+
lastSnapshotSequenceNo: this.lastSnapshotSequenceNo
|
|
39
|
+
});
|
|
40
|
+
return exports.EMPTY_DIFF;
|
|
41
|
+
}
|
|
42
|
+
this.lastSnapshotSequenceNo = sequenceNo;
|
|
43
|
+
// delete stale patches
|
|
44
|
+
this.lastSequenceNoByElement.forEach((patchSequenceNo, element) => {
|
|
45
|
+
if (patchSequenceNo <= sequenceNo) {
|
|
46
|
+
this.lastSequenceNoByElement.delete(element);
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
// apply patches
|
|
50
|
+
const previousState = this.state;
|
|
51
|
+
this.state = new Set(elements);
|
|
52
|
+
this.lastSequenceNoByElement.forEach((_, element) => {
|
|
53
|
+
if (previousState.has(element)) {
|
|
54
|
+
this.state.add(element);
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
this.state.delete(element);
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
return {
|
|
61
|
+
added: setDifference(this.state, previousState),
|
|
62
|
+
removed: setDifference(previousState, this.state)
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Ingest a patch
|
|
67
|
+
* @param elements the set of elements relevant to this patch
|
|
68
|
+
* @param operation indicates whether this is an addition or a removal
|
|
69
|
+
* @param sequenceNo the sequence number for this patch
|
|
70
|
+
*/
|
|
71
|
+
ingestPatch(elements, operation, sequenceNo) {
|
|
72
|
+
if (sequenceNo <= this.lastSnapshotSequenceNo) {
|
|
73
|
+
return exports.EMPTY_DIFF;
|
|
74
|
+
}
|
|
75
|
+
const nonStaleElements = [...elements].filter((element) => (sequenceNo > (this.lastSequenceNoByElement.get(element) || 0)));
|
|
76
|
+
nonStaleElements.forEach((element) => {
|
|
77
|
+
this.lastSequenceNoByElement.set(element, sequenceNo);
|
|
78
|
+
});
|
|
79
|
+
if (operation === 'added') {
|
|
80
|
+
return {
|
|
81
|
+
removed: [],
|
|
82
|
+
added: nonStaleElements.filter((element) => {
|
|
83
|
+
const didStateChange = !this.state.has(element);
|
|
84
|
+
this.state.add(element);
|
|
85
|
+
return didStateChange;
|
|
86
|
+
}),
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
return {
|
|
91
|
+
added: [],
|
|
92
|
+
removed: nonStaleElements.filter((element) => {
|
|
93
|
+
const didStateChange = this.state.has(element);
|
|
94
|
+
this.state.delete(element);
|
|
95
|
+
return didStateChange;
|
|
96
|
+
})
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
exports.SetMembershipSynchronizer = SetMembershipSynchronizer;
|
|
102
|
+
//# sourceMappingURL=SetMembershipSynchronizer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SetMembershipSynchronizer.js","sourceRoot":"","sources":["../../../../src/plugins/storage/SetMembershipSynchronizer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
/// <reference types="node" />
|
|
3
|
+
/// <reference types="node" />
|
|
4
|
+
import { Client } from 'cassandra-driver';
|
|
5
|
+
import { MetricsContext } from '@streamr/utils';
|
|
6
|
+
import { BatchManager } from './BatchManager';
|
|
7
|
+
import { Readable } from 'stream';
|
|
8
|
+
import { EventEmitter } from 'events';
|
|
9
|
+
import { StreamMessage } from '@streamr/protocol';
|
|
10
|
+
import { BucketManager, BucketManagerOptions } from './BucketManager';
|
|
11
|
+
export interface StartCassandraOptions {
|
|
12
|
+
contactPoints: string[];
|
|
13
|
+
localDataCenter: string;
|
|
14
|
+
keyspace: string;
|
|
15
|
+
username?: string;
|
|
16
|
+
password?: string;
|
|
17
|
+
opts?: Partial<BucketManagerOptions & {
|
|
18
|
+
useTtl: boolean;
|
|
19
|
+
}>;
|
|
20
|
+
}
|
|
21
|
+
export type StorageOptions = Partial<BucketManagerOptions> & {
|
|
22
|
+
useTtl?: boolean;
|
|
23
|
+
retriesIntervalMilliseconds?: number;
|
|
24
|
+
};
|
|
25
|
+
export declare class Storage extends EventEmitter {
|
|
26
|
+
opts: StorageOptions;
|
|
27
|
+
cassandraClient: Client;
|
|
28
|
+
bucketManager: BucketManager;
|
|
29
|
+
batchManager: BatchManager;
|
|
30
|
+
pendingStores: Map<string, NodeJS.Timeout>;
|
|
31
|
+
constructor(cassandraClient: Client, opts: StorageOptions);
|
|
32
|
+
store(streamMessage: StreamMessage): Promise<boolean>;
|
|
33
|
+
requestLast(streamId: string, partition: number, limit: number): Readable;
|
|
34
|
+
requestFrom(streamId: string, partition: number, fromTimestamp: number, fromSequenceNo: number, publisherId?: string): Readable;
|
|
35
|
+
requestRange(streamId: string, partition: number, fromTimestamp: number, fromSequenceNo: number, toTimestamp: number, toSequenceNo: number, publisherId: string | undefined, msgChainId: string | undefined): Readable;
|
|
36
|
+
enableMetrics(metricsContext: MetricsContext): void;
|
|
37
|
+
close(): Promise<void>;
|
|
38
|
+
private fetchRange;
|
|
39
|
+
private queryWithStreamingResults;
|
|
40
|
+
private parseRow;
|
|
41
|
+
private createResultStream;
|
|
42
|
+
getFirstMessageTimestampInStream(streamId: string, partition: number): Promise<number>;
|
|
43
|
+
getLastMessageTimestampInStream(streamId: string, partition: number): Promise<number>;
|
|
44
|
+
getNumberOfMessagesInStream(streamId: string, partition: number): Promise<number>;
|
|
45
|
+
getTotalBytesInStream(streamId: string, partition: number): Promise<number>;
|
|
46
|
+
}
|
|
47
|
+
export declare const startCassandraStorage: ({ contactPoints, localDataCenter, keyspace, username, password, opts }: StartCassandraOptions) => Promise<Storage>;
|