@subsquid/batch-processor 0.1.0-portal-api.a8e10e → 0.1.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/lib/database.d.ts CHANGED
@@ -10,11 +10,9 @@ export interface FinalTxInfo {
10
10
  }
11
11
  export interface FinalDatabase<S> {
12
12
  supportsHotBlocks?: false;
13
- connect(): Promise<FinalDatabaseState>;
13
+ connect(): Promise<HashAndHeight>;
14
14
  transact(info: FinalTxInfo, cb: (store: S) => Promise<void>): Promise<void>;
15
15
  }
16
- export interface FinalDatabaseState extends HashAndHeight {
17
- }
18
16
  export interface HotTxInfo {
19
17
  finalizedHead: HashAndHeight;
20
18
  baseHead: HashAndHeight;
@@ -24,7 +22,11 @@ export interface HotDatabase<S> {
24
22
  supportsHotBlocks: true;
25
23
  connect(): Promise<HotDatabaseState>;
26
24
  transact(info: FinalTxInfo, cb: (store: S) => Promise<void>): Promise<void>;
27
- transactHot2(info: HotTxInfo, cb: (store: S, blockSliceStart: number, blockSliceEnd: number) => Promise<void>): Promise<void>;
25
+ /**
26
+ * @deprecated
27
+ */
28
+ transactHot(info: HotTxInfo, cb: (store: S, block: HashAndHeight) => Promise<void>): Promise<void>;
29
+ transactHot2?(info: HotTxInfo, cb: (store: S, blockSliceStart: number, blockSliceEnd: number) => Promise<void>): Promise<void>;
28
30
  }
29
31
  export interface HotDatabaseState extends HashAndHeight {
30
32
  top: HashAndHeight[];
@@ -1 +1 @@
1
- {"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../src/database.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,MAAM,QAAQ,CAAC,CAAC,IAAI,aAAa,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAAA;AAG3D,MAAM,WAAW,WAAW;IACxB,QAAQ,EAAE,aAAa,CAAA;IACvB,QAAQ,EAAE,aAAa,CAAA;IACvB,OAAO,EAAE,OAAO,CAAA;CACnB;AAGD,MAAM,WAAW,aAAa,CAAC,CAAC;IAC5B,iBAAiB,CAAC,EAAE,KAAK,CAAA;IACzB,OAAO,IAAI,OAAO,CAAC,kBAAkB,CAAC,CAAA;IACtC,QAAQ,CAAC,IAAI,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CAC9E;AAGD,MAAM,WAAW,kBAAmB,SAAQ,aAAa;CAAG;AAG5D,MAAM,WAAW,SAAS;IACtB,aAAa,EAAE,aAAa,CAAA;IAC5B,QAAQ,EAAE,aAAa,CAAA;IACvB,SAAS,EAAE,aAAa,EAAE,CAAA;CAC7B;AAGD,MAAM,WAAW,WAAW,CAAC,CAAC;IAC1B,iBAAiB,EAAE,IAAI,CAAA;IACvB,OAAO,IAAI,OAAO,CAAC,gBAAgB,CAAC,CAAA;IACpC,QAAQ,CAAC,IAAI,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAE3E,YAAY,CACR,IAAI,EAAE,SAAS,EACf,EAAE,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,eAAe,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,GAChF,OAAO,CAAC,IAAI,CAAC,CAAA;CACnB;AAGD,MAAM,WAAW,gBAAiB,SAAQ,aAAa;IACnD,GAAG,EAAE,aAAa,EAAE,CAAA;CACvB;AAGD,MAAM,WAAW,aAAa;IAC1B,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;CACf"}
1
+ {"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../src/database.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,MAAM,QAAQ,CAAC,CAAC,IAAI,aAAa,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAAA;AAG3D,MAAM,WAAW,WAAW;IACxB,QAAQ,EAAE,aAAa,CAAA;IACvB,QAAQ,EAAE,aAAa,CAAA;IACvB,OAAO,EAAE,OAAO,CAAA;CACnB;AAGD,MAAM,WAAW,aAAa,CAAC,CAAC;IAC5B,iBAAiB,CAAC,EAAE,KAAK,CAAA;IACzB,OAAO,IAAI,OAAO,CAAC,aAAa,CAAC,CAAA;IACjC,QAAQ,CAAC,IAAI,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CAC9E;AAGD,MAAM,WAAW,SAAS;IACtB,aAAa,EAAE,aAAa,CAAA;IAC5B,QAAQ,EAAE,aAAa,CAAA;IACvB,SAAS,EAAE,aAAa,EAAE,CAAA;CAC7B;AAGD,MAAM,WAAW,WAAW,CAAC,CAAC;IAC1B,iBAAiB,EAAE,IAAI,CAAA;IACvB,OAAO,IAAI,OAAO,CAAC,gBAAgB,CAAC,CAAA;IACpC,QAAQ,CAAC,IAAI,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC3E;;OAEG;IACH,WAAW,CAAC,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,aAAa,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAElG,YAAY,CAAC,CACT,IAAI,EAAE,SAAS,EACf,EAAE,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,eAAe,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,GAChF,OAAO,CAAC,IAAI,CAAC,CAAA;CACnB;AAGD,MAAM,WAAW,gBAAiB,SAAQ,aAAa;IACnD,GAAG,EAAE,aAAa,EAAE,CAAA;CACvB;AAGD,MAAM,WAAW,aAAa;IAC1B,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;CACf"}
@@ -0,0 +1,8 @@
1
+ import type { FiniteRange } from '@subsquid/util-internal-range';
2
+ export interface DataSource<B> {
3
+ getFinalizedHeight(): Promise<number>;
4
+ getBlockHash(height: number): Promise<string | undefined>;
5
+ getBlockStream(fromBlock?: number): AsyncIterable<B[]>;
6
+ getBlocksCountInRange?(range: FiniteRange): number;
7
+ }
8
+ //# sourceMappingURL=datasource.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"datasource.d.ts","sourceRoot":"","sources":["../src/datasource.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,WAAW,EAAC,MAAM,+BAA+B,CAAA;AAG9D,MAAM,WAAW,UAAU,CAAC,CAAC;IACzB,kBAAkB,IAAI,OAAO,CAAC,MAAM,CAAC,CAAA;IACrC,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAA;IACzD,cAAc,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,aAAa,CAAC,CAAC,EAAE,CAAC,CAAA;IACtD,qBAAqB,CAAC,CAAC,KAAK,EAAE,WAAW,GAAG,MAAM,CAAA;CACrD"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=datasource.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"datasource.js","sourceRoot":"","sources":["../src/datasource.ts"],"names":[],"mappings":""}
package/lib/index.d.ts CHANGED
@@ -1,3 +1,4 @@
1
1
  export * from './database';
2
+ export * from './datasource';
2
3
  export * from './run';
3
4
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAA;AAC1B,cAAc,OAAO,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAA;AAC1B,cAAc,cAAc,CAAA;AAC5B,cAAc,OAAO,CAAA"}
package/lib/index.js CHANGED
@@ -15,5 +15,6 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
17
  __exportStar(require("./database"), exports);
18
+ __exportStar(require("./datasource"), exports);
18
19
  __exportStar(require("./run"), exports);
19
20
  //# sourceMappingURL=index.js.map
package/lib/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,6CAA0B;AAC1B,wCAAqB"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,6CAA0B;AAC1B,+CAA4B;AAC5B,wCAAqB"}
package/lib/run.d.ts CHANGED
@@ -1,5 +1,7 @@
1
- import { Database } from './database';
2
- import { DataSource, BlockRef } from '@subsquid/util-internal-data-source';
1
+ import { PrometheusServer } from '@subsquid/util-internal-processor-tools';
2
+ import { Database, HashAndHeight } from './database';
3
+ import { DataSource } from './datasource';
4
+ export { PrometheusServer };
3
5
  export interface DataHandlerContext<Block, Store> {
4
6
  /**
5
7
  * Storage interface provided by the database
@@ -14,8 +16,11 @@ export interface DataHandlerContext<Block, Store> {
14
16
  */
15
17
  isHead: boolean;
16
18
  }
17
- export interface BlockBase {
18
- header: BlockRef;
19
+ interface BlockBase {
20
+ header: HashAndHeight;
21
+ }
22
+ interface RunOptions {
23
+ prometheus?: PrometheusServer;
19
24
  }
20
25
  /**
21
26
  * Run data processing.
@@ -31,5 +36,5 @@ export interface BlockBase {
31
36
  *
32
37
  * @param dataHandler - The data handler, see {@link DataHandlerContext} for an API available to the handler.
33
38
  */
34
- export declare function run<Block extends BlockBase, Store>(src: DataSource<Block>, db: Database<Store>, dataHandler: (ctx: DataHandlerContext<Block, Store>) => Promise<void>): void;
39
+ export declare function run<Block extends BlockBase, Store>(src: DataSource<Block>, db: Database<Store>, dataHandler: (ctx: DataHandlerContext<Block, Store>) => Promise<void>, opts?: RunOptions): void;
35
40
  //# sourceMappingURL=run.d.ts.map
package/lib/run.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../src/run.ts"],"names":[],"mappings":"AAIA,OAAO,EAAgB,QAAQ,EAAmB,MAAM,YAAY,CAAA;AAEpE,OAAO,EAAC,UAAU,EAAmB,QAAQ,EAAkB,MAAM,qCAAqC,CAAA;AAM1G,MAAM,WAAW,kBAAkB,CAAC,KAAK,EAAE,KAAK;IAC5C;;OAEG;IACH,KAAK,EAAE,KAAK,CAAA;IACZ;;OAEG;IACH,MAAM,EAAE,KAAK,EAAE,CAAA;IACf;;OAEG;IACH,MAAM,EAAE,OAAO,CAAA;CAClB;AAED,MAAM,WAAW,SAAS;IACtB,MAAM,EAAE,QAAQ,CAAA;CACnB;AAOD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,GAAG,CAAC,KAAK,SAAS,SAAS,EAAE,KAAK,EAC9C,GAAG,EAAE,UAAU,CAAC,KAAK,CAAC,EACtB,EAAE,EAAE,QAAQ,CAAC,KAAK,CAAC,EACnB,WAAW,EAAE,CAAC,GAAG,EAAE,kBAAkB,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,GACtE,IAAI,CASN"}
1
+ {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../src/run.ts"],"names":[],"mappings":"AAEA,OAAO,EAAC,gBAAgB,EAAgB,MAAM,yCAAyC,CAAA;AACvF,OAAO,EAAC,QAAQ,EAAE,aAAa,EAAC,MAAM,YAAY,CAAA;AAClD,OAAO,EAAC,UAAU,EAAC,MAAM,cAAc,CAAA;AAGvC,OAAO,EAAC,gBAAgB,EAAC,CAAA;AAMzB,MAAM,WAAW,kBAAkB,CAAC,KAAK,EAAE,KAAK;IAC5C;;OAEG;IACH,KAAK,EAAE,KAAK,CAAA;IACZ;;OAEG;IACH,MAAM,EAAE,KAAK,EAAE,CAAA;IACf;;OAEG;IACH,MAAM,EAAE,OAAO,CAAA;CAClB;AAGD,UAAU,SAAS;IACf,MAAM,EAAE,aAAa,CAAA;CACxB;AAED,UAAU,UAAU;IAChB,UAAU,CAAC,EAAE,gBAAgB,CAAA;CAChC;AAGD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,GAAG,CAAC,KAAK,SAAS,SAAS,EAAE,KAAK,EAC9C,GAAG,EAAE,UAAU,CAAC,KAAK,CAAC,EACtB,EAAE,EAAE,QAAQ,CAAC,KAAK,CAAC,EACnB,WAAW,EAAE,CAAC,GAAG,EAAE,kBAAkB,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,EACrE,IAAI,CAAC,EAAE,UAAU,GAClB,IAAI,CAMN"}
package/lib/run.js CHANGED
@@ -1,40 +1,12 @@
1
1
  "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || function (mod) {
19
- if (mod && mod.__esModule) return mod;
20
- var result = {};
21
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
- __setModuleDefault(result, mod);
23
- return result;
24
- };
25
- var __importDefault = (this && this.__importDefault) || function (mod) {
26
- return (mod && mod.__esModule) ? mod : { "default": mod };
27
- };
28
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PrometheusServer = void 0;
29
4
  exports.run = run;
30
5
  const logger_1 = require("@subsquid/logger");
31
6
  const util_internal_1 = require("@subsquid/util-internal");
32
- const util_internal_prometheus_server_1 = require("@subsquid/util-internal-prometheus-server");
33
- const prom = __importStar(require("prom-client"));
34
- const metrics_1 = require("./metrics");
35
- const util_internal_data_source_1 = require("@subsquid/util-internal-data-source");
7
+ const util_internal_processor_tools_1 = require("@subsquid/util-internal-processor-tools");
8
+ Object.defineProperty(exports, "PrometheusServer", { enumerable: true, get: function () { return util_internal_processor_tools_1.PrometheusServer; } });
36
9
  const util_1 = require("./util");
37
- const assert_1 = __importDefault(require("assert"));
38
10
  const log = (0, logger_1.createLogger)('sqd:batch-processor');
39
11
  /**
40
12
  * Run data processing.
@@ -50,157 +22,91 @@ const log = (0, logger_1.createLogger)('sqd:batch-processor');
50
22
  *
51
23
  * @param dataHandler - The data handler, see {@link DataHandlerContext} for an API available to the handler.
52
24
  */
53
- function run(src, db, dataHandler) {
25
+ function run(src, db, dataHandler, opts) {
54
26
  (0, util_internal_1.runProgram)(() => {
55
- return new Processor(src, db, dataHandler).run();
56
- }, (err) => {
27
+ return new Processor(src, db, dataHandler, opts).run();
28
+ }, err => {
57
29
  log.fatal(err);
58
30
  });
59
31
  }
60
32
  class Processor {
61
- constructor(src, db, handler) {
33
+ constructor(src, db, handler, opts) {
62
34
  this.src = src;
63
35
  this.db = db;
64
36
  this.handler = handler;
65
- this.metrics = new metrics_1.Metrics();
37
+ this.opts = opts;
66
38
  this.hasStatusNews = false;
39
+ this.metrics = new util_internal_processor_tools_1.RunnerMetrics(src.getBlocksCountInRange?.bind(src) ?? ((range) => Math.max(0, range.to - range.from + 1)));
40
+ this.chainHeight = new util_internal_1.Throttler(() => this.src.getFinalizedHeight(), 30000);
67
41
  }
68
42
  async run() {
69
- let getHead = this.db.supportsHotBlocks ? this.src.getHead.bind(this.src) : this.src.getFinalizedHead.bind(this.src);
70
- let chainHeight = new util_internal_1.Throttler(() => getHead()?.then((r) => r?.number ?? -1), 10000);
71
- let state = {
72
- finalizedHead: undefined,
73
- unfinalizedHeads: [],
74
- };
75
- if (this.db.supportsHotBlocks) {
76
- let dbState = await this.db.connect();
77
- state.finalizedHead = dbState.height < 0 ? undefined : toBlockRef(dbState);
78
- state.unfinalizedHeads = dbState.top.map(toBlockRef);
79
- }
80
- else {
81
- let dbState = await this.db.connect();
82
- state.finalizedHead = dbState.height < 0 ? undefined : toBlockRef(dbState);
43
+ let state = await this.db.connect();
44
+ if (state.height >= 0) {
45
+ log.info(`last processed final block was ${state.height}`);
83
46
  }
84
- let head = getStateHead(state);
85
- if (head != null) {
86
- log.info(`last processed block was ${head.number}`);
87
- }
88
- await this.initMetrics(head?.number ?? -1, await chainHeight.get());
89
- while (true) {
90
- let getStream = this.db.supportsHotBlocks ? this.src.getStream.bind(this.src) : this.src.getFinalizedStream.bind(this.src);
91
- head = getStateHead(state);
92
- try {
93
- for await (let data of getStream({ after: head })) {
94
- state = await this.processBatch(state, data, await chainHeight.get());
95
- }
96
- }
97
- catch (e) {
98
- if (!(0, util_internal_data_source_1.isForkException)(e) || !this.db.supportsHotBlocks)
99
- throw e;
100
- let chain = state.finalizedHead
101
- ? [state.finalizedHead, ...state.unfinalizedHeads]
102
- : state.unfinalizedHeads;
103
- let rollbackIndex = findRollbackIndex(chain, e.previousBlocks);
104
- if (rollbackIndex === -1) {
105
- if (state.finalizedHead != null)
106
- throw new Error('Unable to process fork');
107
- state.unfinalizedHeads = [];
108
- }
109
- else {
110
- const rollbackHead = chain[rollbackIndex];
111
- log.info(`navigating a fork on a common base ${(0, util_1.formatHead)(rollbackHead)}`);
112
- state.unfinalizedHeads = chain.slice(1, rollbackIndex + 1);
113
- }
47
+ await this.assertWeAreOnTheSameChain(state);
48
+ await this.initMetrics(state);
49
+ for await (let blocks of this.src.getBlockStream(state.height + 1)) {
50
+ if (blocks.length > 0) {
51
+ state = await this.processBatch(state, blocks);
114
52
  }
115
- break;
116
53
  }
117
54
  this.reportFinalStatus();
118
55
  }
119
- async initMetrics(state, chainHeight) {
120
- this.updateProgressMetrics(chainHeight, state);
56
+ async assertWeAreOnTheSameChain(state) {
57
+ if (state.height < 0)
58
+ return;
59
+ let hash = await this.src.getBlockHash(state.height);
60
+ if (state.hash === hash)
61
+ return;
62
+ throw new Error(`already indexed block ${(0, util_1.formatHead)(state)} was not found on chain`);
63
+ }
64
+ async initMetrics(state) {
65
+ this.updateProgressMetrics(await this.chainHeight.get(), state);
121
66
  let port = process.env.PROCESSOR_PROMETHEUS_PORT || process.env.PROMETHEUS_PORT;
122
- if (port == null)
67
+ let prometheusServer;
68
+ if (this.opts?.prometheus != null) {
69
+ prometheusServer = this.opts.prometheus;
70
+ }
71
+ else if (port != null) {
72
+ prometheusServer = new util_internal_processor_tools_1.PrometheusServer();
73
+ prometheusServer.setPort(port);
74
+ }
75
+ if (prometheusServer == null)
123
76
  return;
124
- prom.collectDefaultMetrics();
125
- this.metrics.install();
126
- let server = await (0, util_internal_prometheus_server_1.createPrometheusServer)(prom.register, port);
127
- log.info(`prometheus metrics are served on port ${server.port}`);
77
+ prometheusServer.addRunnerMetrics(this.metrics);
78
+ let listening = await prometheusServer.serve();
79
+ log.info(`prometheus metrics are served on port ${listening.port}`);
128
80
  }
129
- updateProgressMetrics(chainHeight, indexerHeight, time) {
81
+ updateProgressMetrics(chainHeight, state, time) {
130
82
  this.metrics.setChainHeight(chainHeight);
131
- this.metrics.setLastProcessedBlock(indexerHeight);
132
- let left;
133
- let processed;
134
- left = this.metrics.getChainHeight() - this.metrics.getLastProcessedBlock();
135
- processed = this.metrics.getLastProcessedBlock();
136
- this.metrics.updateProgress(processed, left, time);
83
+ this.metrics.setLastProcessedBlock(state.height);
84
+ this.metrics.updateProgress(time);
137
85
  }
138
- async processBatch(state, data, chainHeight) {
139
- let { blocks, finalizedHead: finalizedHeadData } = data;
140
- if (blocks.length === 0)
141
- return state;
142
- let prevHead = getStateHead(state);
143
- // Validate data continuity
144
- if (prevHead && blocks.length > 0 && prevHead.number >= blocks[0].header.number) {
145
- throw new Error('Data is not continuous');
146
- }
147
- let unfinalizedIndex = 0;
148
- if (finalizedHeadData?.number != null) {
149
- unfinalizedIndex = blocks.findIndex((b) => b.header.number > finalizedHeadData.number);
150
- }
151
- let nextHead = (0, util_internal_1.last)(blocks).header;
152
- let isOnTop = nextHead.number >= chainHeight;
86
+ async processBatch(prevHead, blocks) {
87
+ let chainHeight = await this.chainHeight.get();
88
+ let nextHead = {
89
+ hash: (0, util_internal_1.last)(blocks).header.hash,
90
+ height: (0, util_internal_1.last)(blocks).header.height
91
+ };
92
+ let isOnTop = nextHead.height >= chainHeight;
153
93
  let mappingStartTime = process.hrtime.bigint();
154
- // All new blocks are finalized
155
- if (unfinalizedIndex < 0) {
156
- const finalizedRef = blocks[blocks.length - 1].header;
157
- state.finalizedHead = { number: finalizedRef.number, hash: finalizedRef.hash };
158
- state.unfinalizedHeads = [];
159
- await this.db.transact({
160
- prevHead: prevHead ? toHashAndHeight(prevHead) : { height: -1, hash: '0x' },
161
- nextHead: toHashAndHeight(nextHead),
162
- isOnTop,
163
- }, (store) => {
164
- return this.handler({
165
- store,
166
- blocks,
167
- isHead: isOnTop,
168
- });
169
- });
170
- }
171
- else {
172
- (0, assert_1.default)(this.db.supportsHotBlocks);
173
- let finalizedRef = blocks[unfinalizedIndex - 1]?.header;
174
- if (finalizedHeadData?.hash && finalizedHeadData?.number != null) {
175
- finalizedRef = { hash: finalizedHeadData.hash, number: finalizedHeadData.number };
176
- }
177
- state.finalizedHead = finalizedRef ?? state.finalizedHead;
178
- // Finalize all hot heads that are older than the cold head
179
- if (state.finalizedHead) {
180
- let finalizeIndex = state.unfinalizedHeads.findIndex((h) => h.number > state.finalizedHead.number);
181
- state.unfinalizedHeads = finalizeIndex < 0 ? [] : state.unfinalizedHeads.slice(finalizeIndex);
182
- }
183
- // Process unfinalized blocks
184
- for (let i = unfinalizedIndex; i < blocks.length; i++) {
185
- state.unfinalizedHeads.push({ number: blocks[i].header.number, hash: blocks[i].header.hash });
186
- }
187
- await this.db.transactHot2({
188
- finalizedHead: finalizedHeadData ? toHashAndHeight(finalizedHeadData) : { height: -1, hash: '0x' },
189
- baseHead: prevHead ? toHashAndHeight(prevHead) : { height: -1, hash: '0x' },
190
- newBlocks: data.blocks.map((b) => toHashAndHeight(b.header)),
191
- }, (store, start, end) => {
192
- return this.handler({
193
- store,
194
- blocks: blocks.slice(start, end),
195
- isHead: isOnTop,
196
- });
94
+ await this.db.transact({
95
+ prevHead,
96
+ nextHead,
97
+ isOnTop
98
+ }, store => {
99
+ return this.handler({
100
+ store,
101
+ blocks,
102
+ isHead: isOnTop
197
103
  });
198
- }
104
+ });
199
105
  let mappingEndTime = process.hrtime.bigint();
200
- this.updateProgressMetrics(chainHeight, nextHead.number, mappingEndTime);
106
+ this.updateProgressMetrics(chainHeight, nextHead, mappingEndTime);
201
107
  this.metrics.registerBatch(blocks.length, (0, util_1.getItemsCount)(blocks), mappingStartTime, mappingEndTime);
202
108
  this.reportStatus();
203
- return state;
109
+ return nextHead;
204
110
  }
205
111
  reportStatus() {
206
112
  if (this.statusReportTimer == null) {
@@ -227,37 +133,4 @@ class Processor {
227
133
  }
228
134
  }
229
135
  }
230
- function findRollbackIndex(currentChain, forkChain) {
231
- let currentIndex = 0;
232
- let forkIndex = 0;
233
- let lastCommonIndex = -1;
234
- while (currentIndex < currentChain.length && forkIndex < forkChain.length) {
235
- const currentBlock = currentChain[currentIndex];
236
- const forkBlock = forkChain[forkIndex];
237
- if (currentBlock.number > forkBlock.number) {
238
- currentIndex++;
239
- continue;
240
- }
241
- if (currentBlock.number < forkBlock.number) {
242
- forkIndex++;
243
- continue;
244
- }
245
- if (currentBlock.hash !== forkBlock.hash) {
246
- return lastCommonIndex;
247
- }
248
- lastCommonIndex = currentIndex;
249
- currentIndex++;
250
- forkIndex++;
251
- }
252
- return lastCommonIndex;
253
- }
254
- function toHashAndHeight(ref) {
255
- return { height: ref.number, hash: ref.hash };
256
- }
257
- function toBlockRef(hashAndHeight) {
258
- return { number: hashAndHeight.height, hash: hashAndHeight.hash };
259
- }
260
- function getStateHead(state) {
261
- return (0, util_internal_1.maybeLast)(state.unfinalizedHeads) ?? state.finalizedHead;
262
- }
263
136
  //# sourceMappingURL=run.js.map
package/lib/run.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"run.js","sourceRoot":"","sources":["../src/run.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkDA,kBAaC;AA/DD,6CAA6C;AAC7C,2DAA8E;AAC9E,+FAAgF;AAChF,kDAAmC;AAEnC,uCAAiC;AACjC,mFAA0G;AAC1G,iCAAgD;AAChD,oDAA2B;AAE3B,MAAM,GAAG,GAAG,IAAA,qBAAY,EAAC,qBAAqB,CAAC,CAAA;AA0B/C;;;;;;;;;;;;;GAaG;AACH,SAAgB,GAAG,CACf,GAAsB,EACtB,EAAmB,EACnB,WAAqE;IAErE,IAAA,0BAAU,EACN,GAAG,EAAE;QACD,OAAO,IAAI,SAAS,CAAC,GAAG,EAAE,EAAE,EAAE,WAAW,CAAC,CAAC,GAAG,EAAE,CAAA;IACpD,CAAC,EACD,CAAC,GAAG,EAAE,EAAE;QACJ,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IAClB,CAAC,CACJ,CAAA;AACL,CAAC;AAED,MAAM,SAAS;IAKX,YACY,GAAkB,EAClB,EAAe,EACf,OAAyD;QAFzD,QAAG,GAAH,GAAG,CAAe;QAClB,OAAE,GAAF,EAAE,CAAa;QACf,YAAO,GAAP,OAAO,CAAkD;QAP7D,YAAO,GAAG,IAAI,iBAAO,EAAE,CAAA;QAEvB,kBAAa,GAAG,KAAK,CAAA;IAM1B,CAAC;IAEJ,KAAK,CAAC,GAAG;QACL,IAAI,OAAO,GAAG,IAAI,CAAC,EAAE,CAAC,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QACpH,IAAI,WAAW,GAAG,IAAI,yBAAS,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,MAAM,IAAI,CAAC,CAAC,CAAC,EAAE,KAAM,CAAC,CAAA;QAEtF,IAAI,KAAK,GAAmB;YACxB,aAAa,EAAE,SAAS;YACxB,gBAAgB,EAAE,EAAE;SACvB,CAAA;QACD,IAAI,IAAI,CAAC,EAAE,CAAC,iBAAiB,EAAE,CAAC;YAC5B,IAAI,OAAO,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAA;YACrC,KAAK,CAAC,aAAa,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,CAAA;YAC1E,KAAK,CAAC,gBAAgB,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,CAAA;QACxD,CAAC;aAAM,CAAC;YACJ,IAAI,OAAO,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAA;YACrC,KAAK,CAAC,aAAa,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,CAAA;QAC9E,CAAC;QAED,IAAI,IAAI,GAAG,YAAY,CAAC,KAAK,CAAC,CAAA;QAC9B,IAAI,IAAI,IAAI,IAAI,EAAE,CAAC;YACf,GAAG,CAAC,IAAI,CAAC,4BAA4B,IAAI,CAAC,MAAM,EAAE,CAAC,CAAA;QACvD,CAAC;QACD,MAAM,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,MAAM,IAAI,CAAC,CAAC,EAAE,MAAM,WAAW,CAAC,GAAG,EAAE,CAAC,CAAA;QAEnE,OAAO,IAAI,EAAE,CAAC;YACV,IAAI,SAAS,GAAG,IAAI,CAAC,EAAE,CAAC,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;YAE1H,IAAI,GAAG,YAAY,CAAC,KAAK,CAAC,CAAA;YAC1B,IAAI,CAAC;gBACD,IAAI,KAAK,EAAE,IAAI,IAAI,IAAI,SAAS,CAAC,EAAC,KAAK,EAAE,IAAI,EAAC,CAAC,EAAE,CAAC;oBAC9C,KAAK,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC,GAAG,EAAE,CAAC,CAAA;gBACzE,CAAC;YACL,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACT,IAAI,CAAC,IAAA,2CAAe,EAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,iBAAiB;oBAAE,MAAM,CAAC,CAAA;gBAE9D,IAAI,KAAK,GAAG,KAAK,CAAC,aAAa;oBAC3B,CAAC,CAAC,CAAC,KAAK,CAAC,aAAa,EAAE,GAAG,KAAK,CAAC,gBAAgB,CAAC;oBAClD,CAAC,CAAC,KAAK,CAAC,gBAAgB,CAAA;gBAC5B,IAAI,aAAa,GAAG,iBAAiB,CAAC,KAAK,EAAE,CAAC,CAAC,cAAc,CAAC,CAAA;gBAC9D,IAAI,aAAa,KAAK,CAAC,CAAC,EAAE,CAAC;oBACvB,IAAI,KAAK,CAAC,aAAa,IAAI,IAAI;wBAAE,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAA;oBAC1E,KAAK,CAAC,gBAAgB,GAAG,EAAE,CAAA;gBAC/B,CAAC;qBAAM,CAAC;oBACJ,MAAM,YAAY,GAAG,KAAK,CAAC,aAAa,CAAC,CAAA;oBACzC,GAAG,CAAC,IAAI,CAAC,sCAAsC,IAAA,iBAAU,EAAC,YAAY,CAAC,EAAE,CAAC,CAAA;oBAE1E,KAAK,CAAC,gBAAgB,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,aAAa,GAAG,CAAC,CAAC,CAAA;gBAC9D,CAAC;YACL,CAAC;YAED,MAAK;QACT,CAAC;QAED,IAAI,CAAC,iBAAiB,EAAE,CAAA;IAC5B,CAAC;IAEO,KAAK,CAAC,WAAW,CAAC,KAAa,EAAE,WAAmB;QACxD,IAAI,CAAC,qBAAqB,CAAC,WAAW,EAAE,KAAK,CAAC,CAAA;QAC9C,IAAI,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,yBAAyB,IAAI,OAAO,CAAC,GAAG,CAAC,eAAe,CAAA;QAC/E,IAAI,IAAI,IAAI,IAAI;YAAE,OAAM;QACxB,IAAI,CAAC,qBAAqB,EAAE,CAAA;QAC5B,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAA;QACtB,IAAI,MAAM,GAAG,MAAM,IAAA,wDAAsB,EAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAA;QAC9D,GAAG,CAAC,IAAI,CAAC,yCAAyC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAA;IACpE,CAAC;IAEO,qBAAqB,CAAC,WAAmB,EAAE,aAAqB,EAAE,IAAa;QACnF,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,WAAW,CAAC,CAAA;QACxC,IAAI,CAAC,OAAO,CAAC,qBAAqB,CAAC,aAAa,CAAC,CAAA;QACjD,IAAI,IAAY,CAAA;QAChB,IAAI,SAAiB,CAAA;QACrB,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,qBAAqB,EAAE,CAAA;QAC3E,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,qBAAqB,EAAE,CAAA;QAChD,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC,CAAA;IACtD,CAAC;IAEO,KAAK,CAAC,YAAY,CACtB,KAAqB,EACrB,IAAmB,EACnB,WAAmB;QAEnB,IAAI,EAAC,MAAM,EAAE,aAAa,EAAE,iBAAiB,EAAC,GAAG,IAAI,CAAA;QAErD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,KAAK,CAAA;QAErC,IAAI,QAAQ,GAAG,YAAY,CAAC,KAAK,CAAC,CAAA;QAElC,2BAA2B;QAC3B,IAAI,QAAQ,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,QAAQ,CAAC,MAAM,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YAC9E,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAA;QAC7C,CAAC;QAED,IAAI,gBAAgB,GAAG,CAAC,CAAA;QACxB,IAAI,iBAAiB,EAAE,MAAM,IAAI,IAAI,EAAE,CAAC;YACpC,gBAAgB,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAA;QAC1F,CAAC;QAED,IAAI,QAAQ,GAAG,IAAA,oBAAI,EAAC,MAAM,CAAC,CAAC,MAAM,CAAA;QAClC,IAAI,OAAO,GAAG,QAAQ,CAAC,MAAM,IAAI,WAAW,CAAA;QAE5C,IAAI,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,CAAA;QAE9C,+BAA+B;QAC/B,IAAI,gBAAgB,GAAG,CAAC,EAAE,CAAC;YACvB,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,MAAM,CAAA;YACrD,KAAK,CAAC,aAAa,GAAG,EAAC,MAAM,EAAE,YAAY,CAAC,MAAM,EAAE,IAAI,EAAE,YAAY,CAAC,IAAI,EAAC,CAAA;YAC5E,KAAK,CAAC,gBAAgB,GAAG,EAAE,CAAA;YAE3B,MAAM,IAAI,CAAC,EAAE,CAAC,QAAQ,CAClB;gBACI,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAC,MAAM,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAC;gBACzE,QAAQ,EAAE,eAAe,CAAC,QAAQ,CAAC;gBACnC,OAAO;aACV,EACD,CAAC,KAAK,EAAE,EAAE;gBACN,OAAO,IAAI,CAAC,OAAO,CAAC;oBAChB,KAAK;oBACL,MAAM;oBACN,MAAM,EAAE,OAAO;iBAClB,CAAC,CAAA;YACN,CAAC,CACJ,CAAA;QACL,CAAC;aAAM,CAAC;YACJ,IAAA,gBAAM,EAAC,IAAI,CAAC,EAAE,CAAC,iBAAiB,CAAC,CAAA;YAEjC,IAAI,YAAY,GAAyB,MAAM,CAAC,gBAAgB,GAAG,CAAC,CAAC,EAAE,MAAM,CAAA;YAC7E,IAAI,iBAAiB,EAAE,IAAI,IAAI,iBAAiB,EAAE,MAAM,IAAI,IAAI,EAAE,CAAC;gBAC/D,YAAY,GAAG,EAAC,IAAI,EAAE,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,iBAAiB,CAAC,MAAM,EAAC,CAAA;YACnF,CAAC;YACD,KAAK,CAAC,aAAa,GAAG,YAAY,IAAI,KAAK,CAAC,aAAa,CAAA;YAEzD,2DAA2D;YAC3D,IAAI,KAAK,CAAC,aAAa,EAAE,CAAC;gBACtB,IAAI,aAAa,GAAG,KAAK,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,KAAK,CAAC,aAAc,CAAC,MAAM,CAAC,CAAA;gBACnG,KAAK,CAAC,gBAAgB,GAAG,aAAa,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,gBAAgB,CAAC,KAAK,CAAC,aAAa,CAAC,CAAA;YACjG,CAAC;YAED,6BAA6B;YAC7B,KAAK,IAAI,CAAC,GAAG,gBAAgB,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACpD,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,EAAC,CAAC,CAAA;YAC/F,CAAC;YAED,MAAM,IAAI,CAAC,EAAE,CAAC,YAAY,CACtB;gBACI,aAAa,EAAE,iBAAiB,CAAC,CAAC,CAAC,eAAe,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,EAAC,MAAM,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAC;gBAChG,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAC,MAAM,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAC;gBACzE,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;aAC/D,EACD,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;gBAClB,OAAO,IAAI,CAAC,OAAO,CAAC;oBAChB,KAAK;oBACL,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC;oBAChC,MAAM,EAAE,OAAO;iBAClB,CAAC,CAAA;YACN,CAAC,CACJ,CAAA;QACL,CAAC;QAED,IAAI,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,CAAA;QAE5C,IAAI,CAAC,qBAAqB,CAAC,WAAW,EAAE,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC,CAAA;QACxE,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,MAAM,EAAE,IAAA,oBAAa,EAAC,MAAM,CAAC,EAAE,gBAAgB,EAAE,cAAc,CAAC,CAAA;QAElG,IAAI,CAAC,YAAY,EAAE,CAAA;QAEnB,OAAO,KAAK,CAAA;IAChB,CAAC;IAEO,YAAY;QAChB,IAAI,IAAI,CAAC,iBAAiB,IAAI,IAAI,EAAE,CAAC;YACjC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC,CAAA;YACtC,IAAI,CAAC,iBAAiB,GAAG,UAAU,CAAC,GAAG,EAAE;gBACrC,IAAI,CAAC,iBAAiB,GAAG,SAAS,CAAA;gBAClC,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;oBACrB,IAAI,CAAC,aAAa,GAAG,KAAK,CAAA;oBAC1B,IAAI,CAAC,YAAY,EAAE,CAAA;gBACvB,CAAC;YACL,CAAC,EAAE,IAAK,CAAC,CAAA;QACb,CAAC;aAAM,CAAC;YACJ,IAAI,CAAC,aAAa,GAAG,IAAI,CAAA;QAC7B,CAAC;IACL,CAAC;IAEO,iBAAiB;QACrB,IAAI,IAAI,CAAC,iBAAiB,IAAI,IAAI,EAAE,CAAC;YACjC,YAAY,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAA;QACxC,CAAC;QACD,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACrB,IAAI,CAAC,aAAa,GAAG,KAAK,CAAA;YAC1B,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC,CAAA;QAC1C,CAAC;IACL,CAAC;CACJ;AAED,SAAS,iBAAiB,CAAC,YAAwB,EAAE,SAAqB;IACtE,IAAI,YAAY,GAAG,CAAC,CAAA;IACpB,IAAI,SAAS,GAAG,CAAC,CAAA;IACjB,IAAI,eAAe,GAAG,CAAC,CAAC,CAAA;IAExB,OAAO,YAAY,GAAG,YAAY,CAAC,MAAM,IAAI,SAAS,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC;QACxE,MAAM,YAAY,GAAG,YAAY,CAAC,YAAY,CAAC,CAAA;QAC/C,MAAM,SAAS,GAAG,SAAS,CAAC,SAAS,CAAC,CAAA;QAEtC,IAAI,YAAY,CAAC,MAAM,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC;YACzC,YAAY,EAAE,CAAA;YACd,SAAQ;QACZ,CAAC;QAED,IAAI,YAAY,CAAC,MAAM,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC;YACzC,SAAS,EAAE,CAAA;YACX,SAAQ;QACZ,CAAC;QAED,IAAI,YAAY,CAAC,IAAI,KAAK,SAAS,CAAC,IAAI,EAAE,CAAC;YACvC,OAAO,eAAe,CAAA;QAC1B,CAAC;QAED,eAAe,GAAG,YAAY,CAAA;QAC9B,YAAY,EAAE,CAAA;QACd,SAAS,EAAE,CAAA;IACf,CAAC;IAED,OAAO,eAAe,CAAA;AAC1B,CAAC;AAED,SAAS,eAAe,CAAC,GAAa;IAClC,OAAO,EAAC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAC,CAAA;AAC/C,CAAC;AAED,SAAS,UAAU,CAAC,aAA4B;IAC5C,OAAO,EAAC,MAAM,EAAE,aAAa,CAAC,MAAM,EAAE,IAAI,EAAE,aAAa,CAAC,IAAI,EAAC,CAAA;AACnE,CAAC;AAED,SAAS,YAAY,CAAC,KAAqB;IACvC,OAAO,IAAA,yBAAS,EAAC,KAAK,CAAC,gBAAgB,CAAC,IAAI,KAAK,CAAC,aAAa,CAAA;AACnE,CAAC"}
1
+ {"version":3,"file":"run.js","sourceRoot":"","sources":["../src/run.ts"],"names":[],"mappings":"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"}
package/lib/util.d.ts CHANGED
@@ -1,6 +1,6 @@
1
- import type { BlockRef } from '@subsquid/util-internal-data-source';
1
+ import { HashAndHeight } from './database';
2
2
  export declare function timeInterval(seconds: number): string;
3
3
  export declare function getItemsCount(blocks: any[]): number;
4
- export declare function formatHead(head: BlockRef): string;
4
+ export declare function formatHead(head: HashAndHeight): string;
5
5
  export declare function shortHash(hash: string): string;
6
6
  //# sourceMappingURL=util.d.ts.map
package/lib/util.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,QAAQ,EAAC,MAAM,qCAAqC,CAAA;AAIjE,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAWpD;AAGD,wBAAgB,aAAa,CAAC,MAAM,EAAE,GAAG,EAAE,GAAG,MAAM,CAWnD;AAGD,wBAAgB,UAAU,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,CAEjD;AAGD,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAM9C"}
1
+ {"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,aAAa,EAAC,MAAM,YAAY,CAAA;AAGxC,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAWpD;AAGD,wBAAgB,aAAa,CAAC,MAAM,EAAE,GAAG,EAAE,GAAG,MAAM,CAWnD;AAGD,wBAAgB,UAAU,CAAC,IAAI,EAAE,aAAa,GAAG,MAAM,CAEtD;AAGD,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAM9C"}
package/lib/util.js CHANGED
@@ -29,7 +29,7 @@ function getItemsCount(blocks) {
29
29
  return count;
30
30
  }
31
31
  function formatHead(head) {
32
- return `${head.number}#${shortHash(head.hash)}`;
32
+ return `${head.height}#${shortHash(head.hash)}`;
33
33
  }
34
34
  function shortHash(hash) {
35
35
  if (hash.startsWith('0x')) {
package/lib/util.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"util.js","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":";;AAIA,oCAWC;AAGD,sCAWC;AAGD,gCAEC;AAGD,8BAMC;AAvCD,SAAgB,YAAY,CAAC,OAAe;IACxC,IAAI,OAAO,GAAG,EAAE,EAAE,CAAC;QACf,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,GAAG,CAAA;IACpC,CAAC;IACD,IAAI,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,GAAC,EAAE,CAAC,CAAA;IACnC,IAAI,OAAO,GAAG,EAAE,EAAE,CAAC;QACf,OAAQ,OAAO,GAAC,GAAG,CAAA;IACvB,CAAC;IACD,IAAI,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC,CAAA;IACpC,OAAO,GAAG,OAAO,GAAG,KAAK,GAAG,EAAE,CAAA;IAC9B,OAAO,KAAK,GAAG,IAAI,GAAG,OAAO,GAAG,GAAG,CAAA;AACvC,CAAC;AAGD,SAAgB,aAAa,CAAC,MAAa;IACvC,IAAI,KAAK,GAAG,CAAC,CAAA;IACb,KAAK,IAAI,KAAK,IAAI,MAAM,EAAE,CAAC;QACvB,KAAK,IAAI,GAAG,IAAI,KAAK,EAAE,CAAC;YACpB,IAAI,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,CAAA;YACpB,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;gBACrB,KAAK,IAAI,GAAG,CAAC,MAAM,CAAA;YACvB,CAAC;QACL,CAAC;IACL,CAAC;IACD,OAAO,KAAK,CAAA;AAChB,CAAC;AAGD,SAAgB,UAAU,CAAC,IAAc;IACrC,OAAO,GAAG,IAAI,CAAC,MAAM,IAAI,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAA;AACnD,CAAC;AAGD,SAAgB,SAAS,CAAC,IAAY;IAClC,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACxB,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;IAC3B,CAAC;SAAM,CAAC;QACJ,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;IAC3B,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"util.js","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":";;AAGA,oCAWC;AAGD,sCAWC;AAGD,gCAEC;AAGD,8BAMC;AAvCD,SAAgB,YAAY,CAAC,OAAe;IACxC,IAAI,OAAO,GAAG,EAAE,EAAE,CAAC;QACf,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,GAAG,CAAA;IACpC,CAAC;IACD,IAAI,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,GAAC,EAAE,CAAC,CAAA;IACnC,IAAI,OAAO,GAAG,EAAE,EAAE,CAAC;QACf,OAAQ,OAAO,GAAC,GAAG,CAAA;IACvB,CAAC;IACD,IAAI,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC,CAAA;IACpC,OAAO,GAAG,OAAO,GAAG,KAAK,GAAG,EAAE,CAAA;IAC9B,OAAO,KAAK,GAAG,IAAI,GAAG,OAAO,GAAG,GAAG,CAAA;AACvC,CAAC;AAGD,SAAgB,aAAa,CAAC,MAAa;IACvC,IAAI,KAAK,GAAG,CAAC,CAAA;IACb,KAAK,IAAI,KAAK,IAAI,MAAM,EAAE,CAAC;QACvB,KAAK,IAAI,GAAG,IAAI,KAAK,EAAE,CAAC;YACpB,IAAI,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,CAAA;YACpB,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;gBACrB,KAAK,IAAI,GAAG,CAAC,MAAM,CAAA;YACvB,CAAC;QACL,CAAC;IACL,CAAC;IACD,OAAO,KAAK,CAAA;AAChB,CAAC;AAGD,SAAgB,UAAU,CAAC,IAAmB;IAC1C,OAAO,GAAG,IAAI,CAAC,MAAM,IAAI,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAA;AACnD,CAAC;AAGD,SAAgB,SAAS,CAAC,IAAY;IAClC,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACxB,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;IAC3B,CAAC;SAAM,CAAC;QACJ,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;IAC3B,CAAC;AACL,CAAC"}
package/package.json CHANGED
@@ -1,9 +1,9 @@
1
1
  {
2
2
  "name": "@subsquid/batch-processor",
3
- "version": "0.1.0-portal-api.a8e10e",
3
+ "version": "0.1.0",
4
4
  "description": "ETL processor",
5
5
  "license": "GPL-3.0-or-later",
6
- "repository": "git@github.com:subsquid/squid.git",
6
+ "repository": "git@github.com:subsquid/squid-sdk.git",
7
7
  "publishConfig": {
8
8
  "access": "public",
9
9
  "registry": "https://registry.npmjs.org/"
@@ -14,13 +14,11 @@
14
14
  ],
15
15
  "main": "lib/index.js",
16
16
  "dependencies": {
17
- "@subsquid/logger": "^1.4.0",
17
+ "@subsquid/logger": "^1.5.0",
18
18
  "@subsquid/util-internal": "^3.2.0",
19
+ "@subsquid/util-internal-processor-tools": "^4.4.0",
19
20
  "@subsquid/util-internal-counters": "^1.3.2",
20
- "@subsquid/util-internal-prometheus-server": "^1.3.0",
21
- "@subsquid/util-internal-range": "^0.3.0",
22
- "prom-client": "^14.2.0",
23
- "@subsquid/util-internal-data-source": "0.0.1-portal-api.a8e10e"
21
+ "@subsquid/util-internal-range": "^0.3.0"
24
22
  },
25
23
  "devDependencies": {
26
24
  "@types/node": "^18.18.14",
package/src/database.ts CHANGED
@@ -14,14 +14,11 @@ export interface FinalTxInfo {
14
14
 
15
15
  export interface FinalDatabase<S> {
16
16
  supportsHotBlocks?: false
17
- connect(): Promise<FinalDatabaseState>
17
+ connect(): Promise<HashAndHeight>
18
18
  transact(info: FinalTxInfo, cb: (store: S) => Promise<void>): Promise<void>
19
19
  }
20
20
 
21
21
 
22
- export interface FinalDatabaseState extends HashAndHeight {}
23
-
24
-
25
22
  export interface HotTxInfo {
26
23
  finalizedHead: HashAndHeight
27
24
  baseHead: HashAndHeight
@@ -33,8 +30,12 @@ export interface HotDatabase<S> {
33
30
  supportsHotBlocks: true
34
31
  connect(): Promise<HotDatabaseState>
35
32
  transact(info: FinalTxInfo, cb: (store: S) => Promise<void>): Promise<void>
33
+ /**
34
+ * @deprecated
35
+ */
36
+ transactHot(info: HotTxInfo, cb: (store: S, block: HashAndHeight) => Promise<void>): Promise<void>
36
37
 
37
- transactHot2(
38
+ transactHot2?(
38
39
  info: HotTxInfo,
39
40
  cb: (store: S, blockSliceStart: number, blockSliceEnd: number) => Promise<void>
40
41
  ): Promise<void>
@@ -49,4 +50,4 @@ export interface HotDatabaseState extends HashAndHeight {
49
50
  export interface HashAndHeight {
50
51
  height: number
51
52
  hash: string
52
- }
53
+ }
@@ -0,0 +1,9 @@
1
+ import type {FiniteRange} from '@subsquid/util-internal-range'
2
+
3
+
4
+ export interface DataSource<B> {
5
+ getFinalizedHeight(): Promise<number>
6
+ getBlockHash(height: number): Promise<string | undefined>
7
+ getBlockStream(fromBlock?: number): AsyncIterable<B[]>
8
+ getBlocksCountInRange?(range: FiniteRange): number
9
+ }
package/src/index.ts CHANGED
@@ -1,2 +1,3 @@
1
1
  export * from './database'
2
+ export * from './datasource'
2
3
  export * from './run'
package/src/run.ts CHANGED
@@ -1,15 +1,16 @@
1
1
  import {createLogger} from '@subsquid/logger'
2
- import {last, maybeLast, runProgram, Throttler} from '@subsquid/util-internal'
3
- import {createPrometheusServer} from '@subsquid/util-internal-prometheus-server'
4
- import * as prom from 'prom-client'
5
- import {HashAndHeight, Database, HotDatabaseState} from './database'
6
- import {Metrics} from './metrics'
7
- import {DataSource, isForkException, BlockRef, type BlockBatch} from '@subsquid/util-internal-data-source'
2
+ import {last, runProgram, Throttler} from '@subsquid/util-internal'
3
+ import {PrometheusServer, RunnerMetrics} from '@subsquid/util-internal-processor-tools'
4
+ import {Database, HashAndHeight} from './database'
5
+ import {DataSource} from './datasource'
8
6
  import {formatHead, getItemsCount} from './util'
9
- import assert from 'assert'
7
+
8
+ export {PrometheusServer}
9
+
10
10
 
11
11
  const log = createLogger('sqd:batch-processor')
12
12
 
13
+
13
14
  export interface DataHandlerContext<Block, Store> {
14
15
  /**
15
16
  * Storage interface provided by the database
@@ -25,15 +26,16 @@ export interface DataHandlerContext<Block, Store> {
25
26
  isHead: boolean
26
27
  }
27
28
 
28
- export interface BlockBase {
29
- header: BlockRef
29
+
30
+ interface BlockBase {
31
+ header: HashAndHeight
30
32
  }
31
33
 
32
- interface ProcessorState {
33
- finalizedHead: BlockRef | undefined
34
- unfinalizedHeads: BlockRef[]
34
+ interface RunOptions {
35
+ prometheus?: PrometheusServer
35
36
  }
36
37
 
38
+
37
39
  /**
38
40
  * Run data processing.
39
41
  *
@@ -51,194 +53,123 @@ interface ProcessorState {
51
53
  export function run<Block extends BlockBase, Store>(
52
54
  src: DataSource<Block>,
53
55
  db: Database<Store>,
54
- dataHandler: (ctx: DataHandlerContext<Block, Store>) => Promise<void>
56
+ dataHandler: (ctx: DataHandlerContext<Block, Store>) => Promise<void>,
57
+ opts?: RunOptions
55
58
  ): void {
56
- runProgram(
57
- () => {
58
- return new Processor(src, db, dataHandler).run()
59
- },
60
- (err) => {
59
+ runProgram(() => {
60
+ return new Processor(src, db, dataHandler, opts).run()
61
+ }, err => {
61
62
  log.fatal(err)
62
- }
63
- )
63
+ })
64
64
  }
65
65
 
66
+
66
67
  class Processor<B extends BlockBase, S> {
67
- private metrics = new Metrics()
68
+ private metrics: RunnerMetrics
69
+ private chainHeight: Throttler<number>
68
70
  private statusReportTimer?: any
69
71
  private hasStatusNews = false
70
72
 
71
73
  constructor(
72
74
  private src: DataSource<B>,
73
75
  private db: Database<S>,
74
- private handler: (ctx: DataHandlerContext<B, S>) => Promise<void>
75
- ) {}
76
+ private handler: (ctx: DataHandlerContext<B, S>) => Promise<void>,
77
+ private readonly opts?: RunOptions
78
+ ) {
79
+ this.metrics = new RunnerMetrics(
80
+ src.getBlocksCountInRange?.bind(src) ?? ((range) => Math.max(0, range.to - range.from + 1)),
81
+ )
82
+ this.chainHeight = new Throttler(() => this.src.getFinalizedHeight(), 30_000)
83
+ }
76
84
 
77
85
  async run(): Promise<void> {
78
- let getHead = this.db.supportsHotBlocks ? this.src.getHead.bind(this.src) : this.src.getFinalizedHead.bind(this.src)
79
- let chainHeight = new Throttler(() => getHead()?.then((r) => r?.number ?? -1), 10_000)
80
-
81
- let state: ProcessorState = {
82
- finalizedHead: undefined,
83
- unfinalizedHeads: [],
84
- }
85
- if (this.db.supportsHotBlocks) {
86
- let dbState = await this.db.connect()
87
- state.finalizedHead = dbState.height < 0 ? undefined : toBlockRef(dbState)
88
- state.unfinalizedHeads = dbState.top.map(toBlockRef)
89
- } else {
90
- let dbState = await this.db.connect()
91
- state.finalizedHead = dbState.height < 0 ? undefined : toBlockRef(dbState)
86
+ let state = await this.db.connect()
87
+ if (state.height >= 0) {
88
+ log.info(`last processed final block was ${state.height}`)
92
89
  }
93
90
 
94
- let head = getStateHead(state)
95
- if (head != null) {
96
- log.info(`last processed block was ${head.number}`)
97
- }
98
- await this.initMetrics(head?.number ?? -1, await chainHeight.get())
99
-
100
- while (true) {
101
- let getStream = this.db.supportsHotBlocks ? this.src.getStream.bind(this.src) : this.src.getFinalizedStream.bind(this.src)
91
+ await this.assertWeAreOnTheSameChain(state)
92
+ await this.initMetrics(state)
102
93
 
103
- head = getStateHead(state)
104
- try {
105
- for await (let data of getStream({after: head})) {
106
- state = await this.processBatch(state, data, await chainHeight.get())
107
- }
108
- } catch (e) {
109
- if (!isForkException(e) || !this.db.supportsHotBlocks) throw e
110
-
111
- let chain = state.finalizedHead
112
- ? [state.finalizedHead, ...state.unfinalizedHeads]
113
- : state.unfinalizedHeads
114
- let rollbackIndex = findRollbackIndex(chain, e.previousBlocks)
115
- if (rollbackIndex === -1) {
116
- if (state.finalizedHead != null) throw new Error('Unable to process fork')
117
- state.unfinalizedHeads = []
118
- } else {
119
- const rollbackHead = chain[rollbackIndex]
120
- log.info(`navigating a fork on a common base ${formatHead(rollbackHead)}`)
121
-
122
- state.unfinalizedHeads = chain.slice(1, rollbackIndex + 1)
123
- }
94
+ for await (let blocks of this.src.getBlockStream(state.height + 1)) {
95
+ if (blocks.length > 0) {
96
+ state = await this.processBatch(state, blocks)
124
97
  }
125
-
126
- break
127
98
  }
128
99
 
129
100
  this.reportFinalStatus()
130
101
  }
131
102
 
132
- private async initMetrics(state: number, chainHeight: number): Promise<void> {
133
- this.updateProgressMetrics(chainHeight, state)
134
- let port = process.env.PROCESSOR_PROMETHEUS_PORT || process.env.PROMETHEUS_PORT
135
- if (port == null) return
136
- prom.collectDefaultMetrics()
137
- this.metrics.install()
138
- let server = await createPrometheusServer(prom.register, port)
139
- log.info(`prometheus metrics are served on port ${server.port}`)
103
+ private async assertWeAreOnTheSameChain(state: HashAndHeight): Promise<void> {
104
+ if (state.height < 0) return
105
+ let hash = await this.src.getBlockHash(state.height)
106
+ if (state.hash === hash) return
107
+ throw new Error(
108
+ `already indexed block ${formatHead(state)} was not found on chain`
109
+ )
140
110
  }
141
111
 
142
- private updateProgressMetrics(chainHeight: number, indexerHeight: number, time?: bigint): void {
143
- this.metrics.setChainHeight(chainHeight)
144
- this.metrics.setLastProcessedBlock(indexerHeight)
145
- let left: number
146
- let processed: number
147
- left = this.metrics.getChainHeight() - this.metrics.getLastProcessedBlock()
148
- processed = this.metrics.getLastProcessedBlock()
149
- this.metrics.updateProgress(processed, left, time)
150
- }
112
+ private async initMetrics(state: HashAndHeight): Promise<void> {
113
+ this.updateProgressMetrics(await this.chainHeight.get(), state)
114
+ let port = process.env.PROCESSOR_PROMETHEUS_PORT || process.env.PROMETHEUS_PORT
151
115
 
152
- private async processBatch(
153
- state: ProcessorState,
154
- data: BlockBatch<B>,
155
- chainHeight: number
156
- ): Promise<ProcessorState> {
157
- let {blocks, finalizedHead: finalizedHeadData} = data
116
+ let prometheusServer: PrometheusServer | undefined
117
+ if (this.opts?.prometheus != null) {
118
+ prometheusServer = this.opts.prometheus
119
+ } else if (port != null) {
120
+ prometheusServer = new PrometheusServer()
121
+ prometheusServer.setPort(port)
122
+ }
123
+ if (prometheusServer == null) return
158
124
 
159
- if (blocks.length === 0) return state
125
+ prometheusServer.addRunnerMetrics(this.metrics)
126
+ let listening = await prometheusServer.serve()
127
+ log.info(`prometheus metrics are served on port ${listening.port}`)
128
+ }
160
129
 
161
- let prevHead = getStateHead(state)
130
+ private updateProgressMetrics(chainHeight: number, state: HashAndHeight, time?: bigint): void {
131
+ this.metrics.setChainHeight(chainHeight)
132
+ this.metrics.setLastProcessedBlock(state.height)
133
+ this.metrics.updateProgress(time)
134
+ }
162
135
 
163
- // Validate data continuity
164
- if (prevHead && blocks.length > 0 && prevHead.number >= blocks[0].header.number) {
165
- throw new Error('Data is not continuous')
166
- }
136
+ private async processBatch(prevHead: HashAndHeight, blocks: B[]): Promise<HashAndHeight> {
137
+ let chainHeight = await this.chainHeight.get()
167
138
 
168
- let unfinalizedIndex = 0
169
- if (finalizedHeadData?.number != null) {
170
- unfinalizedIndex = blocks.findIndex((b) => b.header.number > finalizedHeadData.number)
139
+ let nextHead = {
140
+ hash: last(blocks).header.hash,
141
+ height: last(blocks).header.height
171
142
  }
172
143
 
173
- let nextHead = last(blocks).header
174
- let isOnTop = nextHead.number >= chainHeight
144
+ let isOnTop = nextHead.height >= chainHeight
175
145
 
176
146
  let mappingStartTime = process.hrtime.bigint()
177
147
 
178
- // All new blocks are finalized
179
- if (unfinalizedIndex < 0) {
180
- const finalizedRef = blocks[blocks.length - 1].header
181
- state.finalizedHead = {number: finalizedRef.number, hash: finalizedRef.hash}
182
- state.unfinalizedHeads = []
183
-
184
- await this.db.transact(
185
- {
186
- prevHead: prevHead ? toHashAndHeight(prevHead) : {height: -1, hash: '0x'},
187
- nextHead: toHashAndHeight(nextHead),
188
- isOnTop,
189
- },
190
- (store) => {
191
- return this.handler({
192
- store,
193
- blocks,
194
- isHead: isOnTop,
195
- })
196
- }
197
- )
198
- } else {
199
- assert(this.db.supportsHotBlocks)
200
-
201
- let finalizedRef: BlockRef | undefined = blocks[unfinalizedIndex - 1]?.header
202
- if (finalizedHeadData?.hash && finalizedHeadData?.number != null) {
203
- finalizedRef = {hash: finalizedHeadData.hash, number: finalizedHeadData.number}
204
- }
205
- state.finalizedHead = finalizedRef ?? state.finalizedHead
206
-
207
- // Finalize all hot heads that are older than the cold head
208
- if (state.finalizedHead) {
209
- let finalizeIndex = state.unfinalizedHeads.findIndex((h) => h.number > state.finalizedHead!.number)
210
- state.unfinalizedHeads = finalizeIndex < 0 ? [] : state.unfinalizedHeads.slice(finalizeIndex)
211
- }
212
-
213
- // Process unfinalized blocks
214
- for (let i = unfinalizedIndex; i < blocks.length; i++) {
215
- state.unfinalizedHeads.push({number: blocks[i].header.number, hash: blocks[i].header.hash})
216
- }
217
-
218
- await this.db.transactHot2(
219
- {
220
- finalizedHead: finalizedHeadData ? toHashAndHeight(finalizedHeadData) : {height: -1, hash: '0x'},
221
- baseHead: prevHead ? toHashAndHeight(prevHead) : {height: -1, hash: '0x'},
222
- newBlocks: data.blocks.map((b) => toHashAndHeight(b.header)),
223
- },
224
- (store, start, end) => {
225
- return this.handler({
226
- store,
227
- blocks: blocks.slice(start, end),
228
- isHead: isOnTop,
229
- })
230
- }
231
- )
232
- }
148
+ await this.db.transact({
149
+ prevHead,
150
+ nextHead,
151
+ isOnTop
152
+ }, store => {
153
+ return this.handler({
154
+ store,
155
+ blocks,
156
+ isHead: isOnTop
157
+ })
158
+ })
233
159
 
234
160
  let mappingEndTime = process.hrtime.bigint()
235
161
 
236
- this.updateProgressMetrics(chainHeight, nextHead.number, mappingEndTime)
237
- this.metrics.registerBatch(blocks.length, getItemsCount(blocks), mappingStartTime, mappingEndTime)
162
+ this.updateProgressMetrics(chainHeight, nextHead, mappingEndTime)
163
+ this.metrics.registerBatch(
164
+ blocks.length,
165
+ getItemsCount(blocks),
166
+ mappingStartTime,
167
+ mappingEndTime
168
+ )
238
169
 
239
170
  this.reportStatus()
240
171
 
241
- return state
172
+ return nextHead
242
173
  }
243
174
 
244
175
  private reportStatus(): void {
@@ -250,7 +181,7 @@ class Processor<B extends BlockBase, S> {
250
181
  this.hasStatusNews = false
251
182
  this.reportStatus()
252
183
  }
253
- }, 5_000)
184
+ }, 5000)
254
185
  } else {
255
186
  this.hasStatusNews = true
256
187
  }
@@ -266,46 +197,3 @@ class Processor<B extends BlockBase, S> {
266
197
  }
267
198
  }
268
199
  }
269
-
270
- function findRollbackIndex(currentChain: BlockRef[], forkChain: BlockRef[]): number {
271
- let currentIndex = 0
272
- let forkIndex = 0
273
- let lastCommonIndex = -1
274
-
275
- while (currentIndex < currentChain.length && forkIndex < forkChain.length) {
276
- const currentBlock = currentChain[currentIndex]
277
- const forkBlock = forkChain[forkIndex]
278
-
279
- if (currentBlock.number > forkBlock.number) {
280
- currentIndex++
281
- continue
282
- }
283
-
284
- if (currentBlock.number < forkBlock.number) {
285
- forkIndex++
286
- continue
287
- }
288
-
289
- if (currentBlock.hash !== forkBlock.hash) {
290
- return lastCommonIndex
291
- }
292
-
293
- lastCommonIndex = currentIndex
294
- currentIndex++
295
- forkIndex++
296
- }
297
-
298
- return lastCommonIndex
299
- }
300
-
301
- function toHashAndHeight(ref: BlockRef): HashAndHeight {
302
- return {height: ref.number, hash: ref.hash}
303
- }
304
-
305
- function toBlockRef(hashAndHeight: HashAndHeight): BlockRef {
306
- return {number: hashAndHeight.height, hash: hashAndHeight.hash}
307
- }
308
-
309
- function getStateHead(state: ProcessorState): BlockRef | undefined {
310
- return maybeLast(state.unfinalizedHeads) ?? state.finalizedHead
311
- }
package/src/util.ts CHANGED
@@ -1,4 +1,3 @@
1
- import type {BlockRef} from '@subsquid/util-internal-data-source'
2
1
  import {HashAndHeight} from './database'
3
2
 
4
3
 
@@ -30,8 +29,8 @@ export function getItemsCount(blocks: any[]): number {
30
29
  }
31
30
 
32
31
 
33
- export function formatHead(head: BlockRef): string {
34
- return `${head.number}#${shortHash(head.hash)}`
32
+ export function formatHead(head: HashAndHeight): string {
33
+ return `${head.height}#${shortHash(head.hash)}`
35
34
  }
36
35
 
37
36
 
package/lib/metrics.d.ts DELETED
@@ -1,21 +0,0 @@
1
- export declare class Metrics {
2
- private chainHeight;
3
- private lastBlock;
4
- private mappingSpeed;
5
- private mappingItemSpeed;
6
- private blockProgress;
7
- setChainHeight(height: number): void;
8
- setLastProcessedBlock(height: number): void;
9
- updateProgress(processed: number, left: number, time?: bigint): void;
10
- registerBatch(batchSize: number, batchItemSize: number, batchMappingStartTime: bigint, batchMappingEndTime: bigint): void;
11
- getChainHeight(): number;
12
- getLastProcessedBlock(): number;
13
- getSyncSpeed(): number;
14
- getSyncEtaSeconds(): number;
15
- getSyncRatio(): number;
16
- getMappingSpeed(): number;
17
- getMappingItemSpeed(): number;
18
- getStatusLine(): string;
19
- install(): void;
20
- }
21
- //# sourceMappingURL=metrics.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../src/metrics.ts"],"names":[],"mappings":"AAKA,qBAAa,OAAO;IAChB,OAAO,CAAC,WAAW,CAAK;IACxB,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,YAAY,CAA6B;IACjD,OAAO,CAAC,gBAAgB,CAA6B;IACrD,OAAO,CAAC,aAAa,CAAkD;IAEvE,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAIpC,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAK3C,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI;IAKpE,aAAa,CACT,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,MAAM,EACrB,qBAAqB,EAAE,MAAM,EAC7B,mBAAmB,EAAE,MAAM,GAC5B,IAAI;IAKP,cAAc,IAAI,MAAM;IAIxB,qBAAqB,IAAI,MAAM;IAI/B,YAAY,IAAI,MAAM;IAItB,iBAAiB,IAAI,MAAM;IAI3B,YAAY,IAAI,MAAM;IAItB,eAAe,IAAI,MAAM;IAIzB,mBAAmB,IAAI,MAAM;IAI7B,aAAa,IAAI,MAAM;IAQvB,OAAO,IAAI,IAAI;CA+BlB"}
package/lib/metrics.js DELETED
@@ -1,92 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.Metrics = void 0;
4
- const util_internal_counters_1 = require("@subsquid/util-internal-counters");
5
- const prom_client_1 = require("prom-client");
6
- const util_1 = require("./util");
7
- class Metrics {
8
- constructor() {
9
- this.chainHeight = -1;
10
- this.lastBlock = -1;
11
- this.mappingSpeed = new util_internal_counters_1.Speed({ windowSize: 5 });
12
- this.mappingItemSpeed = new util_internal_counters_1.Speed({ windowSize: 5 });
13
- this.blockProgress = new util_internal_counters_1.Progress({ initialValue: 0, windowSize: 20 });
14
- }
15
- setChainHeight(height) {
16
- this.chainHeight = Math.max(height, this.lastBlock);
17
- }
18
- setLastProcessedBlock(height) {
19
- this.lastBlock = height;
20
- this.chainHeight = Math.max(this.chainHeight, this.lastBlock);
21
- }
22
- updateProgress(processed, left, time) {
23
- this.blockProgress.setTargetValue(processed + left);
24
- this.blockProgress.setCurrentValue(processed, time);
25
- }
26
- registerBatch(batchSize, batchItemSize, batchMappingStartTime, batchMappingEndTime) {
27
- this.mappingSpeed.push(batchSize, batchMappingStartTime, batchMappingEndTime);
28
- this.mappingItemSpeed.push(batchItemSize || 1, batchMappingStartTime, batchMappingEndTime);
29
- }
30
- getChainHeight() {
31
- return this.chainHeight;
32
- }
33
- getLastProcessedBlock() {
34
- return this.lastBlock;
35
- }
36
- getSyncSpeed() {
37
- return this.blockProgress.speed();
38
- }
39
- getSyncEtaSeconds() {
40
- return this.blockProgress.eta();
41
- }
42
- getSyncRatio() {
43
- return this.blockProgress.ratio();
44
- }
45
- getMappingSpeed() {
46
- return this.mappingSpeed.speed();
47
- }
48
- getMappingItemSpeed() {
49
- return this.mappingItemSpeed.speed();
50
- }
51
- getStatusLine() {
52
- return `${this.lastBlock} / ${this.chainHeight}, ` +
53
- `rate: ${Math.round(this.getSyncSpeed())} blocks/sec, ` +
54
- `mapping: ${Math.round(this.getMappingSpeed())} blocks/sec, ` +
55
- `${Math.round(this.getMappingItemSpeed())} items/sec, ` +
56
- `eta: ${(0, util_1.timeInterval)(this.getSyncEtaSeconds())}`;
57
- }
58
- install() {
59
- new prom_client_1.Gauge({
60
- name: 'sqd_processor_chain_height',
61
- help: 'Chain height of the data source',
62
- collect: collect(() => this.getChainHeight())
63
- });
64
- new prom_client_1.Gauge({
65
- name: 'sqd_processor_last_block',
66
- help: 'Last processed block',
67
- collect: collect(() => this.getLastProcessedBlock())
68
- });
69
- new prom_client_1.Gauge({
70
- name: 'sqd_processor_mapping_blocks_per_second',
71
- help: 'Mapping performance',
72
- collect: collect(() => this.getMappingSpeed())
73
- });
74
- new prom_client_1.Gauge({
75
- name: 'sqd_processor_sync_eta_seconds',
76
- help: 'Estimated time until all required blocks will be processed or until the chain height will be reached',
77
- collect: collect(() => this.getSyncEtaSeconds())
78
- });
79
- new prom_client_1.Gauge({
80
- name: 'sqd_processor_sync_ratio',
81
- help: 'Percentage of processed blocks',
82
- collect: collect(() => this.getSyncRatio())
83
- });
84
- }
85
- }
86
- exports.Metrics = Metrics;
87
- function collect(fn) {
88
- return function () {
89
- this.set(fn());
90
- };
91
- }
92
- //# sourceMappingURL=metrics.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"metrics.js","sourceRoot":"","sources":["../src/metrics.ts"],"names":[],"mappings":"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"}
package/src/metrics.ts DELETED
@@ -1,111 +0,0 @@
1
- import {Progress, Speed} from '@subsquid/util-internal-counters'
2
- import {Gauge} from 'prom-client'
3
- import {timeInterval} from './util'
4
-
5
-
6
- export class Metrics {
7
- private chainHeight = -1
8
- private lastBlock = -1
9
- private mappingSpeed = new Speed({windowSize: 5})
10
- private mappingItemSpeed = new Speed({windowSize: 5})
11
- private blockProgress = new Progress({initialValue: 0, windowSize: 20})
12
-
13
- setChainHeight(height: number): void {
14
- this.chainHeight = Math.max(height, this.lastBlock)
15
- }
16
-
17
- setLastProcessedBlock(height: number): void {
18
- this.lastBlock = height
19
- this.chainHeight = Math.max(this.chainHeight, this.lastBlock)
20
- }
21
-
22
- updateProgress(processed: number, left: number, time?: bigint): void {
23
- this.blockProgress.setTargetValue(processed + left)
24
- this.blockProgress.setCurrentValue(processed, time)
25
- }
26
-
27
- registerBatch(
28
- batchSize: number,
29
- batchItemSize: number,
30
- batchMappingStartTime: bigint,
31
- batchMappingEndTime: bigint,
32
- ): void {
33
- this.mappingSpeed.push(batchSize, batchMappingStartTime, batchMappingEndTime)
34
- this.mappingItemSpeed.push(batchItemSize || 1, batchMappingStartTime, batchMappingEndTime)
35
- }
36
-
37
- getChainHeight(): number {
38
- return this.chainHeight
39
- }
40
-
41
- getLastProcessedBlock(): number {
42
- return this.lastBlock
43
- }
44
-
45
- getSyncSpeed(): number {
46
- return this.blockProgress.speed()
47
- }
48
-
49
- getSyncEtaSeconds(): number {
50
- return this.blockProgress.eta()
51
- }
52
-
53
- getSyncRatio(): number {
54
- return this.blockProgress.ratio()
55
- }
56
-
57
- getMappingSpeed(): number {
58
- return this.mappingSpeed.speed()
59
- }
60
-
61
- getMappingItemSpeed(): number {
62
- return this.mappingItemSpeed.speed()
63
- }
64
-
65
- getStatusLine(): string {
66
- return `${this.lastBlock} / ${this.chainHeight}, ` +
67
- `rate: ${Math.round(this.getSyncSpeed())} blocks/sec, ` +
68
- `mapping: ${Math.round(this.getMappingSpeed())} blocks/sec, ` +
69
- `${Math.round(this.getMappingItemSpeed())} items/sec, ` +
70
- `eta: ${timeInterval(this.getSyncEtaSeconds())}`
71
- }
72
-
73
- install(): void {
74
- new Gauge({
75
- name: 'sqd_processor_chain_height',
76
- help: 'Chain height of the data source',
77
- collect: collect(() => this.getChainHeight())
78
- })
79
-
80
- new Gauge({
81
- name: 'sqd_processor_last_block',
82
- help: 'Last processed block',
83
- collect: collect(() => this.getLastProcessedBlock())
84
- })
85
-
86
- new Gauge({
87
- name: 'sqd_processor_mapping_blocks_per_second',
88
- help: 'Mapping performance',
89
- collect: collect(() => this.getMappingSpeed())
90
- })
91
-
92
- new Gauge({
93
- name: 'sqd_processor_sync_eta_seconds',
94
- help: 'Estimated time until all required blocks will be processed or until the chain height will be reached',
95
- collect: collect(() => this.getSyncEtaSeconds())
96
- })
97
-
98
- new Gauge({
99
- name: 'sqd_processor_sync_ratio',
100
- help: 'Percentage of processed blocks',
101
- collect: collect(() => this.getSyncRatio())
102
- })
103
- }
104
- }
105
-
106
-
107
- function collect(fn: () => number) {
108
- return function(this: Gauge<string>) {
109
- this.set(fn())
110
- }
111
- }