envio 3.0.0-alpha.2 → 3.0.0-alpha.3
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/evm.schema.json +44 -33
- package/fuel.schema.json +32 -21
- package/index.d.ts +1 -0
- package/package.json +7 -6
- package/src/Batch.res.mjs +1 -1
- package/src/Benchmark.res +394 -0
- package/src/Benchmark.res.mjs +398 -0
- package/src/ChainFetcher.res +459 -0
- package/src/ChainFetcher.res.mjs +281 -0
- package/src/ChainManager.res +179 -0
- package/src/ChainManager.res.mjs +139 -0
- package/src/Config.res +15 -1
- package/src/Config.res.mjs +27 -4
- package/src/Ecosystem.res +9 -124
- package/src/Ecosystem.res.mjs +19 -160
- package/src/Env.res +0 -1
- package/src/Env.res.mjs +0 -3
- package/src/Envio.gen.ts +9 -1
- package/src/Envio.res +12 -9
- package/src/EventProcessing.res +476 -0
- package/src/EventProcessing.res.mjs +341 -0
- package/src/FetchState.res +54 -29
- package/src/FetchState.res.mjs +62 -35
- package/src/GlobalState.res +1169 -0
- package/src/GlobalState.res.mjs +1196 -0
- package/src/Internal.res +2 -1
- package/src/LoadLayer.res +444 -0
- package/src/LoadLayer.res.mjs +296 -0
- package/src/LoadLayer.resi +32 -0
- package/src/Prometheus.res +8 -8
- package/src/Prometheus.res.mjs +10 -10
- package/src/ReorgDetection.res +6 -10
- package/src/ReorgDetection.res.mjs +6 -6
- package/src/UserContext.res +356 -0
- package/src/UserContext.res.mjs +238 -0
- package/src/bindings/DateFns.res +71 -0
- package/src/bindings/DateFns.res.mjs +22 -0
- package/src/sources/Evm.res +87 -0
- package/src/sources/Evm.res.mjs +105 -0
- package/src/sources/EvmChain.res +95 -0
- package/src/sources/EvmChain.res.mjs +61 -0
- package/src/sources/Fuel.res +19 -34
- package/src/sources/Fuel.res.mjs +34 -16
- package/src/sources/FuelSDK.res +37 -0
- package/src/sources/FuelSDK.res.mjs +29 -0
- package/src/sources/HyperFuel.res +2 -2
- package/src/sources/HyperFuel.resi +1 -1
- package/src/sources/HyperFuelClient.res +2 -2
- package/src/sources/HyperFuelSource.res +8 -8
- package/src/sources/HyperFuelSource.res.mjs +5 -5
- package/src/sources/HyperSyncSource.res +5 -5
- package/src/sources/HyperSyncSource.res.mjs +5 -5
- package/src/sources/RpcSource.res +4 -4
- package/src/sources/RpcSource.res.mjs +3 -3
- package/src/sources/Solana.res +59 -0
- package/src/sources/Solana.res.mjs +79 -0
- package/src/sources/Source.res +2 -2
- package/src/sources/SourceManager.res +24 -32
- package/src/sources/SourceManager.res.mjs +20 -20
- package/src/sources/SourceManager.resi +4 -5
|
@@ -0,0 +1,1196 @@
|
|
|
1
|
+
// Generated by ReScript, PLEASE EDIT WITH CARE
|
|
2
|
+
|
|
3
|
+
import * as Env from "./Env.res.mjs";
|
|
4
|
+
import * as Batch from "./Batch.res.mjs";
|
|
5
|
+
import * as Utils from "./Utils.res.mjs";
|
|
6
|
+
import * as Config from "./Config.res.mjs";
|
|
7
|
+
import * as Hrtime from "./bindings/Hrtime.res.mjs";
|
|
8
|
+
import * as Js_exn from "rescript/lib/es6/js_exn.js";
|
|
9
|
+
import * as Js_null from "rescript/lib/es6/js_null.js";
|
|
10
|
+
import * as Logging from "./Logging.res.mjs";
|
|
11
|
+
import * as Process from "process";
|
|
12
|
+
import * as Belt_Int from "rescript/lib/es6/belt_Int.js";
|
|
13
|
+
import * as Caml_obj from "rescript/lib/es6/caml_obj.js";
|
|
14
|
+
import * as ChainMap from "./ChainMap.res.mjs";
|
|
15
|
+
import * as Benchmark from "./Benchmark.res.mjs";
|
|
16
|
+
import * as Throttler from "./Throttler.res.mjs";
|
|
17
|
+
import * as Belt_Array from "rescript/lib/es6/belt_Array.js";
|
|
18
|
+
import * as FetchState from "./FetchState.res.mjs";
|
|
19
|
+
import * as Prometheus from "./Prometheus.res.mjs";
|
|
20
|
+
import * as Belt_Option from "rescript/lib/es6/belt_Option.js";
|
|
21
|
+
import * as Caml_option from "rescript/lib/es6/caml_option.js";
|
|
22
|
+
import * as LoadManager from "./LoadManager.res.mjs";
|
|
23
|
+
import * as Persistence from "./Persistence.res.mjs";
|
|
24
|
+
import * as ChainFetcher from "./ChainFetcher.res.mjs";
|
|
25
|
+
import * as ChainManager from "./ChainManager.res.mjs";
|
|
26
|
+
import * as ErrorHandling from "./ErrorHandling.res.mjs";
|
|
27
|
+
import * as InMemoryStore from "./InMemoryStore.res.mjs";
|
|
28
|
+
import * as SourceManager from "./sources/SourceManager.res.mjs";
|
|
29
|
+
import * as ReorgDetection from "./ReorgDetection.res.mjs";
|
|
30
|
+
import * as EventProcessing from "./EventProcessing.res.mjs";
|
|
31
|
+
import * as S$RescriptSchema from "rescript-schema/src/S.res.mjs";
|
|
32
|
+
import * as Caml_js_exceptions from "rescript/lib/es6/caml_js_exceptions.js";
|
|
33
|
+
import * as SafeCheckpointTracking from "./SafeCheckpointTracking.res.mjs";
|
|
34
|
+
|
|
35
|
+
function make() {
|
|
36
|
+
var intervalMillis = Env.ThrottleWrites.chainMetadataIntervalMillis;
|
|
37
|
+
var logger = Logging.createChild({
|
|
38
|
+
context: "Throttler for chain metadata writes",
|
|
39
|
+
intervalMillis: intervalMillis
|
|
40
|
+
});
|
|
41
|
+
var chainMetaData = Throttler.make(intervalMillis, logger);
|
|
42
|
+
var intervalMillis$1 = Env.ThrottleWrites.pruneStaleDataIntervalMillis;
|
|
43
|
+
var logger$1 = Logging.createChild({
|
|
44
|
+
context: "Throttler for pruning stale entity history data",
|
|
45
|
+
intervalMillis: intervalMillis$1
|
|
46
|
+
});
|
|
47
|
+
var pruneStaleEntityHistory = Throttler.make(intervalMillis$1, logger$1);
|
|
48
|
+
return {
|
|
49
|
+
chainMetaData: chainMetaData,
|
|
50
|
+
pruneStaleEntityHistory: pruneStaleEntityHistory
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
var WriteThrottlers = {
|
|
55
|
+
make: make
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
function make$1(indexer, chainManager, isDevelopmentModeOpt, shouldUseTuiOpt) {
|
|
59
|
+
var isDevelopmentMode = isDevelopmentModeOpt !== undefined ? isDevelopmentModeOpt : false;
|
|
60
|
+
var shouldUseTui = shouldUseTuiOpt !== undefined ? shouldUseTuiOpt : false;
|
|
61
|
+
return {
|
|
62
|
+
indexer: indexer,
|
|
63
|
+
chainManager: chainManager,
|
|
64
|
+
processedBatches: 0,
|
|
65
|
+
currentlyProcessingBatch: false,
|
|
66
|
+
rollbackState: "NoRollback",
|
|
67
|
+
indexerStartTime: new Date(),
|
|
68
|
+
writeThrottlers: make(),
|
|
69
|
+
loadManager: LoadManager.make(),
|
|
70
|
+
keepProcessAlive: isDevelopmentMode || shouldUseTui,
|
|
71
|
+
id: 0
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
function getId(self) {
|
|
76
|
+
return self.id;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
function incrementId(self) {
|
|
80
|
+
return {
|
|
81
|
+
indexer: self.indexer,
|
|
82
|
+
chainManager: self.chainManager,
|
|
83
|
+
processedBatches: self.processedBatches,
|
|
84
|
+
currentlyProcessingBatch: self.currentlyProcessingBatch,
|
|
85
|
+
rollbackState: self.rollbackState,
|
|
86
|
+
indexerStartTime: self.indexerStartTime,
|
|
87
|
+
writeThrottlers: self.writeThrottlers,
|
|
88
|
+
loadManager: self.loadManager,
|
|
89
|
+
keepProcessAlive: self.keepProcessAlive,
|
|
90
|
+
id: self.id + 1 | 0
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
function setChainManager(self, chainManager) {
|
|
95
|
+
return {
|
|
96
|
+
indexer: self.indexer,
|
|
97
|
+
chainManager: chainManager,
|
|
98
|
+
processedBatches: self.processedBatches,
|
|
99
|
+
currentlyProcessingBatch: self.currentlyProcessingBatch,
|
|
100
|
+
rollbackState: self.rollbackState,
|
|
101
|
+
indexerStartTime: self.indexerStartTime,
|
|
102
|
+
writeThrottlers: self.writeThrottlers,
|
|
103
|
+
loadManager: self.loadManager,
|
|
104
|
+
keepProcessAlive: self.keepProcessAlive,
|
|
105
|
+
id: self.id
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
function isPreparingRollback(state) {
|
|
110
|
+
var match = state.rollbackState;
|
|
111
|
+
if (typeof match !== "object") {
|
|
112
|
+
if (match === "NoRollback") {
|
|
113
|
+
return false;
|
|
114
|
+
} else {
|
|
115
|
+
return true;
|
|
116
|
+
}
|
|
117
|
+
} else if (match.TAG === "RollbackReady") {
|
|
118
|
+
return false;
|
|
119
|
+
} else {
|
|
120
|
+
return true;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
function updateChainMetadataTable(cm, persistence, throttler) {
|
|
125
|
+
var chainsData = {};
|
|
126
|
+
Belt_Array.forEach(ChainMap.values(cm.chainFetchers), (function (cf) {
|
|
127
|
+
chainsData[String(cf.chainConfig.id)] = {
|
|
128
|
+
first_event_block: Js_null.fromOption(cf.firstEventBlockNumber),
|
|
129
|
+
buffer_block: FetchState.bufferBlockNumber(cf.fetchState),
|
|
130
|
+
source_block: cf.fetchState.knownHeight,
|
|
131
|
+
ready_at: Js_null.fromOption(cf.timestampCaughtUpToHeadOrEndblock),
|
|
132
|
+
_is_hyper_sync: SourceManager.getActiveSource(cf.sourceManager).poweredByHyperSync,
|
|
133
|
+
_num_batches_fetched: cf.numBatchesFetched
|
|
134
|
+
};
|
|
135
|
+
}));
|
|
136
|
+
Throttler.schedule(throttler, (function () {
|
|
137
|
+
return persistence.storage.setChainMeta(chainsData);
|
|
138
|
+
}));
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
function updateProgressedChains(chainManager, batch, indexer) {
|
|
142
|
+
Prometheus.ProgressBatchCount.increment();
|
|
143
|
+
var nextQueueItemIsNone = ChainManager.nextItemIsNone(chainManager);
|
|
144
|
+
var allChainsAtHead = ChainManager.isProgressAtHead(chainManager);
|
|
145
|
+
var chainFetchers = ChainMap.map(chainManager.chainFetchers, (function (cf) {
|
|
146
|
+
var chain = ChainMap.Chain.makeUnsafe(cf.chainConfig.id);
|
|
147
|
+
var maybeChainAfterBatch = batch.progressedChainsById[chain];
|
|
148
|
+
var cf$1;
|
|
149
|
+
if (maybeChainAfterBatch !== undefined) {
|
|
150
|
+
if (cf.committedProgressBlockNumber !== maybeChainAfterBatch.progressBlockNumber) {
|
|
151
|
+
Prometheus.ProgressBlockNumber.set(maybeChainAfterBatch.progressBlockNumber, chain);
|
|
152
|
+
}
|
|
153
|
+
if (cf.numEventsProcessed !== maybeChainAfterBatch.totalEventsProcessed) {
|
|
154
|
+
Prometheus.ProgressEventsCount.set(maybeChainAfterBatch.totalEventsProcessed, chain);
|
|
155
|
+
}
|
|
156
|
+
var eventItem = Batch.findLastEventItem(batch, chain);
|
|
157
|
+
if (eventItem !== undefined) {
|
|
158
|
+
var blockTimestamp = indexer.config.ecosystem.getTimestamp(eventItem.event.block);
|
|
159
|
+
var currentTimeMs = Date.now() | 0;
|
|
160
|
+
var blockTimestampMs = Math.imul(blockTimestamp, 1000);
|
|
161
|
+
var latencyMs = currentTimeMs - blockTimestampMs | 0;
|
|
162
|
+
Prometheus.ProgressLatency.set(latencyMs, chain);
|
|
163
|
+
}
|
|
164
|
+
var match = cf.firstEventBlockNumber;
|
|
165
|
+
var safeCheckpointTracking = cf.safeCheckpointTracking;
|
|
166
|
+
cf$1 = {
|
|
167
|
+
logger: cf.logger,
|
|
168
|
+
fetchState: cf.fetchState,
|
|
169
|
+
sourceManager: cf.sourceManager,
|
|
170
|
+
chainConfig: cf.chainConfig,
|
|
171
|
+
isProgressAtHead: cf.isProgressAtHead || maybeChainAfterBatch.isProgressAtHeadWhenBatchCreated,
|
|
172
|
+
timestampCaughtUpToHeadOrEndblock: cf.timestampCaughtUpToHeadOrEndblock,
|
|
173
|
+
committedProgressBlockNumber: maybeChainAfterBatch.progressBlockNumber,
|
|
174
|
+
firstEventBlockNumber: match !== undefined ? cf.firstEventBlockNumber : Batch.findFirstEventBlockNumber(batch, chain),
|
|
175
|
+
numEventsProcessed: maybeChainAfterBatch.totalEventsProcessed,
|
|
176
|
+
numBatchesFetched: cf.numBatchesFetched,
|
|
177
|
+
reorgDetection: cf.reorgDetection,
|
|
178
|
+
safeCheckpointTracking: safeCheckpointTracking !== undefined ? SafeCheckpointTracking.updateOnNewBatch(safeCheckpointTracking, cf.fetchState.knownHeight, chain, batch.checkpointIds, batch.checkpointBlockNumbers, batch.checkpointChainIds) : undefined
|
|
179
|
+
};
|
|
180
|
+
} else {
|
|
181
|
+
cf$1 = cf;
|
|
182
|
+
}
|
|
183
|
+
if (ChainFetcher.hasProcessedToEndblock(cf$1)) {
|
|
184
|
+
var timestampCaughtUpToHeadOrEndblock = Belt_Option.isSome(cf$1.timestampCaughtUpToHeadOrEndblock) ? cf$1.timestampCaughtUpToHeadOrEndblock : Caml_option.some(new Date());
|
|
185
|
+
return {
|
|
186
|
+
logger: cf$1.logger,
|
|
187
|
+
fetchState: cf$1.fetchState,
|
|
188
|
+
sourceManager: cf$1.sourceManager,
|
|
189
|
+
chainConfig: cf$1.chainConfig,
|
|
190
|
+
isProgressAtHead: cf$1.isProgressAtHead,
|
|
191
|
+
timestampCaughtUpToHeadOrEndblock: timestampCaughtUpToHeadOrEndblock,
|
|
192
|
+
committedProgressBlockNumber: cf$1.committedProgressBlockNumber,
|
|
193
|
+
firstEventBlockNumber: cf$1.firstEventBlockNumber,
|
|
194
|
+
numEventsProcessed: cf$1.numEventsProcessed,
|
|
195
|
+
numBatchesFetched: cf$1.numBatchesFetched,
|
|
196
|
+
reorgDetection: cf$1.reorgDetection,
|
|
197
|
+
safeCheckpointTracking: cf$1.safeCheckpointTracking
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
if (!(Belt_Option.isNone(cf$1.timestampCaughtUpToHeadOrEndblock) && cf$1.isProgressAtHead)) {
|
|
201
|
+
return cf$1;
|
|
202
|
+
}
|
|
203
|
+
if (nextQueueItemIsNone && allChainsAtHead) {
|
|
204
|
+
return {
|
|
205
|
+
logger: cf$1.logger,
|
|
206
|
+
fetchState: cf$1.fetchState,
|
|
207
|
+
sourceManager: cf$1.sourceManager,
|
|
208
|
+
chainConfig: cf$1.chainConfig,
|
|
209
|
+
isProgressAtHead: cf$1.isProgressAtHead,
|
|
210
|
+
timestampCaughtUpToHeadOrEndblock: Caml_option.some(new Date()),
|
|
211
|
+
committedProgressBlockNumber: cf$1.committedProgressBlockNumber,
|
|
212
|
+
firstEventBlockNumber: cf$1.firstEventBlockNumber,
|
|
213
|
+
numEventsProcessed: cf$1.numEventsProcessed,
|
|
214
|
+
numBatchesFetched: cf$1.numBatchesFetched,
|
|
215
|
+
reorgDetection: cf$1.reorgDetection,
|
|
216
|
+
safeCheckpointTracking: cf$1.safeCheckpointTracking
|
|
217
|
+
};
|
|
218
|
+
}
|
|
219
|
+
var hasNoMoreEventsToProcess = ChainFetcher.hasNoMoreEventsToProcess(cf$1);
|
|
220
|
+
if (hasNoMoreEventsToProcess) {
|
|
221
|
+
return {
|
|
222
|
+
logger: cf$1.logger,
|
|
223
|
+
fetchState: cf$1.fetchState,
|
|
224
|
+
sourceManager: cf$1.sourceManager,
|
|
225
|
+
chainConfig: cf$1.chainConfig,
|
|
226
|
+
isProgressAtHead: cf$1.isProgressAtHead,
|
|
227
|
+
timestampCaughtUpToHeadOrEndblock: Caml_option.some(new Date()),
|
|
228
|
+
committedProgressBlockNumber: cf$1.committedProgressBlockNumber,
|
|
229
|
+
firstEventBlockNumber: cf$1.firstEventBlockNumber,
|
|
230
|
+
numEventsProcessed: cf$1.numEventsProcessed,
|
|
231
|
+
numBatchesFetched: cf$1.numBatchesFetched,
|
|
232
|
+
reorgDetection: cf$1.reorgDetection,
|
|
233
|
+
safeCheckpointTracking: cf$1.safeCheckpointTracking
|
|
234
|
+
};
|
|
235
|
+
} else {
|
|
236
|
+
return cf$1;
|
|
237
|
+
}
|
|
238
|
+
}));
|
|
239
|
+
var allChainsSyncedAtHead = Belt_Array.every(ChainMap.values(chainFetchers), (function (cf) {
|
|
240
|
+
return Belt_Option.isSome(cf.timestampCaughtUpToHeadOrEndblock);
|
|
241
|
+
}));
|
|
242
|
+
if (allChainsSyncedAtHead) {
|
|
243
|
+
Prometheus.setAllChainsSyncedToHead();
|
|
244
|
+
}
|
|
245
|
+
var checkpointId = Utils.$$Array.last(batch.checkpointIds);
|
|
246
|
+
return {
|
|
247
|
+
committedCheckpointId: checkpointId !== undefined ? checkpointId : chainManager.committedCheckpointId,
|
|
248
|
+
chainFetchers: chainFetchers,
|
|
249
|
+
multichain: chainManager.multichain,
|
|
250
|
+
isInReorgThreshold: chainManager.isInReorgThreshold
|
|
251
|
+
};
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
function validatePartitionQueryResponse(state, partitionQueryResponse) {
|
|
255
|
+
var query = partitionQueryResponse.query;
|
|
256
|
+
var response = partitionQueryResponse.response;
|
|
257
|
+
var chain = partitionQueryResponse.chain;
|
|
258
|
+
var chainFetcher = ChainMap.get(state.chainManager.chainFetchers, chain);
|
|
259
|
+
var stats = response.stats;
|
|
260
|
+
var knownHeight = response.knownHeight;
|
|
261
|
+
if (knownHeight > chainFetcher.fetchState.knownHeight) {
|
|
262
|
+
Prometheus.SourceHeight.set(SourceManager.getActiveSource(chainFetcher.sourceManager).name, chainFetcher.chainConfig.id, knownHeight);
|
|
263
|
+
}
|
|
264
|
+
if (Env.Benchmark.shouldSaveData) {
|
|
265
|
+
var tmp;
|
|
266
|
+
var tmp$1 = query.target;
|
|
267
|
+
tmp = typeof tmp$1 !== "object" ? (
|
|
268
|
+
query.selection.dependsOnAddresses ? "Normal Query" : "Wildcard Query"
|
|
269
|
+
) : (
|
|
270
|
+
tmp$1.TAG === "EndBlock" ? (
|
|
271
|
+
query.selection.dependsOnAddresses ? "Normal Query" : "Wildcard Query"
|
|
272
|
+
) : "Merge Query"
|
|
273
|
+
);
|
|
274
|
+
Benchmark.addBlockRangeFetched(stats["total time elapsed (ms)"], Belt_Option.getWithDefault(stats["parsing time (ms)"], 0), Belt_Option.getWithDefault(stats["page fetch time (ms)"], 0), chain, response.fromBlockQueried, response.latestFetchedBlockNumber, response.parsedQueueItems.length, FetchState.addressesByContractNameCount(query.addressesByContractName), tmp);
|
|
275
|
+
}
|
|
276
|
+
var match = ReorgDetection.registerReorgGuard(chainFetcher.reorgDetection, response.reorgGuard, knownHeight);
|
|
277
|
+
var reorgResult = match[1];
|
|
278
|
+
var updatedChainFetcher_logger = chainFetcher.logger;
|
|
279
|
+
var updatedChainFetcher_fetchState = chainFetcher.fetchState;
|
|
280
|
+
var updatedChainFetcher_sourceManager = chainFetcher.sourceManager;
|
|
281
|
+
var updatedChainFetcher_chainConfig = chainFetcher.chainConfig;
|
|
282
|
+
var updatedChainFetcher_isProgressAtHead = chainFetcher.isProgressAtHead;
|
|
283
|
+
var updatedChainFetcher_timestampCaughtUpToHeadOrEndblock = chainFetcher.timestampCaughtUpToHeadOrEndblock;
|
|
284
|
+
var updatedChainFetcher_committedProgressBlockNumber = chainFetcher.committedProgressBlockNumber;
|
|
285
|
+
var updatedChainFetcher_firstEventBlockNumber = chainFetcher.firstEventBlockNumber;
|
|
286
|
+
var updatedChainFetcher_numEventsProcessed = chainFetcher.numEventsProcessed;
|
|
287
|
+
var updatedChainFetcher_numBatchesFetched = chainFetcher.numBatchesFetched;
|
|
288
|
+
var updatedChainFetcher_reorgDetection = match[0];
|
|
289
|
+
var updatedChainFetcher_safeCheckpointTracking = chainFetcher.safeCheckpointTracking;
|
|
290
|
+
var updatedChainFetcher = {
|
|
291
|
+
logger: updatedChainFetcher_logger,
|
|
292
|
+
fetchState: updatedChainFetcher_fetchState,
|
|
293
|
+
sourceManager: updatedChainFetcher_sourceManager,
|
|
294
|
+
chainConfig: updatedChainFetcher_chainConfig,
|
|
295
|
+
isProgressAtHead: updatedChainFetcher_isProgressAtHead,
|
|
296
|
+
timestampCaughtUpToHeadOrEndblock: updatedChainFetcher_timestampCaughtUpToHeadOrEndblock,
|
|
297
|
+
committedProgressBlockNumber: updatedChainFetcher_committedProgressBlockNumber,
|
|
298
|
+
firstEventBlockNumber: updatedChainFetcher_firstEventBlockNumber,
|
|
299
|
+
numEventsProcessed: updatedChainFetcher_numEventsProcessed,
|
|
300
|
+
numBatchesFetched: updatedChainFetcher_numBatchesFetched,
|
|
301
|
+
reorgDetection: updatedChainFetcher_reorgDetection,
|
|
302
|
+
safeCheckpointTracking: updatedChainFetcher_safeCheckpointTracking
|
|
303
|
+
};
|
|
304
|
+
var init = state.chainManager;
|
|
305
|
+
var nextState_indexer = state.indexer;
|
|
306
|
+
var nextState_chainManager = {
|
|
307
|
+
committedCheckpointId: init.committedCheckpointId,
|
|
308
|
+
chainFetchers: ChainMap.set(state.chainManager.chainFetchers, chain, updatedChainFetcher),
|
|
309
|
+
multichain: init.multichain,
|
|
310
|
+
isInReorgThreshold: init.isInReorgThreshold
|
|
311
|
+
};
|
|
312
|
+
var nextState_processedBatches = state.processedBatches;
|
|
313
|
+
var nextState_currentlyProcessingBatch = state.currentlyProcessingBatch;
|
|
314
|
+
var nextState_rollbackState = state.rollbackState;
|
|
315
|
+
var nextState_indexerStartTime = state.indexerStartTime;
|
|
316
|
+
var nextState_writeThrottlers = state.writeThrottlers;
|
|
317
|
+
var nextState_loadManager = state.loadManager;
|
|
318
|
+
var nextState_keepProcessAlive = state.keepProcessAlive;
|
|
319
|
+
var nextState_id = state.id;
|
|
320
|
+
var nextState = {
|
|
321
|
+
indexer: nextState_indexer,
|
|
322
|
+
chainManager: nextState_chainManager,
|
|
323
|
+
processedBatches: nextState_processedBatches,
|
|
324
|
+
currentlyProcessingBatch: nextState_currentlyProcessingBatch,
|
|
325
|
+
rollbackState: nextState_rollbackState,
|
|
326
|
+
indexerStartTime: nextState_indexerStartTime,
|
|
327
|
+
writeThrottlers: nextState_writeThrottlers,
|
|
328
|
+
loadManager: nextState_loadManager,
|
|
329
|
+
keepProcessAlive: nextState_keepProcessAlive,
|
|
330
|
+
id: nextState_id
|
|
331
|
+
};
|
|
332
|
+
var rollbackWithReorgDetectedBlockNumber;
|
|
333
|
+
if (typeof reorgResult !== "object") {
|
|
334
|
+
rollbackWithReorgDetectedBlockNumber = undefined;
|
|
335
|
+
} else {
|
|
336
|
+
var reorgDetected = reorgResult._0;
|
|
337
|
+
Logging.childInfo(chainFetcher.logger, ReorgDetection.reorgDetectedToLogParams(reorgDetected, state.indexer.config.shouldRollbackOnReorg));
|
|
338
|
+
Prometheus.ReorgCount.increment(chain);
|
|
339
|
+
Prometheus.ReorgDetectionBlockNumber.set(reorgDetected.scannedBlock.blockNumber, chain);
|
|
340
|
+
rollbackWithReorgDetectedBlockNumber = state.indexer.config.shouldRollbackOnReorg ? reorgDetected.scannedBlock.blockNumber : undefined;
|
|
341
|
+
}
|
|
342
|
+
if (rollbackWithReorgDetectedBlockNumber === undefined) {
|
|
343
|
+
return [
|
|
344
|
+
nextState,
|
|
345
|
+
[{
|
|
346
|
+
TAG: "ProcessPartitionQueryResponse",
|
|
347
|
+
_0: partitionQueryResponse
|
|
348
|
+
}]
|
|
349
|
+
];
|
|
350
|
+
}
|
|
351
|
+
var match$1 = state.rollbackState;
|
|
352
|
+
var chainManager;
|
|
353
|
+
if (typeof match$1 !== "object" || match$1.TAG !== "RollbackReady") {
|
|
354
|
+
chainManager = state.chainManager;
|
|
355
|
+
} else {
|
|
356
|
+
var eventsProcessedDiffByChain = match$1.eventsProcessedDiffByChain;
|
|
357
|
+
var init$1 = state.chainManager;
|
|
358
|
+
chainManager = {
|
|
359
|
+
committedCheckpointId: init$1.committedCheckpointId,
|
|
360
|
+
chainFetchers: ChainMap.update(state.chainManager.chainFetchers, chain, (function (chainFetcher) {
|
|
361
|
+
var eventsProcessedDiff = eventsProcessedDiffByChain[chain];
|
|
362
|
+
if (eventsProcessedDiff !== undefined) {
|
|
363
|
+
return {
|
|
364
|
+
logger: chainFetcher.logger,
|
|
365
|
+
fetchState: chainFetcher.fetchState,
|
|
366
|
+
sourceManager: chainFetcher.sourceManager,
|
|
367
|
+
chainConfig: chainFetcher.chainConfig,
|
|
368
|
+
isProgressAtHead: chainFetcher.isProgressAtHead,
|
|
369
|
+
timestampCaughtUpToHeadOrEndblock: chainFetcher.timestampCaughtUpToHeadOrEndblock,
|
|
370
|
+
committedProgressBlockNumber: chainFetcher.committedProgressBlockNumber,
|
|
371
|
+
firstEventBlockNumber: chainFetcher.firstEventBlockNumber,
|
|
372
|
+
numEventsProcessed: chainFetcher.numEventsProcessed + eventsProcessedDiff | 0,
|
|
373
|
+
numBatchesFetched: chainFetcher.numBatchesFetched,
|
|
374
|
+
reorgDetection: chainFetcher.reorgDetection,
|
|
375
|
+
safeCheckpointTracking: chainFetcher.safeCheckpointTracking
|
|
376
|
+
};
|
|
377
|
+
} else {
|
|
378
|
+
return chainFetcher;
|
|
379
|
+
}
|
|
380
|
+
})),
|
|
381
|
+
multichain: init$1.multichain,
|
|
382
|
+
isInReorgThreshold: init$1.isInReorgThreshold
|
|
383
|
+
};
|
|
384
|
+
}
|
|
385
|
+
var init$2 = incrementId(nextState);
|
|
386
|
+
return [
|
|
387
|
+
{
|
|
388
|
+
indexer: init$2.indexer,
|
|
389
|
+
chainManager: chainManager,
|
|
390
|
+
processedBatches: init$2.processedBatches,
|
|
391
|
+
currentlyProcessingBatch: init$2.currentlyProcessingBatch,
|
|
392
|
+
rollbackState: {
|
|
393
|
+
TAG: "ReorgDetected",
|
|
394
|
+
chain: chain,
|
|
395
|
+
blockNumber: rollbackWithReorgDetectedBlockNumber
|
|
396
|
+
},
|
|
397
|
+
indexerStartTime: init$2.indexerStartTime,
|
|
398
|
+
writeThrottlers: init$2.writeThrottlers,
|
|
399
|
+
loadManager: init$2.loadManager,
|
|
400
|
+
keepProcessAlive: init$2.keepProcessAlive,
|
|
401
|
+
id: init$2.id
|
|
402
|
+
},
|
|
403
|
+
["Rollback"]
|
|
404
|
+
];
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
function submitPartitionQueryResponse(state, newItems, newItemsWithDcs, knownHeight, latestFetchedBlock, query, chain) {
|
|
408
|
+
var chainFetcher = ChainMap.get(state.chainManager.chainFetchers, chain);
|
|
409
|
+
var updatedChainFetcher = Utils.unwrapResultExn(ChainFetcher.handleQueryResult(chainFetcher, query, newItems, newItemsWithDcs, latestFetchedBlock, knownHeight));
|
|
410
|
+
var updatedChainFetcher_logger = updatedChainFetcher.logger;
|
|
411
|
+
var updatedChainFetcher_fetchState = updatedChainFetcher.fetchState;
|
|
412
|
+
var updatedChainFetcher_sourceManager = updatedChainFetcher.sourceManager;
|
|
413
|
+
var updatedChainFetcher_chainConfig = updatedChainFetcher.chainConfig;
|
|
414
|
+
var updatedChainFetcher_isProgressAtHead = updatedChainFetcher.isProgressAtHead;
|
|
415
|
+
var updatedChainFetcher_timestampCaughtUpToHeadOrEndblock = updatedChainFetcher.timestampCaughtUpToHeadOrEndblock;
|
|
416
|
+
var updatedChainFetcher_committedProgressBlockNumber = updatedChainFetcher.committedProgressBlockNumber;
|
|
417
|
+
var updatedChainFetcher_firstEventBlockNumber = updatedChainFetcher.firstEventBlockNumber;
|
|
418
|
+
var updatedChainFetcher_numEventsProcessed = updatedChainFetcher.numEventsProcessed;
|
|
419
|
+
var updatedChainFetcher_numBatchesFetched = updatedChainFetcher.numBatchesFetched + 1 | 0;
|
|
420
|
+
var updatedChainFetcher_reorgDetection = updatedChainFetcher.reorgDetection;
|
|
421
|
+
var updatedChainFetcher_safeCheckpointTracking = updatedChainFetcher.safeCheckpointTracking;
|
|
422
|
+
var updatedChainFetcher$1 = {
|
|
423
|
+
logger: updatedChainFetcher_logger,
|
|
424
|
+
fetchState: updatedChainFetcher_fetchState,
|
|
425
|
+
sourceManager: updatedChainFetcher_sourceManager,
|
|
426
|
+
chainConfig: updatedChainFetcher_chainConfig,
|
|
427
|
+
isProgressAtHead: updatedChainFetcher_isProgressAtHead,
|
|
428
|
+
timestampCaughtUpToHeadOrEndblock: updatedChainFetcher_timestampCaughtUpToHeadOrEndblock,
|
|
429
|
+
committedProgressBlockNumber: updatedChainFetcher_committedProgressBlockNumber,
|
|
430
|
+
firstEventBlockNumber: updatedChainFetcher_firstEventBlockNumber,
|
|
431
|
+
numEventsProcessed: updatedChainFetcher_numEventsProcessed,
|
|
432
|
+
numBatchesFetched: updatedChainFetcher_numBatchesFetched,
|
|
433
|
+
reorgDetection: updatedChainFetcher_reorgDetection,
|
|
434
|
+
safeCheckpointTracking: updatedChainFetcher_safeCheckpointTracking
|
|
435
|
+
};
|
|
436
|
+
if (!chainFetcher.isProgressAtHead && updatedChainFetcher_isProgressAtHead) {
|
|
437
|
+
Logging.childInfo(updatedChainFetcher_logger, "All events have been fetched");
|
|
438
|
+
}
|
|
439
|
+
var init = state.chainManager;
|
|
440
|
+
var nextState_indexer = state.indexer;
|
|
441
|
+
var nextState_chainManager = {
|
|
442
|
+
committedCheckpointId: init.committedCheckpointId,
|
|
443
|
+
chainFetchers: ChainMap.set(state.chainManager.chainFetchers, chain, updatedChainFetcher$1),
|
|
444
|
+
multichain: init.multichain,
|
|
445
|
+
isInReorgThreshold: init.isInReorgThreshold
|
|
446
|
+
};
|
|
447
|
+
var nextState_processedBatches = state.processedBatches;
|
|
448
|
+
var nextState_currentlyProcessingBatch = state.currentlyProcessingBatch;
|
|
449
|
+
var nextState_rollbackState = state.rollbackState;
|
|
450
|
+
var nextState_indexerStartTime = state.indexerStartTime;
|
|
451
|
+
var nextState_writeThrottlers = state.writeThrottlers;
|
|
452
|
+
var nextState_loadManager = state.loadManager;
|
|
453
|
+
var nextState_keepProcessAlive = state.keepProcessAlive;
|
|
454
|
+
var nextState_id = state.id;
|
|
455
|
+
var nextState = {
|
|
456
|
+
indexer: nextState_indexer,
|
|
457
|
+
chainManager: nextState_chainManager,
|
|
458
|
+
processedBatches: nextState_processedBatches,
|
|
459
|
+
currentlyProcessingBatch: nextState_currentlyProcessingBatch,
|
|
460
|
+
rollbackState: nextState_rollbackState,
|
|
461
|
+
indexerStartTime: nextState_indexerStartTime,
|
|
462
|
+
writeThrottlers: nextState_writeThrottlers,
|
|
463
|
+
loadManager: nextState_loadManager,
|
|
464
|
+
keepProcessAlive: nextState_keepProcessAlive,
|
|
465
|
+
id: nextState_id
|
|
466
|
+
};
|
|
467
|
+
return [
|
|
468
|
+
nextState,
|
|
469
|
+
[
|
|
470
|
+
{
|
|
471
|
+
TAG: "UpdateChainMetaDataAndCheckForExit",
|
|
472
|
+
_0: "NoExit"
|
|
473
|
+
},
|
|
474
|
+
"ProcessEventBatch",
|
|
475
|
+
{
|
|
476
|
+
TAG: "NextQuery",
|
|
477
|
+
_0: {
|
|
478
|
+
TAG: "Chain",
|
|
479
|
+
_0: chain
|
|
480
|
+
}
|
|
481
|
+
}
|
|
482
|
+
]
|
|
483
|
+
];
|
|
484
|
+
}
|
|
485
|
+
|
|
486
|
+
async function processPartitionQueryResponse(state, param, dispatchAction) {
|
|
487
|
+
var response = param.response;
|
|
488
|
+
var chain = param.chain;
|
|
489
|
+
var parsedQueueItems = response.parsedQueueItems;
|
|
490
|
+
var itemsWithContractRegister = [];
|
|
491
|
+
var newItems = [];
|
|
492
|
+
for(var idx = 0 ,idx_finish = parsedQueueItems.length; idx < idx_finish; ++idx){
|
|
493
|
+
var item = parsedQueueItems[idx];
|
|
494
|
+
if (item.eventConfig.contractRegister !== undefined) {
|
|
495
|
+
itemsWithContractRegister.push(item);
|
|
496
|
+
}
|
|
497
|
+
newItems.push(item);
|
|
498
|
+
}
|
|
499
|
+
var newItemsWithDcs = itemsWithContractRegister.length !== 0 ? await ChainFetcher.runContractRegistersOrThrow(itemsWithContractRegister, chain, state.indexer.config) : itemsWithContractRegister;
|
|
500
|
+
return dispatchAction({
|
|
501
|
+
TAG: "SubmitPartitionQueryResponse",
|
|
502
|
+
newItems: newItems,
|
|
503
|
+
newItemsWithDcs: newItemsWithDcs,
|
|
504
|
+
knownHeight: response.knownHeight,
|
|
505
|
+
latestFetchedBlock: {
|
|
506
|
+
blockNumber: response.latestFetchedBlockNumber,
|
|
507
|
+
blockTimestamp: response.latestFetchedBlockTimestamp
|
|
508
|
+
},
|
|
509
|
+
query: param.query,
|
|
510
|
+
chain: chain
|
|
511
|
+
});
|
|
512
|
+
}
|
|
513
|
+
|
|
514
|
+
function updateChainFetcher(chainFetcherUpdate, state, chain) {
|
|
515
|
+
var init = state.chainManager;
|
|
516
|
+
return [
|
|
517
|
+
{
|
|
518
|
+
indexer: state.indexer,
|
|
519
|
+
chainManager: {
|
|
520
|
+
committedCheckpointId: init.committedCheckpointId,
|
|
521
|
+
chainFetchers: ChainMap.update(state.chainManager.chainFetchers, chain, chainFetcherUpdate),
|
|
522
|
+
multichain: init.multichain,
|
|
523
|
+
isInReorgThreshold: init.isInReorgThreshold
|
|
524
|
+
},
|
|
525
|
+
processedBatches: state.processedBatches,
|
|
526
|
+
currentlyProcessingBatch: state.currentlyProcessingBatch,
|
|
527
|
+
rollbackState: state.rollbackState,
|
|
528
|
+
indexerStartTime: state.indexerStartTime,
|
|
529
|
+
writeThrottlers: state.writeThrottlers,
|
|
530
|
+
loadManager: state.loadManager,
|
|
531
|
+
keepProcessAlive: state.keepProcessAlive,
|
|
532
|
+
id: state.id
|
|
533
|
+
},
|
|
534
|
+
[]
|
|
535
|
+
];
|
|
536
|
+
}
|
|
537
|
+
|
|
538
|
+
function onEnterReorgThreshold(state) {
|
|
539
|
+
Logging.info("Reorg threshold reached");
|
|
540
|
+
Prometheus.ReorgThreshold.set(true);
|
|
541
|
+
var chainFetchers = ChainMap.map(state.chainManager.chainFetchers, (function (chainFetcher) {
|
|
542
|
+
return {
|
|
543
|
+
logger: chainFetcher.logger,
|
|
544
|
+
fetchState: FetchState.updateInternal(chainFetcher.fetchState, undefined, undefined, undefined, undefined, Belt_Option.getWithDefault(Env.indexingBlockLag, 0), undefined),
|
|
545
|
+
sourceManager: chainFetcher.sourceManager,
|
|
546
|
+
chainConfig: chainFetcher.chainConfig,
|
|
547
|
+
isProgressAtHead: chainFetcher.isProgressAtHead,
|
|
548
|
+
timestampCaughtUpToHeadOrEndblock: chainFetcher.timestampCaughtUpToHeadOrEndblock,
|
|
549
|
+
committedProgressBlockNumber: chainFetcher.committedProgressBlockNumber,
|
|
550
|
+
firstEventBlockNumber: chainFetcher.firstEventBlockNumber,
|
|
551
|
+
numEventsProcessed: chainFetcher.numEventsProcessed,
|
|
552
|
+
numBatchesFetched: chainFetcher.numBatchesFetched,
|
|
553
|
+
reorgDetection: chainFetcher.reorgDetection,
|
|
554
|
+
safeCheckpointTracking: chainFetcher.safeCheckpointTracking
|
|
555
|
+
};
|
|
556
|
+
}));
|
|
557
|
+
var init = state.chainManager;
|
|
558
|
+
return {
|
|
559
|
+
indexer: state.indexer,
|
|
560
|
+
chainManager: {
|
|
561
|
+
committedCheckpointId: init.committedCheckpointId,
|
|
562
|
+
chainFetchers: chainFetchers,
|
|
563
|
+
multichain: init.multichain,
|
|
564
|
+
isInReorgThreshold: true
|
|
565
|
+
},
|
|
566
|
+
processedBatches: state.processedBatches,
|
|
567
|
+
currentlyProcessingBatch: state.currentlyProcessingBatch,
|
|
568
|
+
rollbackState: state.rollbackState,
|
|
569
|
+
indexerStartTime: state.indexerStartTime,
|
|
570
|
+
writeThrottlers: state.writeThrottlers,
|
|
571
|
+
loadManager: state.loadManager,
|
|
572
|
+
keepProcessAlive: state.keepProcessAlive,
|
|
573
|
+
id: state.id
|
|
574
|
+
};
|
|
575
|
+
}
|
|
576
|
+
|
|
577
|
+
function actionReducer(state, action) {
|
|
578
|
+
if (typeof action !== "object") {
|
|
579
|
+
switch (action) {
|
|
580
|
+
case "StartProcessingBatch" :
|
|
581
|
+
return [
|
|
582
|
+
{
|
|
583
|
+
indexer: state.indexer,
|
|
584
|
+
chainManager: state.chainManager,
|
|
585
|
+
processedBatches: state.processedBatches,
|
|
586
|
+
currentlyProcessingBatch: true,
|
|
587
|
+
rollbackState: state.rollbackState,
|
|
588
|
+
indexerStartTime: state.indexerStartTime,
|
|
589
|
+
writeThrottlers: state.writeThrottlers,
|
|
590
|
+
loadManager: state.loadManager,
|
|
591
|
+
keepProcessAlive: state.keepProcessAlive,
|
|
592
|
+
id: state.id
|
|
593
|
+
},
|
|
594
|
+
[]
|
|
595
|
+
];
|
|
596
|
+
case "StartFindingReorgDepth" :
|
|
597
|
+
return [
|
|
598
|
+
{
|
|
599
|
+
indexer: state.indexer,
|
|
600
|
+
chainManager: state.chainManager,
|
|
601
|
+
processedBatches: state.processedBatches,
|
|
602
|
+
currentlyProcessingBatch: state.currentlyProcessingBatch,
|
|
603
|
+
rollbackState: "FindingReorgDepth",
|
|
604
|
+
indexerStartTime: state.indexerStartTime,
|
|
605
|
+
writeThrottlers: state.writeThrottlers,
|
|
606
|
+
loadManager: state.loadManager,
|
|
607
|
+
keepProcessAlive: state.keepProcessAlive,
|
|
608
|
+
id: state.id
|
|
609
|
+
},
|
|
610
|
+
[]
|
|
611
|
+
];
|
|
612
|
+
case "EnterReorgThreshold" :
|
|
613
|
+
return [
|
|
614
|
+
onEnterReorgThreshold(state),
|
|
615
|
+
[{
|
|
616
|
+
TAG: "NextQuery",
|
|
617
|
+
_0: "CheckAllChains"
|
|
618
|
+
}]
|
|
619
|
+
];
|
|
620
|
+
case "SuccessExit" :
|
|
621
|
+
Logging.info("Exiting with success");
|
|
622
|
+
Process.exit(0);
|
|
623
|
+
return [
|
|
624
|
+
state,
|
|
625
|
+
[]
|
|
626
|
+
];
|
|
627
|
+
|
|
628
|
+
}
|
|
629
|
+
} else {
|
|
630
|
+
switch (action.TAG) {
|
|
631
|
+
case "ValidatePartitionQueryResponse" :
|
|
632
|
+
return validatePartitionQueryResponse(state, action._0);
|
|
633
|
+
case "SubmitPartitionQueryResponse" :
|
|
634
|
+
return submitPartitionQueryResponse(state, action.newItems, action.newItemsWithDcs, action.knownHeight, action.latestFetchedBlock, action.query, action.chain);
|
|
635
|
+
case "FinishWaitingForNewBlock" :
|
|
636
|
+
var knownHeight = action.knownHeight;
|
|
637
|
+
var chain = action.chain;
|
|
638
|
+
var updatedChainFetchers = ChainMap.update(state.chainManager.chainFetchers, chain, (function (chainFetcher) {
|
|
639
|
+
var updatedFetchState = FetchState.updateKnownHeight(chainFetcher.fetchState, knownHeight);
|
|
640
|
+
if (updatedFetchState !== chainFetcher.fetchState) {
|
|
641
|
+
return {
|
|
642
|
+
logger: chainFetcher.logger,
|
|
643
|
+
fetchState: updatedFetchState,
|
|
644
|
+
sourceManager: chainFetcher.sourceManager,
|
|
645
|
+
chainConfig: chainFetcher.chainConfig,
|
|
646
|
+
isProgressAtHead: chainFetcher.isProgressAtHead,
|
|
647
|
+
timestampCaughtUpToHeadOrEndblock: chainFetcher.timestampCaughtUpToHeadOrEndblock,
|
|
648
|
+
committedProgressBlockNumber: chainFetcher.committedProgressBlockNumber,
|
|
649
|
+
firstEventBlockNumber: chainFetcher.firstEventBlockNumber,
|
|
650
|
+
numEventsProcessed: chainFetcher.numEventsProcessed,
|
|
651
|
+
numBatchesFetched: chainFetcher.numBatchesFetched,
|
|
652
|
+
reorgDetection: chainFetcher.reorgDetection,
|
|
653
|
+
safeCheckpointTracking: chainFetcher.safeCheckpointTracking
|
|
654
|
+
};
|
|
655
|
+
} else {
|
|
656
|
+
return chainFetcher;
|
|
657
|
+
}
|
|
658
|
+
}));
|
|
659
|
+
var isBelowReorgThreshold = !state.chainManager.isInReorgThreshold && state.indexer.config.shouldRollbackOnReorg;
|
|
660
|
+
var shouldEnterReorgThreshold = isBelowReorgThreshold && Belt_Array.every(ChainMap.values(updatedChainFetchers), (function (chainFetcher) {
|
|
661
|
+
return FetchState.isReadyToEnterReorgThreshold(chainFetcher.fetchState);
|
|
662
|
+
}));
|
|
663
|
+
var init = state.chainManager;
|
|
664
|
+
var state_indexer = state.indexer;
|
|
665
|
+
var state_chainManager = {
|
|
666
|
+
committedCheckpointId: init.committedCheckpointId,
|
|
667
|
+
chainFetchers: updatedChainFetchers,
|
|
668
|
+
multichain: init.multichain,
|
|
669
|
+
isInReorgThreshold: init.isInReorgThreshold
|
|
670
|
+
};
|
|
671
|
+
var state_processedBatches = state.processedBatches;
|
|
672
|
+
var state_currentlyProcessingBatch = state.currentlyProcessingBatch;
|
|
673
|
+
var state_rollbackState = state.rollbackState;
|
|
674
|
+
var state_indexerStartTime = state.indexerStartTime;
|
|
675
|
+
var state_writeThrottlers = state.writeThrottlers;
|
|
676
|
+
var state_loadManager = state.loadManager;
|
|
677
|
+
var state_keepProcessAlive = state.keepProcessAlive;
|
|
678
|
+
var state_id = state.id;
|
|
679
|
+
var state$1 = {
|
|
680
|
+
indexer: state_indexer,
|
|
681
|
+
chainManager: state_chainManager,
|
|
682
|
+
processedBatches: state_processedBatches,
|
|
683
|
+
currentlyProcessingBatch: state_currentlyProcessingBatch,
|
|
684
|
+
rollbackState: state_rollbackState,
|
|
685
|
+
indexerStartTime: state_indexerStartTime,
|
|
686
|
+
writeThrottlers: state_writeThrottlers,
|
|
687
|
+
loadManager: state_loadManager,
|
|
688
|
+
keepProcessAlive: state_keepProcessAlive,
|
|
689
|
+
id: state_id
|
|
690
|
+
};
|
|
691
|
+
if (shouldEnterReorgThreshold) {
|
|
692
|
+
return [
|
|
693
|
+
onEnterReorgThreshold(state$1),
|
|
694
|
+
[
|
|
695
|
+
{
|
|
696
|
+
TAG: "NextQuery",
|
|
697
|
+
_0: "CheckAllChains"
|
|
698
|
+
},
|
|
699
|
+
"ProcessEventBatch"
|
|
700
|
+
]
|
|
701
|
+
];
|
|
702
|
+
} else {
|
|
703
|
+
return [
|
|
704
|
+
state$1,
|
|
705
|
+
[
|
|
706
|
+
{
|
|
707
|
+
TAG: "NextQuery",
|
|
708
|
+
_0: {
|
|
709
|
+
TAG: "Chain",
|
|
710
|
+
_0: chain
|
|
711
|
+
}
|
|
712
|
+
},
|
|
713
|
+
"ProcessEventBatch"
|
|
714
|
+
]
|
|
715
|
+
];
|
|
716
|
+
}
|
|
717
|
+
case "EventBatchProcessed" :
|
|
718
|
+
var maybePruneEntityHistory = Config.shouldPruneHistory(state.indexer.config, state.chainManager.isInReorgThreshold) ? ["PruneStaleEntityHistory"] : [];
|
|
719
|
+
var state_indexer$1 = state.indexer;
|
|
720
|
+
var state_chainManager$1 = updateProgressedChains(state.chainManager, action.batch, state.indexer);
|
|
721
|
+
var state_processedBatches$1 = state.processedBatches + 1 | 0;
|
|
722
|
+
var state_indexerStartTime$1 = state.indexerStartTime;
|
|
723
|
+
var state_writeThrottlers$1 = state.writeThrottlers;
|
|
724
|
+
var state_loadManager$1 = state.loadManager;
|
|
725
|
+
var state_keepProcessAlive$1 = state.keepProcessAlive;
|
|
726
|
+
var state_id$1 = state.id;
|
|
727
|
+
var state$2 = {
|
|
728
|
+
indexer: state_indexer$1,
|
|
729
|
+
chainManager: state_chainManager$1,
|
|
730
|
+
processedBatches: state_processedBatches$1,
|
|
731
|
+
currentlyProcessingBatch: false,
|
|
732
|
+
rollbackState: "NoRollback",
|
|
733
|
+
indexerStartTime: state_indexerStartTime$1,
|
|
734
|
+
writeThrottlers: state_writeThrottlers$1,
|
|
735
|
+
loadManager: state_loadManager$1,
|
|
736
|
+
keepProcessAlive: state_keepProcessAlive$1,
|
|
737
|
+
id: state_id$1
|
|
738
|
+
};
|
|
739
|
+
var shouldExit = EventProcessing.allChainsEventsProcessedToEndblock(state_chainManager$1.chainFetchers) ? (Logging.info("All chains are caught up to end blocks."), state_keepProcessAlive$1 ? "NoExit" : "ExitWithSuccess") : "NoExit";
|
|
740
|
+
return [
|
|
741
|
+
state$2,
|
|
742
|
+
Belt_Array.concat([
|
|
743
|
+
{
|
|
744
|
+
TAG: "UpdateChainMetaDataAndCheckForExit",
|
|
745
|
+
_0: shouldExit
|
|
746
|
+
},
|
|
747
|
+
"ProcessEventBatch"
|
|
748
|
+
], maybePruneEntityHistory)
|
|
749
|
+
];
|
|
750
|
+
case "FindReorgDepth" :
|
|
751
|
+
return [
|
|
752
|
+
{
|
|
753
|
+
indexer: state.indexer,
|
|
754
|
+
chainManager: state.chainManager,
|
|
755
|
+
processedBatches: state.processedBatches,
|
|
756
|
+
currentlyProcessingBatch: state.currentlyProcessingBatch,
|
|
757
|
+
rollbackState: {
|
|
758
|
+
TAG: "FoundReorgDepth",
|
|
759
|
+
chain: action.chain,
|
|
760
|
+
rollbackTargetBlockNumber: action.rollbackTargetBlockNumber
|
|
761
|
+
},
|
|
762
|
+
indexerStartTime: state.indexerStartTime,
|
|
763
|
+
writeThrottlers: state.writeThrottlers,
|
|
764
|
+
loadManager: state.loadManager,
|
|
765
|
+
keepProcessAlive: state.keepProcessAlive,
|
|
766
|
+
id: state.id
|
|
767
|
+
},
|
|
768
|
+
["Rollback"]
|
|
769
|
+
];
|
|
770
|
+
case "UpdateQueues" :
|
|
771
|
+
var shouldEnterReorgThreshold$1 = action.shouldEnterReorgThreshold;
|
|
772
|
+
var progressedChainsById = action.progressedChainsById;
|
|
773
|
+
var chainFetchers = ChainMap.mapWithKey(state.chainManager.chainFetchers, (function (chain, cf) {
|
|
774
|
+
var chainAfterBatch = progressedChainsById[chain];
|
|
775
|
+
var fs = chainAfterBatch !== undefined ? chainAfterBatch.fetchState : cf.fetchState;
|
|
776
|
+
return {
|
|
777
|
+
logger: cf.logger,
|
|
778
|
+
fetchState: shouldEnterReorgThreshold$1 ? FetchState.updateInternal(fs, undefined, undefined, undefined, undefined, Belt_Option.getWithDefault(Env.indexingBlockLag, 0), undefined) : fs,
|
|
779
|
+
sourceManager: cf.sourceManager,
|
|
780
|
+
chainConfig: cf.chainConfig,
|
|
781
|
+
isProgressAtHead: cf.isProgressAtHead,
|
|
782
|
+
timestampCaughtUpToHeadOrEndblock: cf.timestampCaughtUpToHeadOrEndblock,
|
|
783
|
+
committedProgressBlockNumber: cf.committedProgressBlockNumber,
|
|
784
|
+
firstEventBlockNumber: cf.firstEventBlockNumber,
|
|
785
|
+
numEventsProcessed: cf.numEventsProcessed,
|
|
786
|
+
numBatchesFetched: cf.numBatchesFetched,
|
|
787
|
+
reorgDetection: cf.reorgDetection,
|
|
788
|
+
safeCheckpointTracking: cf.safeCheckpointTracking
|
|
789
|
+
};
|
|
790
|
+
}));
|
|
791
|
+
var init$1 = state.chainManager;
|
|
792
|
+
var chainManager_committedCheckpointId = init$1.committedCheckpointId;
|
|
793
|
+
var chainManager_multichain = init$1.multichain;
|
|
794
|
+
var chainManager_isInReorgThreshold = init$1.isInReorgThreshold;
|
|
795
|
+
var chainManager = {
|
|
796
|
+
committedCheckpointId: chainManager_committedCheckpointId,
|
|
797
|
+
chainFetchers: chainFetchers,
|
|
798
|
+
multichain: chainManager_multichain,
|
|
799
|
+
isInReorgThreshold: chainManager_isInReorgThreshold
|
|
800
|
+
};
|
|
801
|
+
return [
|
|
802
|
+
{
|
|
803
|
+
indexer: state.indexer,
|
|
804
|
+
chainManager: chainManager,
|
|
805
|
+
processedBatches: state.processedBatches,
|
|
806
|
+
currentlyProcessingBatch: state.currentlyProcessingBatch,
|
|
807
|
+
rollbackState: state.rollbackState,
|
|
808
|
+
indexerStartTime: state.indexerStartTime,
|
|
809
|
+
writeThrottlers: state.writeThrottlers,
|
|
810
|
+
loadManager: state.loadManager,
|
|
811
|
+
keepProcessAlive: state.keepProcessAlive,
|
|
812
|
+
id: state.id
|
|
813
|
+
},
|
|
814
|
+
[{
|
|
815
|
+
TAG: "NextQuery",
|
|
816
|
+
_0: "CheckAllChains"
|
|
817
|
+
}]
|
|
818
|
+
];
|
|
819
|
+
case "ErrorExit" :
|
|
820
|
+
ErrorHandling.log(action._0);
|
|
821
|
+
Process.exit(1);
|
|
822
|
+
return [
|
|
823
|
+
state,
|
|
824
|
+
[]
|
|
825
|
+
];
|
|
826
|
+
case "SetRollbackState" :
|
|
827
|
+
return [
|
|
828
|
+
{
|
|
829
|
+
indexer: state.indexer,
|
|
830
|
+
chainManager: action.rollbackedChainManager,
|
|
831
|
+
processedBatches: state.processedBatches,
|
|
832
|
+
currentlyProcessingBatch: state.currentlyProcessingBatch,
|
|
833
|
+
rollbackState: {
|
|
834
|
+
TAG: "RollbackReady",
|
|
835
|
+
diffInMemoryStore: action.diffInMemoryStore,
|
|
836
|
+
eventsProcessedDiffByChain: action.eventsProcessedDiffByChain
|
|
837
|
+
},
|
|
838
|
+
indexerStartTime: state.indexerStartTime,
|
|
839
|
+
writeThrottlers: state.writeThrottlers,
|
|
840
|
+
loadManager: state.loadManager,
|
|
841
|
+
keepProcessAlive: state.keepProcessAlive,
|
|
842
|
+
id: state.id
|
|
843
|
+
},
|
|
844
|
+
[
|
|
845
|
+
{
|
|
846
|
+
TAG: "NextQuery",
|
|
847
|
+
_0: "CheckAllChains"
|
|
848
|
+
},
|
|
849
|
+
"ProcessEventBatch"
|
|
850
|
+
]
|
|
851
|
+
];
|
|
852
|
+
|
|
853
|
+
}
|
|
854
|
+
}
|
|
855
|
+
}
|
|
856
|
+
|
|
857
|
+
function invalidatedActionReducer(state, action) {
|
|
858
|
+
if (typeof action === "object") {
|
|
859
|
+
switch (action.TAG) {
|
|
860
|
+
case "EventBatchProcessed" :
|
|
861
|
+
if (isPreparingRollback(state)) {
|
|
862
|
+
Logging.info("Finished processing batch before rollback, actioning rollback");
|
|
863
|
+
return [
|
|
864
|
+
{
|
|
865
|
+
indexer: state.indexer,
|
|
866
|
+
chainManager: updateProgressedChains(state.chainManager, action.batch, state.indexer),
|
|
867
|
+
processedBatches: state.processedBatches + 1 | 0,
|
|
868
|
+
currentlyProcessingBatch: false,
|
|
869
|
+
rollbackState: state.rollbackState,
|
|
870
|
+
indexerStartTime: state.indexerStartTime,
|
|
871
|
+
writeThrottlers: state.writeThrottlers,
|
|
872
|
+
loadManager: state.loadManager,
|
|
873
|
+
keepProcessAlive: state.keepProcessAlive,
|
|
874
|
+
id: state.id
|
|
875
|
+
},
|
|
876
|
+
["Rollback"]
|
|
877
|
+
];
|
|
878
|
+
}
|
|
879
|
+
break;
|
|
880
|
+
case "ErrorExit" :
|
|
881
|
+
return actionReducer(state, action);
|
|
882
|
+
default:
|
|
883
|
+
|
|
884
|
+
}
|
|
885
|
+
}
|
|
886
|
+
Logging.trace({
|
|
887
|
+
msg: "Invalidated action discarded",
|
|
888
|
+
action: S$RescriptSchema.convertOrThrow(action, Utils.Schema.variantTag)
|
|
889
|
+
});
|
|
890
|
+
return [
|
|
891
|
+
state,
|
|
892
|
+
[]
|
|
893
|
+
];
|
|
894
|
+
}
|
|
895
|
+
|
|
896
|
+
function checkAndFetchForChain(waitForNewBlock, executeQuery, state, dispatchAction) {
|
|
897
|
+
return async function (chain) {
|
|
898
|
+
var chainFetcher = ChainMap.get(state.chainManager.chainFetchers, chain);
|
|
899
|
+
if (isPreparingRollback(state)) {
|
|
900
|
+
return ;
|
|
901
|
+
}
|
|
902
|
+
var fetchState = chainFetcher.fetchState;
|
|
903
|
+
return await SourceManager.fetchNext(chainFetcher.sourceManager, fetchState, (async function (query) {
|
|
904
|
+
try {
|
|
905
|
+
var response = await executeQuery(chainFetcher.sourceManager, query, fetchState.knownHeight);
|
|
906
|
+
return dispatchAction({
|
|
907
|
+
TAG: "ValidatePartitionQueryResponse",
|
|
908
|
+
_0: {
|
|
909
|
+
chain: chain,
|
|
910
|
+
response: response,
|
|
911
|
+
query: query
|
|
912
|
+
}
|
|
913
|
+
});
|
|
914
|
+
}
|
|
915
|
+
catch (raw_exn){
|
|
916
|
+
var exn = Caml_js_exceptions.internalToOCamlException(raw_exn);
|
|
917
|
+
return dispatchAction({
|
|
918
|
+
TAG: "ErrorExit",
|
|
919
|
+
_0: ErrorHandling.make(exn, undefined, undefined)
|
|
920
|
+
});
|
|
921
|
+
}
|
|
922
|
+
}), (function (knownHeight) {
|
|
923
|
+
return waitForNewBlock(chainFetcher.sourceManager, knownHeight);
|
|
924
|
+
}), (function (knownHeight) {
|
|
925
|
+
dispatchAction({
|
|
926
|
+
TAG: "FinishWaitingForNewBlock",
|
|
927
|
+
chain: chain,
|
|
928
|
+
knownHeight: knownHeight
|
|
929
|
+
});
|
|
930
|
+
}), state.id);
|
|
931
|
+
};
|
|
932
|
+
}
|
|
933
|
+
|
|
934
|
+
function injectedTaskReducer(waitForNewBlock, executeQuery, getLastKnownValidBlock) {
|
|
935
|
+
return async function (state, task, dispatchAction) {
|
|
936
|
+
if (typeof task !== "object") {
|
|
937
|
+
switch (task) {
|
|
938
|
+
case "ProcessEventBatch" :
|
|
939
|
+
if (!(!state.currentlyProcessingBatch && !isPreparingRollback(state))) {
|
|
940
|
+
return ;
|
|
941
|
+
}
|
|
942
|
+
var match = state.rollbackState;
|
|
943
|
+
var rollbackInMemStore;
|
|
944
|
+
rollbackInMemStore = typeof match !== "object" || match.TAG !== "RollbackReady" ? undefined : match.diffInMemoryStore;
|
|
945
|
+
var batch = ChainManager.createBatch(state.chainManager, state.indexer.config.batchSize, rollbackInMemStore !== undefined);
|
|
946
|
+
var progressedChainsById = batch.progressedChainsById;
|
|
947
|
+
var totalBatchSize = batch.totalBatchSize;
|
|
948
|
+
var isInReorgThreshold = state.chainManager.isInReorgThreshold;
|
|
949
|
+
var shouldSaveHistory = Config.shouldSaveHistory(state.indexer.config, isInReorgThreshold);
|
|
950
|
+
var isBelowReorgThreshold = !state.chainManager.isInReorgThreshold && state.indexer.config.shouldRollbackOnReorg;
|
|
951
|
+
var shouldEnterReorgThreshold = isBelowReorgThreshold && Belt_Array.every(ChainMap.values(state.chainManager.chainFetchers), (function (chainFetcher) {
|
|
952
|
+
var chainAfterBatch = progressedChainsById[chainFetcher.fetchState.chainId];
|
|
953
|
+
var fetchState = chainAfterBatch !== undefined ? chainAfterBatch.fetchState : chainFetcher.fetchState;
|
|
954
|
+
return FetchState.isReadyToEnterReorgThreshold(fetchState);
|
|
955
|
+
}));
|
|
956
|
+
if (shouldEnterReorgThreshold) {
|
|
957
|
+
dispatchAction("EnterReorgThreshold");
|
|
958
|
+
}
|
|
959
|
+
if (Utils.Dict.isEmpty(progressedChainsById)) {
|
|
960
|
+
return ;
|
|
961
|
+
}
|
|
962
|
+
if (Env.Benchmark.shouldSaveData) {
|
|
963
|
+
Benchmark.addSummaryData("Other", "Batch Size", totalBatchSize, undefined);
|
|
964
|
+
}
|
|
965
|
+
dispatchAction("StartProcessingBatch");
|
|
966
|
+
dispatchAction({
|
|
967
|
+
TAG: "UpdateQueues",
|
|
968
|
+
progressedChainsById: progressedChainsById,
|
|
969
|
+
shouldEnterReorgThreshold: shouldEnterReorgThreshold
|
|
970
|
+
});
|
|
971
|
+
var inMemoryStore = Belt_Option.getWithDefault(rollbackInMemStore, InMemoryStore.make(state.indexer.persistence.allEntities, undefined));
|
|
972
|
+
InMemoryStore.setBatchDcs(inMemoryStore, batch, shouldSaveHistory);
|
|
973
|
+
var res;
|
|
974
|
+
try {
|
|
975
|
+
res = await EventProcessing.processEventBatch(batch, inMemoryStore, isInReorgThreshold, state.loadManager, state.indexer, state.chainManager.chainFetchers);
|
|
976
|
+
}
|
|
977
|
+
catch (raw_exn){
|
|
978
|
+
var exn = Caml_js_exceptions.internalToOCamlException(raw_exn);
|
|
979
|
+
var errHandler = ErrorHandling.make(exn, undefined, "A top level unexpected error occurred during processing");
|
|
980
|
+
return dispatchAction({
|
|
981
|
+
TAG: "ErrorExit",
|
|
982
|
+
_0: errHandler
|
|
983
|
+
});
|
|
984
|
+
}
|
|
985
|
+
if (res.TAG === "Ok") {
|
|
986
|
+
return dispatchAction({
|
|
987
|
+
TAG: "EventBatchProcessed",
|
|
988
|
+
batch: batch
|
|
989
|
+
});
|
|
990
|
+
} else {
|
|
991
|
+
return dispatchAction({
|
|
992
|
+
TAG: "ErrorExit",
|
|
993
|
+
_0: res._0
|
|
994
|
+
});
|
|
995
|
+
}
|
|
996
|
+
break;
|
|
997
|
+
case "Rollback" :
|
|
998
|
+
var match$1 = state.rollbackState;
|
|
999
|
+
if (typeof match$1 !== "object") {
|
|
1000
|
+
if (match$1 === "NoRollback") {
|
|
1001
|
+
return Js_exn.raiseError("Internal error: Rollback initiated with invalid state");
|
|
1002
|
+
} else {
|
|
1003
|
+
return ;
|
|
1004
|
+
}
|
|
1005
|
+
}
|
|
1006
|
+
switch (match$1.TAG) {
|
|
1007
|
+
case "ReorgDetected" :
|
|
1008
|
+
var chain = match$1.chain;
|
|
1009
|
+
var chainFetcher = ChainMap.get(state.chainManager.chainFetchers, chain);
|
|
1010
|
+
dispatchAction("StartFindingReorgDepth");
|
|
1011
|
+
var rollbackTargetBlockNumber = await getLastKnownValidBlock(chainFetcher, match$1.blockNumber);
|
|
1012
|
+
return dispatchAction({
|
|
1013
|
+
TAG: "FindReorgDepth",
|
|
1014
|
+
chain: chain,
|
|
1015
|
+
rollbackTargetBlockNumber: rollbackTargetBlockNumber
|
|
1016
|
+
});
|
|
1017
|
+
case "FoundReorgDepth" :
|
|
1018
|
+
if (state.currentlyProcessingBatch) {
|
|
1019
|
+
return Logging.info("Waiting for batch to finish processing before executing rollback");
|
|
1020
|
+
}
|
|
1021
|
+
var match$2 = state.rollbackState;
|
|
1022
|
+
var rollbackTargetBlockNumber$1 = match$2.rollbackTargetBlockNumber;
|
|
1023
|
+
var reorgChain = match$2.chain;
|
|
1024
|
+
var startTime = Hrtime.makeTimer();
|
|
1025
|
+
var chainFetcher$1 = ChainMap.get(state.chainManager.chainFetchers, reorgChain);
|
|
1026
|
+
var logger = Logging.createChildFrom(chainFetcher$1.logger, {
|
|
1027
|
+
action: "Rollback",
|
|
1028
|
+
reorgChain: reorgChain,
|
|
1029
|
+
targetBlockNumber: rollbackTargetBlockNumber$1
|
|
1030
|
+
});
|
|
1031
|
+
Logging.childInfo(logger, "Started rollback on reorg");
|
|
1032
|
+
Prometheus.RollbackTargetBlockNumber.set(rollbackTargetBlockNumber$1, reorgChain);
|
|
1033
|
+
var match$3 = await state.indexer.persistence.storage.getRollbackTargetCheckpoint(reorgChain, rollbackTargetBlockNumber$1);
|
|
1034
|
+
var rollbackTargetCheckpointId = match$3.length !== 1 ? 0 : match$3[0].id;
|
|
1035
|
+
var eventsProcessedDiffByChain = {};
|
|
1036
|
+
var newProgressBlockNumberPerChain = {};
|
|
1037
|
+
var rollbackedProcessedEvents = 0;
|
|
1038
|
+
var rollbackProgressDiff = await state.indexer.persistence.storage.getRollbackProgressDiff(rollbackTargetCheckpointId);
|
|
1039
|
+
for(var idx = 0 ,idx_finish = rollbackProgressDiff.length; idx < idx_finish; ++idx){
|
|
1040
|
+
var diff = rollbackProgressDiff[idx];
|
|
1041
|
+
var eventsProcessedDiff = Belt_Int.fromString(diff.events_processed_diff);
|
|
1042
|
+
var tmp;
|
|
1043
|
+
if (eventsProcessedDiff !== undefined) {
|
|
1044
|
+
rollbackedProcessedEvents = rollbackedProcessedEvents + eventsProcessedDiff | 0;
|
|
1045
|
+
tmp = eventsProcessedDiff;
|
|
1046
|
+
} else {
|
|
1047
|
+
tmp = Js_exn.raiseError("Unexpedted case: Invalid events processed diff " + diff.events_processed_diff);
|
|
1048
|
+
}
|
|
1049
|
+
eventsProcessedDiffByChain[diff.chain_id] = tmp;
|
|
1050
|
+
newProgressBlockNumberPerChain[diff.chain_id] = rollbackTargetCheckpointId === 0 && diff.chain_id === reorgChain && diff.new_progress_block_number >= rollbackTargetBlockNumber$1 ? rollbackTargetBlockNumber$1 : diff.new_progress_block_number;
|
|
1051
|
+
}
|
|
1052
|
+
var chainFetchers = ChainMap.mapWithKey(state.chainManager.chainFetchers, (function (chain, cf) {
|
|
1053
|
+
var newProgressBlockNumber = newProgressBlockNumberPerChain[chain];
|
|
1054
|
+
if (newProgressBlockNumber === undefined) {
|
|
1055
|
+
return cf;
|
|
1056
|
+
}
|
|
1057
|
+
var fetchState = FetchState.rollback(cf.fetchState, newProgressBlockNumber);
|
|
1058
|
+
var newTotalEventsProcessed = cf.numEventsProcessed - eventsProcessedDiffByChain[chain] | 0;
|
|
1059
|
+
if (cf.committedProgressBlockNumber !== newProgressBlockNumber) {
|
|
1060
|
+
Prometheus.ProgressBlockNumber.set(newProgressBlockNumber, chain);
|
|
1061
|
+
}
|
|
1062
|
+
if (cf.numEventsProcessed !== newTotalEventsProcessed) {
|
|
1063
|
+
Prometheus.ProgressEventsCount.set(newTotalEventsProcessed, chain);
|
|
1064
|
+
}
|
|
1065
|
+
var safeCheckpointTracking = cf.safeCheckpointTracking;
|
|
1066
|
+
return {
|
|
1067
|
+
logger: cf.logger,
|
|
1068
|
+
fetchState: fetchState,
|
|
1069
|
+
sourceManager: cf.sourceManager,
|
|
1070
|
+
chainConfig: cf.chainConfig,
|
|
1071
|
+
isProgressAtHead: cf.isProgressAtHead,
|
|
1072
|
+
timestampCaughtUpToHeadOrEndblock: cf.timestampCaughtUpToHeadOrEndblock,
|
|
1073
|
+
committedProgressBlockNumber: newProgressBlockNumber,
|
|
1074
|
+
firstEventBlockNumber: cf.firstEventBlockNumber,
|
|
1075
|
+
numEventsProcessed: newTotalEventsProcessed,
|
|
1076
|
+
numBatchesFetched: cf.numBatchesFetched,
|
|
1077
|
+
reorgDetection: Caml_obj.equal(chain, reorgChain) ? ReorgDetection.rollbackToValidBlockNumber(cf.reorgDetection, rollbackTargetBlockNumber$1) : cf.reorgDetection,
|
|
1078
|
+
safeCheckpointTracking: safeCheckpointTracking !== undefined ? SafeCheckpointTracking.rollback(safeCheckpointTracking, newProgressBlockNumber) : undefined
|
|
1079
|
+
};
|
|
1080
|
+
}));
|
|
1081
|
+
var diff$1 = await Persistence.prepareRollbackDiff(state.indexer.persistence, rollbackTargetCheckpointId, state.chainManager.committedCheckpointId + 1);
|
|
1082
|
+
var init = state.chainManager;
|
|
1083
|
+
var chainManager_committedCheckpointId = init.committedCheckpointId;
|
|
1084
|
+
var chainManager_multichain = init.multichain;
|
|
1085
|
+
var chainManager_isInReorgThreshold = init.isInReorgThreshold;
|
|
1086
|
+
var chainManager = {
|
|
1087
|
+
committedCheckpointId: chainManager_committedCheckpointId,
|
|
1088
|
+
chainFetchers: chainFetchers,
|
|
1089
|
+
multichain: chainManager_multichain,
|
|
1090
|
+
isInReorgThreshold: chainManager_isInReorgThreshold
|
|
1091
|
+
};
|
|
1092
|
+
Logging.childTrace(logger, {
|
|
1093
|
+
msg: "Finished rollback on reorg",
|
|
1094
|
+
entityChanges: {
|
|
1095
|
+
deleted: diff$1.deletedEntities,
|
|
1096
|
+
upserted: diff$1.setEntities
|
|
1097
|
+
},
|
|
1098
|
+
rollbackedEvents: rollbackedProcessedEvents,
|
|
1099
|
+
beforeCheckpointId: state.chainManager.committedCheckpointId,
|
|
1100
|
+
targetCheckpointId: rollbackTargetCheckpointId
|
|
1101
|
+
});
|
|
1102
|
+
Prometheus.RollbackSuccess.increment(Hrtime.toMillis(Hrtime.timeSince(startTime)), rollbackedProcessedEvents);
|
|
1103
|
+
return dispatchAction({
|
|
1104
|
+
TAG: "SetRollbackState",
|
|
1105
|
+
diffInMemoryStore: diff$1.inMemStore,
|
|
1106
|
+
rollbackedChainManager: chainManager,
|
|
1107
|
+
eventsProcessedDiffByChain: eventsProcessedDiffByChain
|
|
1108
|
+
});
|
|
1109
|
+
case "RollbackReady" :
|
|
1110
|
+
return Js_exn.raiseError("Internal error: Rollback initiated with invalid state");
|
|
1111
|
+
|
|
1112
|
+
}
|
|
1113
|
+
case "PruneStaleEntityHistory" :
|
|
1114
|
+
var runPrune = async function () {
|
|
1115
|
+
var safeCheckpointId = ChainManager.getSafeCheckpointId(state.chainManager);
|
|
1116
|
+
if (safeCheckpointId === undefined) {
|
|
1117
|
+
return ;
|
|
1118
|
+
}
|
|
1119
|
+
await state.indexer.persistence.storage.pruneStaleCheckpoints(safeCheckpointId);
|
|
1120
|
+
for(var idx = 0 ,idx_finish = state.indexer.persistence.allEntities.length; idx < idx_finish; ++idx){
|
|
1121
|
+
if (idx !== 0) {
|
|
1122
|
+
await Utils.delay(1000);
|
|
1123
|
+
}
|
|
1124
|
+
var entityConfig = state.indexer.persistence.allEntities[idx];
|
|
1125
|
+
var timeRef = Hrtime.makeTimer();
|
|
1126
|
+
try {
|
|
1127
|
+
await state.indexer.persistence.storage.pruneStaleEntityHistory(entityConfig.name, entityConfig.index, safeCheckpointId);
|
|
1128
|
+
}
|
|
1129
|
+
catch (raw_exn){
|
|
1130
|
+
var exn = Caml_js_exceptions.internalToOCamlException(raw_exn);
|
|
1131
|
+
ErrorHandling.mkLogAndRaise(Logging.createChild({
|
|
1132
|
+
entityName: entityConfig.name,
|
|
1133
|
+
safeCheckpointId: safeCheckpointId
|
|
1134
|
+
}), "Failed to prune stale entity history", exn);
|
|
1135
|
+
}
|
|
1136
|
+
Prometheus.RollbackHistoryPrune.increment(Hrtime.toMillis(Hrtime.timeSince(timeRef)), entityConfig.name);
|
|
1137
|
+
}
|
|
1138
|
+
};
|
|
1139
|
+
return Throttler.schedule(state.writeThrottlers.pruneStaleEntityHistory, runPrune);
|
|
1140
|
+
|
|
1141
|
+
}
|
|
1142
|
+
} else {
|
|
1143
|
+
switch (task.TAG) {
|
|
1144
|
+
case "NextQuery" :
|
|
1145
|
+
var chainCheck = task._0;
|
|
1146
|
+
var fetchForChain = checkAndFetchForChain(waitForNewBlock, executeQuery, state, dispatchAction);
|
|
1147
|
+
if (typeof chainCheck === "object") {
|
|
1148
|
+
return await fetchForChain(chainCheck._0);
|
|
1149
|
+
}
|
|
1150
|
+
await Promise.all(Belt_Array.map(ChainMap.keys(state.chainManager.chainFetchers), (function (__x) {
|
|
1151
|
+
return fetchForChain(__x);
|
|
1152
|
+
})));
|
|
1153
|
+
return ;
|
|
1154
|
+
case "ProcessPartitionQueryResponse" :
|
|
1155
|
+
processPartitionQueryResponse(state, task._0, dispatchAction);
|
|
1156
|
+
return ;
|
|
1157
|
+
case "UpdateChainMetaDataAndCheckForExit" :
|
|
1158
|
+
var writeThrottlers = state.writeThrottlers;
|
|
1159
|
+
var chainManager$1 = state.chainManager;
|
|
1160
|
+
if (task._0 === "ExitWithSuccess") {
|
|
1161
|
+
updateChainMetadataTable(chainManager$1, state.indexer.persistence, writeThrottlers.chainMetaData);
|
|
1162
|
+
return dispatchAction("SuccessExit");
|
|
1163
|
+
}
|
|
1164
|
+
updateChainMetadataTable(chainManager$1, state.indexer.persistence, writeThrottlers.chainMetaData);
|
|
1165
|
+
return ;
|
|
1166
|
+
|
|
1167
|
+
}
|
|
1168
|
+
}
|
|
1169
|
+
};
|
|
1170
|
+
}
|
|
1171
|
+
|
|
1172
|
+
var taskReducer = injectedTaskReducer(SourceManager.waitForNewBlock, SourceManager.executeQuery, (function (chainFetcher, reorgBlockNumber) {
|
|
1173
|
+
return ChainFetcher.getLastKnownValidBlock(chainFetcher, reorgBlockNumber, undefined);
|
|
1174
|
+
}));
|
|
1175
|
+
|
|
1176
|
+
export {
|
|
1177
|
+
WriteThrottlers ,
|
|
1178
|
+
make$1 as make,
|
|
1179
|
+
getId ,
|
|
1180
|
+
incrementId ,
|
|
1181
|
+
setChainManager ,
|
|
1182
|
+
isPreparingRollback ,
|
|
1183
|
+
updateChainMetadataTable ,
|
|
1184
|
+
updateProgressedChains ,
|
|
1185
|
+
validatePartitionQueryResponse ,
|
|
1186
|
+
submitPartitionQueryResponse ,
|
|
1187
|
+
processPartitionQueryResponse ,
|
|
1188
|
+
updateChainFetcher ,
|
|
1189
|
+
onEnterReorgThreshold ,
|
|
1190
|
+
actionReducer ,
|
|
1191
|
+
invalidatedActionReducer ,
|
|
1192
|
+
checkAndFetchForChain ,
|
|
1193
|
+
injectedTaskReducer ,
|
|
1194
|
+
taskReducer ,
|
|
1195
|
+
}
|
|
1196
|
+
/* taskReducer Not a pure module */
|