@subql/node-ethereum 0.4.1-9 → 0.4.1-storeCache-0.0.4

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.
Files changed (100) hide show
  1. package/CHANGELOG.md +1 -0
  2. package/README.md +3 -0
  3. package/dist/.tsbuildinfo +1 -1
  4. package/dist/ethereum/api.ethereum.d.ts +4 -1
  5. package/dist/ethereum/api.ethereum.js +31 -5
  6. package/dist/ethereum/api.ethereum.js.map +1 -1
  7. package/dist/ethereum/api.service.ethereum.js +1 -1
  8. package/dist/ethereum/api.service.ethereum.js.map +1 -1
  9. package/dist/ethereum/ethers/json-rpc-batch-provider.d.ts +21 -0
  10. package/dist/ethereum/ethers/json-rpc-batch-provider.js +102 -0
  11. package/dist/ethereum/ethers/json-rpc-batch-provider.js.map +1 -0
  12. package/dist/ethereum/ethers/json-rpc-provider.d.ts +7 -0
  13. package/dist/ethereum/ethers/json-rpc-provider.js +68 -0
  14. package/dist/ethereum/ethers/json-rpc-provider.js.map +1 -0
  15. package/dist/ethereum/ethers/web/_version.d.ts +1 -0
  16. package/dist/ethereum/ethers/web/_version.js +6 -0
  17. package/dist/ethereum/ethers/web/_version.js.map +1 -0
  18. package/dist/ethereum/ethers/web/geturl.d.ts +3 -0
  19. package/dist/ethereum/ethers/web/geturl.js +116 -0
  20. package/dist/ethereum/ethers/web/geturl.js.map +1 -0
  21. package/dist/ethereum/ethers/web/index.d.ts +49 -0
  22. package/dist/ethereum/ethers/web/index.js +433 -0
  23. package/dist/ethereum/ethers/web/index.js.map +1 -0
  24. package/dist/ethereum/ethers/web/types.d.ts +26 -0
  25. package/dist/ethereum/ethers/web/types.js +4 -0
  26. package/dist/ethereum/ethers/web/types.js.map +1 -0
  27. package/dist/ethereum/utils.ethereum.js +7 -5
  28. package/dist/ethereum/utils.ethereum.js.map +1 -1
  29. package/dist/indexer/blockDispatcher/block-dispatcher.service.d.ts +8 -15
  30. package/dist/indexer/blockDispatcher/block-dispatcher.service.js +20 -108
  31. package/dist/indexer/blockDispatcher/block-dispatcher.service.js.map +1 -1
  32. package/dist/indexer/blockDispatcher/ethereum-block-dispatcher.d.ts +4 -0
  33. package/dist/indexer/blockDispatcher/ethereum-block-dispatcher.js +5 -0
  34. package/dist/indexer/blockDispatcher/ethereum-block-dispatcher.js.map +1 -0
  35. package/dist/indexer/blockDispatcher/index.d.ts +2 -2
  36. package/dist/indexer/blockDispatcher/index.js.map +1 -1
  37. package/dist/indexer/blockDispatcher/worker-block-dispatcher.service.d.ts +12 -17
  38. package/dist/indexer/blockDispatcher/worker-block-dispatcher.service.js +48 -134
  39. package/dist/indexer/blockDispatcher/worker-block-dispatcher.service.js.map +1 -1
  40. package/dist/indexer/dynamic-ds.service.d.ts +3 -22
  41. package/dist/indexer/dynamic-ds.service.js +4 -91
  42. package/dist/indexer/dynamic-ds.service.js.map +1 -1
  43. package/dist/indexer/fetch.module.js +24 -6
  44. package/dist/indexer/fetch.module.js.map +1 -1
  45. package/dist/indexer/fetch.service.d.ts +3 -3
  46. package/dist/indexer/fetch.service.js +40 -39
  47. package/dist/indexer/fetch.service.js.map +1 -1
  48. package/dist/indexer/indexer.manager.d.ts +4 -16
  49. package/dist/indexer/indexer.manager.js +22 -61
  50. package/dist/indexer/indexer.manager.js.map +1 -1
  51. package/dist/indexer/indexer.module.js +25 -2
  52. package/dist/indexer/indexer.module.js.map +1 -1
  53. package/dist/indexer/project.service.d.ts +4 -10
  54. package/dist/indexer/project.service.js +45 -100
  55. package/dist/indexer/project.service.js.map +1 -1
  56. package/dist/indexer/sandbox.service.js +6 -1
  57. package/dist/indexer/sandbox.service.js.map +1 -1
  58. package/dist/indexer/unfinalizedBlocks.service.d.ts +12 -12
  59. package/dist/indexer/unfinalizedBlocks.service.js +33 -38
  60. package/dist/indexer/unfinalizedBlocks.service.js.map +1 -1
  61. package/dist/indexer/unfinalizedBlocks.spec.js +41 -34
  62. package/dist/indexer/unfinalizedBlocks.spec.js.map +1 -1
  63. package/dist/indexer/worker/worker.d.ts +22 -8
  64. package/dist/indexer/worker/worker.js +14 -7
  65. package/dist/indexer/worker/worker.js.map +1 -1
  66. package/dist/indexer/worker/worker.service.d.ts +2 -2
  67. package/dist/indexer/worker/worker.service.js +11 -4
  68. package/dist/indexer/worker/worker.service.js.map +1 -1
  69. package/dist/indexer/worker/worker.unfinalizedBlocks.service.d.ts +11 -0
  70. package/dist/indexer/worker/worker.unfinalizedBlocks.service.js +32 -0
  71. package/dist/indexer/worker/worker.unfinalizedBlocks.service.js.map +1 -0
  72. package/dist/init.js +2 -2
  73. package/dist/init.js.map +1 -1
  74. package/dist/meta/meta.module.js +8 -0
  75. package/dist/meta/meta.module.js.map +1 -1
  76. package/dist/meta/meta.service.d.ts +18 -3
  77. package/dist/meta/meta.service.js +89 -5
  78. package/dist/meta/meta.service.js.map +1 -1
  79. package/dist/subcommands/forceClean.service.js +8 -4
  80. package/dist/subcommands/forceClean.service.js.map +1 -1
  81. package/dist/subcommands/reindex.init.js +5 -1
  82. package/dist/subcommands/reindex.init.js.map +1 -1
  83. package/dist/subcommands/reindex.module.js +8 -0
  84. package/dist/subcommands/reindex.module.js.map +1 -1
  85. package/dist/subcommands/reindex.service.d.ts +4 -1
  86. package/dist/subcommands/reindex.service.js +21 -10
  87. package/dist/subcommands/reindex.service.js.map +1 -1
  88. package/dist/utils/project.js.map +1 -1
  89. package/dist/utils/reindex.d.ts +2 -1
  90. package/dist/utils/reindex.js +6 -2
  91. package/dist/utils/reindex.js.map +1 -1
  92. package/dist/utils/string.js +10 -2
  93. package/dist/utils/string.js.map +1 -1
  94. package/dist/yargs.d.ts +85 -53
  95. package/dist/yargs.js +103 -71
  96. package/dist/yargs.js.map +1 -1
  97. package/package.json +7 -7
  98. package/dist/indexer/blockDispatcher/base-block-dispatcher.d.ts +0 -40
  99. package/dist/indexer/blockDispatcher/base-block-dispatcher.js +0 -99
  100. package/dist/indexer/blockDispatcher/base-block-dispatcher.js.map +0 -1
package/dist/init.js CHANGED
@@ -8,7 +8,6 @@ const common_1 = require("@subql/common");
8
8
  const node_core_1 = require("@subql/node-core");
9
9
  const app_module_1 = require("./app.module");
10
10
  const fetch_service_1 = require("./indexer/fetch.service");
11
- const project_service_1 = require("./indexer/project.service");
12
11
  const yargs_1 = require("./yargs");
13
12
  const pjson = require('../package.json');
14
13
  const { argv } = yargs_1.yargsOptions;
@@ -35,13 +34,14 @@ async function bootstrap() {
35
34
  logger: debug ? new node_core_1.NestLogger() : false,
36
35
  });
37
36
  await app.init();
38
- const projectService = app.get(project_service_1.ProjectService);
37
+ const projectService = app.get('IProjectService');
39
38
  const fetchService = app.get(fetch_service_1.FetchService);
40
39
  const apiService = app.get(node_core_1.ApiService);
41
40
  // Initialise async services, we do this here rather than in factories, so we can capture one off events
42
41
  await apiService.init();
43
42
  await projectService.init();
44
43
  await fetchService.init(projectService.startHeight);
44
+ app.enableShutdownHooks();
45
45
  await app.listen(port);
46
46
  logger.info(`Node started on port: ${port}`);
47
47
  }
package/dist/init.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"init.js","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":";AAAA,gEAAgE;AAChE,sCAAsC;;;AAEtC,uCAA2C;AAC3C,0CAAkD;AAClD,gDAAqE;AACrE,6CAAyC;AACzC,2DAAuD;AACvD,+DAA2D;AAC3D,mCAAuC;AACvC,MAAM,KAAK,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;AAEzC,MAAM,EAAE,IAAI,EAAE,GAAG,oBAAY,CAAC;AAE9B,MAAM,YAAY,GAAG,IAAI,CAAC;AAC1B,MAAM,MAAM,GAAG,IAAA,qBAAS,EAAC,YAAY,CAAC,CAAC;AAEhC,KAAK,UAAU,SAAS;;IAC7B,MAAM,CAAC,IAAI,CAAC,WAAW,KAAK,CAAC,IAAI,eAAe,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IACjE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;IAEzB,MAAM,QAAQ,GAAG,CAAC,CAAM,EAAE,EAAE;QAC1B,MAAM,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;QACtB,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7B,CAAC,CAAC;IAEF,MAAM,IAAI,GAAG,MAAA,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,mCAAI,CAAC,MAAM,IAAA,0BAAiB,EAAC,YAAY,CAAC,CAAC,CAAC;IAC5E,IAAI,CAAC,IAAI,EAAE;QACT,MAAM,CAAC,KAAK,CACV,wDAAwD,IAAI,KAC1D,IAAI,GAAG,EACT,iEAAiE,CAClE,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;KACjB;IAED,IAAI,IAAI,CAAC,MAAM,EAAE;QACf,MAAM,CAAC,IAAI,CACT,mHAAmH,CACpH,CAAC;KACH;IAED,IAAI;QACF,MAAM,GAAG,GAAG,MAAM,kBAAW,CAAC,MAAM,CAAC,sBAAS,EAAE;YAC9C,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,sBAAU,EAAE,CAAC,CAAC,CAAC,KAAK;SACzC,CAAC,CAAC;QACH,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;QAEjB,MAAM,cAAc,GAAG,GAAG,CAAC,GAAG,CAAC,gCAAc,CAAC,CAAC;QAC/C,MAAM,YAAY,GAAG,GAAG,CAAC,GAAG,CAAC,4BAAY,CAAC,CAAC;QAC3C,MAAM,UAAU,GAAG,GAAG,CAAC,GAAG,CAAC,sBAAU,CAAC,CAAC;QAEvC,wGAAwG;QACxG,MAAM,UAAU,CAAC,IAAI,EAAE,CAAC;QACxB,MAAM,cAAc,CAAC,IAAI,EAAE,CAAC;QAC5B,MAAM,YAAY,CAAC,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC;QAEpD,MAAM,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAEvB,MAAM,CAAC,IAAI,CAAC,yBAAyB,IAAI,EAAE,CAAC,CAAC;KAC9C;IAAC,OAAO,CAAC,EAAE;QACV,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,sBAAsB,CAAC,CAAC;QACxC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;KACjB;AACH,CAAC;AA/CD,8BA+CC","sourcesContent":["// Copyright 2020-2022 OnFinality Limited authors & contributors\n// SPDX-License-Identifier: Apache-2.0\n\nimport { NestFactory } from '@nestjs/core';\nimport { findAvailablePort } from '@subql/common';\nimport { getLogger, ApiService, NestLogger } from '@subql/node-core';\nimport { AppModule } from './app.module';\nimport { FetchService } from './indexer/fetch.service';\nimport { ProjectService } from './indexer/project.service';\nimport { yargsOptions } from './yargs';\nconst pjson = require('../package.json');\n\nconst { argv } = yargsOptions;\n\nconst DEFAULT_PORT = 3000;\nconst logger = getLogger('subql-node');\n\nexport async function bootstrap() {\n logger.info(`Current ${pjson.name} version is ${pjson.version}`);\n const debug = argv.debug;\n\n const validate = (x: any) => {\n const p = parseInt(x);\n return isNaN(p) ? null : p;\n };\n\n const port = validate(argv.port) ?? (await findAvailablePort(DEFAULT_PORT));\n if (!port) {\n logger.error(\n `Unable to find available port (tried ports in range (${port}..${\n port + 10\n })). Try setting a free port manually by setting the --port flag`,\n );\n process.exit(1);\n }\n\n if (argv.unsafe) {\n logger.warn(\n 'UNSAFE MODE IS ENABLED. This is not recommended for most projects and will not be supported by our hosted service',\n );\n }\n\n try {\n const app = await NestFactory.create(AppModule, {\n logger: debug ? new NestLogger() : false,\n });\n await app.init();\n\n const projectService = app.get(ProjectService);\n const fetchService = app.get(FetchService);\n const apiService = app.get(ApiService);\n\n // Initialise async services, we do this here rather than in factories, so we can capture one off events\n await apiService.init();\n await projectService.init();\n await fetchService.init(projectService.startHeight);\n\n await app.listen(port);\n\n logger.info(`Node started on port: ${port}`);\n } catch (e) {\n logger.error(e, 'Node failed to start');\n process.exit(1);\n }\n}\n"]}
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":";AAAA,gEAAgE;AAChE,sCAAsC;;;AAEtC,uCAA2C;AAC3C,0CAAkD;AAClD,gDAAqE;AACrE,6CAAyC;AACzC,2DAAuD;AAEvD,mCAAuC;AACvC,MAAM,KAAK,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;AAEzC,MAAM,EAAE,IAAI,EAAE,GAAG,oBAAY,CAAC;AAE9B,MAAM,YAAY,GAAG,IAAI,CAAC;AAC1B,MAAM,MAAM,GAAG,IAAA,qBAAS,EAAC,YAAY,CAAC,CAAC;AAEhC,KAAK,UAAU,SAAS;;IAC7B,MAAM,CAAC,IAAI,CAAC,WAAW,KAAK,CAAC,IAAI,eAAe,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IACjE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;IAEzB,MAAM,QAAQ,GAAG,CAAC,CAAM,EAAE,EAAE;QAC1B,MAAM,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;QACtB,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7B,CAAC,CAAC;IAEF,MAAM,IAAI,GAAG,MAAA,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,mCAAI,CAAC,MAAM,IAAA,0BAAiB,EAAC,YAAY,CAAC,CAAC,CAAC;IAC5E,IAAI,CAAC,IAAI,EAAE;QACT,MAAM,CAAC,KAAK,CACV,wDAAwD,IAAI,KAC1D,IAAI,GAAG,EACT,iEAAiE,CAClE,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;KACjB;IAED,IAAI,IAAI,CAAC,MAAM,EAAE;QACf,MAAM,CAAC,IAAI,CACT,mHAAmH,CACpH,CAAC;KACH;IAED,IAAI;QACF,MAAM,GAAG,GAAG,MAAM,kBAAW,CAAC,MAAM,CAAC,sBAAS,EAAE;YAC9C,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,sBAAU,EAAE,CAAC,CAAC,CAAC,KAAK;SACzC,CAAC,CAAC;QACH,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;QAEjB,MAAM,cAAc,GAAmB,GAAG,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;QAClE,MAAM,YAAY,GAAG,GAAG,CAAC,GAAG,CAAC,4BAAY,CAAC,CAAC;QAC3C,MAAM,UAAU,GAAG,GAAG,CAAC,GAAG,CAAC,sBAAU,CAAC,CAAC;QAEvC,wGAAwG;QACxG,MAAM,UAAU,CAAC,IAAI,EAAE,CAAC;QACxB,MAAM,cAAc,CAAC,IAAI,EAAE,CAAC;QAC5B,MAAM,YAAY,CAAC,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC;QAEpD,GAAG,CAAC,mBAAmB,EAAE,CAAC;QAE1B,MAAM,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAEvB,MAAM,CAAC,IAAI,CAAC,yBAAyB,IAAI,EAAE,CAAC,CAAC;KAC9C;IAAC,OAAO,CAAC,EAAE;QACV,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,sBAAsB,CAAC,CAAC;QACxC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;KACjB;AACH,CAAC;AAjDD,8BAiDC","sourcesContent":["// Copyright 2020-2022 OnFinality Limited authors & contributors\n// SPDX-License-Identifier: Apache-2.0\n\nimport { NestFactory } from '@nestjs/core';\nimport { findAvailablePort } from '@subql/common';\nimport { getLogger, ApiService, NestLogger } from '@subql/node-core';\nimport { AppModule } from './app.module';\nimport { FetchService } from './indexer/fetch.service';\nimport { ProjectService } from './indexer/project.service';\nimport { yargsOptions } from './yargs';\nconst pjson = require('../package.json');\n\nconst { argv } = yargsOptions;\n\nconst DEFAULT_PORT = 3000;\nconst logger = getLogger('subql-node');\n\nexport async function bootstrap(): Promise<void> {\n logger.info(`Current ${pjson.name} version is ${pjson.version}`);\n const debug = argv.debug;\n\n const validate = (x: any) => {\n const p = parseInt(x);\n return isNaN(p) ? null : p;\n };\n\n const port = validate(argv.port) ?? (await findAvailablePort(DEFAULT_PORT));\n if (!port) {\n logger.error(\n `Unable to find available port (tried ports in range (${port}..${\n port + 10\n })). Try setting a free port manually by setting the --port flag`,\n );\n process.exit(1);\n }\n\n if (argv.unsafe) {\n logger.warn(\n 'UNSAFE MODE IS ENABLED. This is not recommended for most projects and will not be supported by our hosted service',\n );\n }\n\n try {\n const app = await NestFactory.create(AppModule, {\n logger: debug ? new NestLogger() : false,\n });\n await app.init();\n\n const projectService: ProjectService = app.get('IProjectService');\n const fetchService = app.get(FetchService);\n const apiService = app.get(ApiService);\n\n // Initialise async services, we do this here rather than in factories, so we can capture one off events\n await apiService.init();\n await projectService.init();\n await fetchService.init(projectService.startHeight);\n\n app.enableShutdownHooks();\n\n await app.listen(port);\n\n logger.info(`Node started on port: ${port}`);\n } catch (e) {\n logger.error(e, 'Node failed to start');\n process.exit(1);\n }\n}\n"]}
@@ -67,6 +67,14 @@ MetaModule = __decorate([
67
67
  name: 'subql_indexer_processed_block_count',
68
68
  help: 'The number of processed block',
69
69
  }),
70
+ (0, nestjs_prometheus_1.makeGaugeProvider)({
71
+ name: 'subql_indexer_store_cache_threshold',
72
+ help: 'Store cache will flush once cache record size excess this threshold',
73
+ }),
74
+ (0, nestjs_prometheus_1.makeGaugeProvider)({
75
+ name: 'subql_indexer_store_cache_records_size',
76
+ help: 'Number of records waiting to flush in store cache',
77
+ }),
70
78
  meta_service_1.MetaService,
71
79
  node_core_1.HealthService,
72
80
  node_core_1.ReadyService,
@@ -1 +1 @@
1
- {"version":3,"file":"meta.module.js","sourceRoot":"","sources":["../../src/meta/meta.module.ts"],"names":[],"mappings":";AAAA,gEAAgE;AAChE,sCAAsC;;;;;;;;;AAEtC,2CAAwC;AACxC,gDAM0B;AAC1B,mEAGqC;AACrC,0DAAsD;AACtD,uDAAmD;AACnD,iDAA6C;AAwDtC,IAAM,UAAU,GAAhB,MAAM,UAAU;CAAG,CAAA;AAAb,UAAU;IAtDtB,IAAA,eAAM,EAAC;QACN,OAAO,EAAE,CAAC,oCAAgB,CAAC,QAAQ,EAAE,EAAE,0BAAW,CAAC;QACnD,WAAW,EAAE,CAAC,gCAAc,EAAE,4BAAgB,EAAE,2BAAe,CAAC;QAChE,SAAS,EAAE;YACT,+BAAmB;YACnB,IAAA,qCAAiB,EAAC;gBAChB,IAAI,EAAE,6BAA6B;gBACnC,IAAI,EAAE,mCAAmC;aAC1C,CAAC;YACF,IAAA,qCAAiB,EAAC;gBAChB,IAAI,EAAE,sCAAsC;gBAC5C,IAAI,EAAE,4CAA4C;aACnD,CAAC;YACF,IAAA,qCAAiB,EAAC;gBAChB,IAAI,EAAE,uCAAuC;gBAC7C,IAAI,EAAE,qCAAqC;aAC5C,CAAC;YACF,IAAA,qCAAiB,EAAC;gBAChB,IAAI,EAAE,sCAAsC;gBAC5C,IAAI,EAAE,iCAAiC;aACxC,CAAC;YACF,IAAA,qCAAiB,EAAC;gBAChB,IAAI,EAAE,mCAAmC;gBACzC,IAAI,EAAE,mCAAmC;aAC1C,CAAC;YACF,IAAA,qCAAiB,EAAC;gBAChB,IAAI,EAAE,iCAAiC;gBACvC,IAAI,EAAE,8BAA8B;aACrC,CAAC;YACF,IAAA,qCAAiB,EAAC;gBAChB,IAAI,EAAE,gCAAgC;gBACtC,IAAI,EAAE,iCAAiC;aACxC,CAAC;YACF,IAAA,qCAAiB,EAAC;gBAChB,IAAI,EAAE,sCAAsC;gBAC5C,IAAI,EAAE,wCAAwC;aAC/C,CAAC;YACF,IAAA,qCAAiB,EAAC;gBAChB,IAAI,EAAE,gCAAgC;gBACtC,IAAI,EAAE,+CAA+C;aACtD,CAAC;YACF,IAAA,qCAAiB,EAAC;gBAChB,IAAI,EAAE,qCAAqC;gBAC3C,IAAI,EAAE,sDAAsD;aAC7D,CAAC;YACF,IAAA,qCAAiB,EAAC;gBAChB,IAAI,EAAE,qCAAqC;gBAC3C,IAAI,EAAE,+BAA+B;aACtC,CAAC;YACF,0BAAW;YACX,yBAAa;YACb,wBAAY;SACb;KACF,CAAC;GACW,UAAU,CAAG;AAAb,gCAAU","sourcesContent":["// Copyright 2020-2022 OnFinality Limited authors & contributors\n// SPDX-License-Identifier: Apache-2.0\n\nimport { Module } from '@nestjs/common';\nimport {\n MetricEventListener,\n ReadyController,\n ReadyService,\n HealthController,\n HealthService,\n} from '@subql/node-core';\nimport {\n makeGaugeProvider,\n PrometheusModule,\n} from '@willsoto/nestjs-prometheus';\nimport { FetchModule } from '../indexer/fetch.module';\nimport { MetaController } from './meta.controller';\nimport { MetaService } from './meta.service';\n\n@Module({\n imports: [PrometheusModule.register(), FetchModule],\n controllers: [MetaController, HealthController, ReadyController],\n providers: [\n MetricEventListener,\n makeGaugeProvider({\n name: 'subql_indexer_api_connected',\n help: 'The indexer api connection status',\n }),\n makeGaugeProvider({\n name: 'subql_indexer_injected_api_connected',\n help: 'The indexer injected api connection status',\n }),\n makeGaugeProvider({\n name: 'subql_indexer_processing_block_height',\n help: 'The current processing block height',\n }),\n makeGaugeProvider({\n name: 'subql_indexer_processed_block_height',\n help: 'The last processed block height',\n }),\n makeGaugeProvider({\n name: 'subql_indexer_target_block_height',\n help: 'The latest finalized block height',\n }),\n makeGaugeProvider({\n name: 'subql_indexer_best_block_height',\n help: 'The latest best block height',\n }),\n makeGaugeProvider({\n name: 'subql_indexer_block_queue_size',\n help: 'The size of fetched block queue',\n }),\n makeGaugeProvider({\n name: 'subql_indexer_blocknumber_queue_size',\n help: 'The size of fetched block number queue',\n }),\n makeGaugeProvider({\n name: 'subql_indexer_using_dictionary',\n help: 'The status of indexer is using the dictionary',\n }),\n makeGaugeProvider({\n name: 'subql_indexer_skip_dictionary_count',\n help: 'The number of times indexer been skip use dictionary',\n }),\n makeGaugeProvider({\n name: 'subql_indexer_processed_block_count',\n help: 'The number of processed block',\n }),\n MetaService,\n HealthService,\n ReadyService,\n ],\n})\nexport class MetaModule {}\n"]}
1
+ {"version":3,"file":"meta.module.js","sourceRoot":"","sources":["../../src/meta/meta.module.ts"],"names":[],"mappings":";AAAA,gEAAgE;AAChE,sCAAsC;;;;;;;;;AAEtC,2CAAwC;AACxC,gDAM0B;AAC1B,mEAGqC;AACrC,0DAAsD;AACtD,uDAAmD;AACnD,iDAA6C;AAgEtC,IAAM,UAAU,GAAhB,MAAM,UAAU;CAAG,CAAA;AAAb,UAAU;IA9DtB,IAAA,eAAM,EAAC;QACN,OAAO,EAAE,CAAC,oCAAgB,CAAC,QAAQ,EAAE,EAAE,0BAAW,CAAC;QACnD,WAAW,EAAE,CAAC,gCAAc,EAAE,4BAAgB,EAAE,2BAAe,CAAC;QAChE,SAAS,EAAE;YACT,+BAAmB;YACnB,IAAA,qCAAiB,EAAC;gBAChB,IAAI,EAAE,6BAA6B;gBACnC,IAAI,EAAE,mCAAmC;aAC1C,CAAC;YACF,IAAA,qCAAiB,EAAC;gBAChB,IAAI,EAAE,sCAAsC;gBAC5C,IAAI,EAAE,4CAA4C;aACnD,CAAC;YACF,IAAA,qCAAiB,EAAC;gBAChB,IAAI,EAAE,uCAAuC;gBAC7C,IAAI,EAAE,qCAAqC;aAC5C,CAAC;YACF,IAAA,qCAAiB,EAAC;gBAChB,IAAI,EAAE,sCAAsC;gBAC5C,IAAI,EAAE,iCAAiC;aACxC,CAAC;YACF,IAAA,qCAAiB,EAAC;gBAChB,IAAI,EAAE,mCAAmC;gBACzC,IAAI,EAAE,mCAAmC;aAC1C,CAAC;YACF,IAAA,qCAAiB,EAAC;gBAChB,IAAI,EAAE,iCAAiC;gBACvC,IAAI,EAAE,8BAA8B;aACrC,CAAC;YACF,IAAA,qCAAiB,EAAC;gBAChB,IAAI,EAAE,gCAAgC;gBACtC,IAAI,EAAE,iCAAiC;aACxC,CAAC;YACF,IAAA,qCAAiB,EAAC;gBAChB,IAAI,EAAE,sCAAsC;gBAC5C,IAAI,EAAE,wCAAwC;aAC/C,CAAC;YACF,IAAA,qCAAiB,EAAC;gBAChB,IAAI,EAAE,gCAAgC;gBACtC,IAAI,EAAE,+CAA+C;aACtD,CAAC;YACF,IAAA,qCAAiB,EAAC;gBAChB,IAAI,EAAE,qCAAqC;gBAC3C,IAAI,EAAE,sDAAsD;aAC7D,CAAC;YACF,IAAA,qCAAiB,EAAC;gBAChB,IAAI,EAAE,qCAAqC;gBAC3C,IAAI,EAAE,+BAA+B;aACtC,CAAC;YACF,IAAA,qCAAiB,EAAC;gBAChB,IAAI,EAAE,qCAAqC;gBAC3C,IAAI,EAAE,qEAAqE;aAC5E,CAAC;YACF,IAAA,qCAAiB,EAAC;gBAChB,IAAI,EAAE,wCAAwC;gBAC9C,IAAI,EAAE,mDAAmD;aAC1D,CAAC;YACF,0BAAW;YACX,yBAAa;YACb,wBAAY;SACb;KACF,CAAC;GACW,UAAU,CAAG;AAAb,gCAAU","sourcesContent":["// Copyright 2020-2022 OnFinality Limited authors & contributors\n// SPDX-License-Identifier: Apache-2.0\n\nimport { Module } from '@nestjs/common';\nimport {\n MetricEventListener,\n ReadyController,\n ReadyService,\n HealthController,\n HealthService,\n} from '@subql/node-core';\nimport {\n makeGaugeProvider,\n PrometheusModule,\n} from '@willsoto/nestjs-prometheus';\nimport { FetchModule } from '../indexer/fetch.module';\nimport { MetaController } from './meta.controller';\nimport { MetaService } from './meta.service';\n\n@Module({\n imports: [PrometheusModule.register(), FetchModule],\n controllers: [MetaController, HealthController, ReadyController],\n providers: [\n MetricEventListener,\n makeGaugeProvider({\n name: 'subql_indexer_api_connected',\n help: 'The indexer api connection status',\n }),\n makeGaugeProvider({\n name: 'subql_indexer_injected_api_connected',\n help: 'The indexer injected api connection status',\n }),\n makeGaugeProvider({\n name: 'subql_indexer_processing_block_height',\n help: 'The current processing block height',\n }),\n makeGaugeProvider({\n name: 'subql_indexer_processed_block_height',\n help: 'The last processed block height',\n }),\n makeGaugeProvider({\n name: 'subql_indexer_target_block_height',\n help: 'The latest finalized block height',\n }),\n makeGaugeProvider({\n name: 'subql_indexer_best_block_height',\n help: 'The latest best block height',\n }),\n makeGaugeProvider({\n name: 'subql_indexer_block_queue_size',\n help: 'The size of fetched block queue',\n }),\n makeGaugeProvider({\n name: 'subql_indexer_blocknumber_queue_size',\n help: 'The size of fetched block number queue',\n }),\n makeGaugeProvider({\n name: 'subql_indexer_using_dictionary',\n help: 'The status of indexer is using the dictionary',\n }),\n makeGaugeProvider({\n name: 'subql_indexer_skip_dictionary_count',\n help: 'The number of times indexer been skip use dictionary',\n }),\n makeGaugeProvider({\n name: 'subql_indexer_processed_block_count',\n help: 'The number of processed block',\n }),\n makeGaugeProvider({\n name: 'subql_indexer_store_cache_threshold',\n help: 'Store cache will flush once cache record size excess this threshold',\n }),\n makeGaugeProvider({\n name: 'subql_indexer_store_cache_records_size',\n help: 'Number of records waiting to flush in store cache',\n }),\n MetaService,\n HealthService,\n ReadyService,\n ],\n})\nexport class MetaModule {}\n"]}
@@ -1,6 +1,7 @@
1
- import { BestBlockPayload, EventPayload, NetworkMetadataPayload, ProcessBlockPayload, ProcessedBlockCountPayload, TargetBlockPayload, StoreService } from '@subql/node-core';
1
+ import { BestBlockPayload, EventPayload, NetworkMetadataPayload, ProcessBlockPayload, ProcessedBlockCountPayload, TargetBlockPayload, StoreService, NodeConfig } from '@subql/node-core';
2
2
  export declare class MetaService {
3
3
  private storeService;
4
+ private nodeConfig;
4
5
  private currentProcessingHeight;
5
6
  private currentProcessingTimestamp;
6
7
  private bestHeight;
@@ -12,7 +13,16 @@ export declare class MetaService {
12
13
  private lastProcessedHeight;
13
14
  private lastProcessedTimestamp;
14
15
  private processedBlockCount;
15
- constructor(storeService: StoreService);
16
+ private accEnqueueBlocks;
17
+ private accFetchBlocks;
18
+ private currentFilteringBlockNum;
19
+ private accRpcCalls;
20
+ private lastReportedFilteringBlockNum;
21
+ private lastReportedEnqueueBlocks;
22
+ private lastReportedFetchBlocks;
23
+ private lastReportedRpcCalls;
24
+ private lastStatsReportedTs;
25
+ constructor(storeService: StoreService, nodeConfig: NodeConfig);
16
26
  getMeta(): {
17
27
  chain: string;
18
28
  specName: string;
@@ -31,7 +41,7 @@ export declare class MetaService {
31
41
  injectedApiConnected: boolean;
32
42
  usingDictionary: boolean;
33
43
  };
34
- getTargetHeight(): Promise<void>;
44
+ getTargetHeight(): void;
35
45
  handleProcessingBlock(blockPayload: ProcessBlockPayload): void;
36
46
  handleProcessedBlock(blockPayload: ProcessedBlockCountPayload): void;
37
47
  handleTargetBlock(blockPayload: TargetBlockPayload): void;
@@ -39,4 +49,9 @@ export declare class MetaService {
39
49
  handleNetworkMetadata(networkMeta: NetworkMetadataPayload): void;
40
50
  handleApiConnected({ value }: EventPayload<number>): void;
41
51
  handleUsingDictionary({ value }: EventPayload<number>): void;
52
+ handleEnqueueBlocks(size: number): void;
53
+ handleFilteringBlocks(height: number): void;
54
+ handleFetchBlock(): void;
55
+ handleRpcCall(): void;
56
+ blockFilteringSpeed(): void;
42
57
  }
@@ -20,15 +20,25 @@ const UPDATE_HEIGHT_INTERVAL = 60000;
20
20
  // eslint-disable-next-line @typescript-eslint/no-var-requires
21
21
  const { version: polkadotSdkVersion } = require('@polkadot/api/package.json');
22
22
  const { version: packageVersion } = require('../../package.json');
23
+ const logger = (0, node_core_1.getLogger)('profiler');
23
24
  let MetaService = class MetaService {
24
- constructor(storeService) {
25
+ constructor(storeService, nodeConfig) {
25
26
  this.storeService = storeService;
27
+ this.nodeConfig = nodeConfig;
28
+ this.accEnqueueBlocks = 0;
29
+ this.accFetchBlocks = 0;
30
+ this.currentFilteringBlockNum = 0;
31
+ this.accRpcCalls = 0;
32
+ this.lastReportedFilteringBlockNum = 0;
33
+ this.lastReportedEnqueueBlocks = 0;
34
+ this.lastReportedFetchBlocks = 0;
35
+ this.lastReportedRpcCalls = 0;
26
36
  }
27
37
  getMeta() {
28
38
  return Object.assign({ currentProcessingHeight: this.currentProcessingHeight, currentProcessingTimestamp: this.currentProcessingTimestamp, targetHeight: this.targetHeight, bestHeight: this.bestHeight, indexerNodeVersion: packageVersion, lastProcessedHeight: this.lastProcessedHeight, lastProcessedTimestamp: this.lastProcessedTimestamp, uptime: process.uptime(), polkadotSdkVersion, processedBlockCount: this.processedBlockCount, apiConnected: this.apiConnected, injectedApiConnected: this.injectedApiConnected, usingDictionary: this.usingDictionary }, this.networkMeta);
29
39
  }
30
- async getTargetHeight() {
31
- await this.storeService.setMetadata('targetHeight', this.targetHeight);
40
+ getTargetHeight() {
41
+ this.storeService.storeCache.metadata.set('targetHeight', this.targetHeight);
32
42
  }
33
43
  handleProcessingBlock(blockPayload) {
34
44
  this.currentProcessingHeight = blockPayload.height;
@@ -53,12 +63,55 @@ let MetaService = class MetaService {
53
63
  handleUsingDictionary({ value }) {
54
64
  this.usingDictionary = !!value;
55
65
  }
66
+ handleEnqueueBlocks(size) {
67
+ this.accEnqueueBlocks += size;
68
+ if (!this.lastStatsReportedTs) {
69
+ this.lastStatsReportedTs = new Date();
70
+ }
71
+ }
72
+ handleFilteringBlocks(height) {
73
+ this.currentFilteringBlockNum = height;
74
+ if (!this.lastStatsReportedTs) {
75
+ this.lastReportedFilteringBlockNum = height;
76
+ }
77
+ }
78
+ handleFetchBlock() {
79
+ this.accFetchBlocks++;
80
+ if (!this.lastStatsReportedTs) {
81
+ this.lastStatsReportedTs = new Date();
82
+ }
83
+ }
84
+ handleRpcCall() {
85
+ this.accRpcCalls++;
86
+ if (!this.lastStatsReportedTs) {
87
+ this.lastStatsReportedTs = new Date();
88
+ }
89
+ }
90
+ blockFilteringSpeed() {
91
+ if (!this.nodeConfig.profiler) {
92
+ return;
93
+ }
94
+ const count = this.accEnqueueBlocks - this.lastReportedEnqueueBlocks;
95
+ this.lastReportedEnqueueBlocks = this.accEnqueueBlocks;
96
+ const filteringCount = this.currentFilteringBlockNum - this.lastReportedFilteringBlockNum;
97
+ const now = new Date();
98
+ const timepass = now.getTime() - this.lastStatsReportedTs.getTime();
99
+ this.lastStatsReportedTs = now;
100
+ this.lastReportedFilteringBlockNum = this.currentFilteringBlockNum;
101
+ const rpcCalls = this.accRpcCalls - this.lastReportedRpcCalls;
102
+ this.lastReportedRpcCalls = this.accRpcCalls;
103
+ const fetchCount = this.accFetchBlocks - this.lastReportedFetchBlocks;
104
+ this.lastReportedFetchBlocks = this.accFetchBlocks;
105
+ logger.info(`actual block filtering: ${(count / (timepass / 1000)).toFixed(2)}/sec, \
106
+ seeming speed: ${(filteringCount / (timepass / 1000)).toFixed(2)}/sec, rpcCalls: ${(rpcCalls / (timepass / 1000)).toFixed(2)}/sec \
107
+ fetch speed: ${(fetchCount / (timepass / 1000)).toFixed(2)}/sec`);
108
+ }
56
109
  };
57
110
  __decorate([
58
111
  (0, schedule_1.Interval)(UPDATE_HEIGHT_INTERVAL),
59
112
  __metadata("design:type", Function),
60
113
  __metadata("design:paramtypes", []),
61
- __metadata("design:returntype", Promise)
114
+ __metadata("design:returntype", void 0)
62
115
  ], MetaService.prototype, "getTargetHeight", null);
63
116
  __decorate([
64
117
  (0, event_emitter_1.OnEvent)(node_core_1.IndexerEvent.BlockProcessing),
@@ -102,9 +155,40 @@ __decorate([
102
155
  __metadata("design:paramtypes", [Object]),
103
156
  __metadata("design:returntype", void 0)
104
157
  ], MetaService.prototype, "handleUsingDictionary", null);
158
+ __decorate([
159
+ (0, event_emitter_1.OnEvent)('enqueueBlocks'),
160
+ __metadata("design:type", Function),
161
+ __metadata("design:paramtypes", [Number]),
162
+ __metadata("design:returntype", void 0)
163
+ ], MetaService.prototype, "handleEnqueueBlocks", null);
164
+ __decorate([
165
+ (0, event_emitter_1.OnEvent)('filteringBlocks'),
166
+ __metadata("design:type", Function),
167
+ __metadata("design:paramtypes", [Number]),
168
+ __metadata("design:returntype", void 0)
169
+ ], MetaService.prototype, "handleFilteringBlocks", null);
170
+ __decorate([
171
+ (0, event_emitter_1.OnEvent)('fetchBlock'),
172
+ __metadata("design:type", Function),
173
+ __metadata("design:paramtypes", []),
174
+ __metadata("design:returntype", void 0)
175
+ ], MetaService.prototype, "handleFetchBlock", null);
176
+ __decorate([
177
+ (0, event_emitter_1.OnEvent)('rpcCall'),
178
+ __metadata("design:type", Function),
179
+ __metadata("design:paramtypes", []),
180
+ __metadata("design:returntype", void 0)
181
+ ], MetaService.prototype, "handleRpcCall", null);
182
+ __decorate([
183
+ (0, schedule_1.Interval)(10000),
184
+ __metadata("design:type", Function),
185
+ __metadata("design:paramtypes", []),
186
+ __metadata("design:returntype", void 0)
187
+ ], MetaService.prototype, "blockFilteringSpeed", null);
105
188
  MetaService = __decorate([
106
189
  (0, common_1.Injectable)(),
107
- __metadata("design:paramtypes", [node_core_1.StoreService])
190
+ __metadata("design:paramtypes", [node_core_1.StoreService,
191
+ node_core_1.NodeConfig])
108
192
  ], MetaService);
109
193
  exports.MetaService = MetaService;
110
194
  //# sourceMappingURL=meta.service.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"meta.service.js","sourceRoot":"","sources":["../../src/meta/meta.service.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2020-2022 OnFinality Limited authors & contributors\n// SPDX-License-Identifier: Apache-2.0\n\nimport { Injectable } from '@nestjs/common';\nimport { OnEvent } from '@nestjs/event-emitter';\nimport { Interval } from '@nestjs/schedule';\nimport {\n BestBlockPayload,\n EventPayload,\n IndexerEvent,\n NetworkMetadataPayload,\n ProcessBlockPayload,\n ProcessedBlockCountPayload,\n TargetBlockPayload,\n StoreService,\n} from '@subql/node-core';\n\nconst UPDATE_HEIGHT_INTERVAL = 60000;\n\n// eslint-disable-next-line @typescript-eslint/no-var-requires\nconst { version: polkadotSdkVersion } = require('@polkadot/api/package.json');\nconst { version: packageVersion } = require('../../package.json');\n\n@Injectable()\nexport class MetaService {\n private currentProcessingHeight: number;\n private currentProcessingTimestamp: number;\n private bestHeight: number;\n private targetHeight: number;\n private networkMeta: NetworkMetadataPayload;\n private apiConnected: boolean;\n private usingDictionary: boolean;\n private injectedApiConnected: boolean;\n private lastProcessedHeight: number;\n private lastProcessedTimestamp: number;\n private processedBlockCount: number;\n\n constructor(private storeService: StoreService) {}\n\n getMeta() {\n return {\n currentProcessingHeight: this.currentProcessingHeight,\n currentProcessingTimestamp: this.currentProcessingTimestamp,\n targetHeight: this.targetHeight,\n bestHeight: this.bestHeight,\n indexerNodeVersion: packageVersion,\n lastProcessedHeight: this.lastProcessedHeight,\n lastProcessedTimestamp: this.lastProcessedTimestamp,\n uptime: process.uptime(),\n polkadotSdkVersion,\n processedBlockCount: this.processedBlockCount,\n apiConnected: this.apiConnected,\n injectedApiConnected: this.injectedApiConnected,\n usingDictionary: this.usingDictionary,\n ...this.networkMeta,\n };\n }\n\n @Interval(UPDATE_HEIGHT_INTERVAL)\n async getTargetHeight(): Promise<void> {\n await this.storeService.setMetadata('targetHeight', this.targetHeight);\n }\n\n @OnEvent(IndexerEvent.BlockProcessing)\n handleProcessingBlock(blockPayload: ProcessBlockPayload): void {\n this.currentProcessingHeight = blockPayload.height;\n this.currentProcessingTimestamp = blockPayload.timestamp;\n }\n\n @OnEvent(IndexerEvent.BlockProcessedCount)\n handleProcessedBlock(blockPayload: ProcessedBlockCountPayload): void {\n this.processedBlockCount = blockPayload.processedBlockCount;\n this.currentProcessingTimestamp = blockPayload.timestamp;\n }\n\n @OnEvent(IndexerEvent.BlockTarget)\n handleTargetBlock(blockPayload: TargetBlockPayload): void {\n this.targetHeight = blockPayload.height;\n }\n\n @OnEvent(IndexerEvent.BlockBest)\n handleBestBlock(blockPayload: BestBlockPayload): void {\n this.bestHeight = blockPayload.height;\n }\n\n @OnEvent(IndexerEvent.NetworkMetadata)\n handleNetworkMetadata(networkMeta: NetworkMetadataPayload): void {\n this.networkMeta = networkMeta;\n }\n\n @OnEvent(IndexerEvent.ApiConnected)\n handleApiConnected({ value }: EventPayload<number>): void {\n this.apiConnected = !!value;\n }\n\n @OnEvent(IndexerEvent.UsingDictionary)\n handleUsingDictionary({ value }: EventPayload<number>): void {\n this.usingDictionary = !!value;\n }\n}\n"]}
1
+ {"version":3,"file":"meta.service.js","sourceRoot":"","sources":["../../src/meta/meta.service.ts"],"names":[],"mappings":";AAAA,gEAAgE;AAChE,sCAAsC;;;;;;;;;;;;AAEtC,2CAA4C;AAC5C,yDAAgD;AAChD,+CAA4C;AAC5C,gDAW0B;AAE1B,MAAM,sBAAsB,GAAG,KAAK,CAAC;AAErC,8DAA8D;AAC9D,MAAM,EAAE,OAAO,EAAE,kBAAkB,EAAE,GAAG,OAAO,CAAC,4BAA4B,CAAC,CAAC;AAC9E,MAAM,EAAE,OAAO,EAAE,cAAc,EAAE,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;AAClE,MAAM,MAAM,GAAG,IAAA,qBAAS,EAAC,UAAU,CAAC,CAAC;AAG9B,IAAM,WAAW,GAAjB,MAAM,WAAW;IAsBtB,YACU,YAA0B,EAC1B,UAAsB;QADtB,iBAAY,GAAZ,YAAY,CAAc;QAC1B,eAAU,GAAV,UAAU,CAAY;QAZxB,qBAAgB,GAAG,CAAC,CAAC;QACrB,mBAAc,GAAG,CAAC,CAAC;QACnB,6BAAwB,GAAG,CAAC,CAAC;QAC7B,gBAAW,GAAG,CAAC,CAAC;QAChB,kCAA6B,GAAG,CAAC,CAAC;QAClC,8BAAyB,GAAG,CAAC,CAAC;QAC9B,4BAAuB,GAAG,CAAC,CAAC;QAC5B,yBAAoB,GAAG,CAAC,CAAC;IAM9B,CAAC;IAEJ,OAAO;QACL,uBACE,uBAAuB,EAAE,IAAI,CAAC,uBAAuB,EACrD,0BAA0B,EAAE,IAAI,CAAC,0BAA0B,EAC3D,YAAY,EAAE,IAAI,CAAC,YAAY,EAC/B,UAAU,EAAE,IAAI,CAAC,UAAU,EAC3B,kBAAkB,EAAE,cAAc,EAClC,mBAAmB,EAAE,IAAI,CAAC,mBAAmB,EAC7C,sBAAsB,EAAE,IAAI,CAAC,sBAAsB,EACnD,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,EACxB,kBAAkB,EAClB,mBAAmB,EAAE,IAAI,CAAC,mBAAmB,EAC7C,YAAY,EAAE,IAAI,CAAC,YAAY,EAC/B,oBAAoB,EAAE,IAAI,CAAC,oBAAoB,EAC/C,eAAe,EAAE,IAAI,CAAC,eAAe,IAClC,IAAI,CAAC,WAAW,EACnB;IACJ,CAAC;IAGD,eAAe;QACb,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,QAAQ,CAAC,GAAG,CACvC,cAAc,EACd,IAAI,CAAC,YAAY,CAClB,CAAC;IACJ,CAAC;IAGD,qBAAqB,CAAC,YAAiC;QACrD,IAAI,CAAC,uBAAuB,GAAG,YAAY,CAAC,MAAM,CAAC;QACnD,IAAI,CAAC,0BAA0B,GAAG,YAAY,CAAC,SAAS,CAAC;IAC3D,CAAC;IAGD,oBAAoB,CAAC,YAAwC;QAC3D,IAAI,CAAC,mBAAmB,GAAG,YAAY,CAAC,mBAAmB,CAAC;QAC5D,IAAI,CAAC,0BAA0B,GAAG,YAAY,CAAC,SAAS,CAAC;IAC3D,CAAC;IAGD,iBAAiB,CAAC,YAAgC;QAChD,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC,MAAM,CAAC;IAC1C,CAAC;IAGD,eAAe,CAAC,YAA8B;QAC5C,IAAI,CAAC,UAAU,GAAG,YAAY,CAAC,MAAM,CAAC;IACxC,CAAC;IAGD,qBAAqB,CAAC,WAAmC;QACvD,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;IACjC,CAAC;IAGD,kBAAkB,CAAC,EAAE,KAAK,EAAwB;QAChD,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC;IAC9B,CAAC;IAGD,qBAAqB,CAAC,EAAE,KAAK,EAAwB;QACnD,IAAI,CAAC,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC;IACjC,CAAC;IAGD,mBAAmB,CAAC,IAAY;QAC9B,IAAI,CAAC,gBAAgB,IAAI,IAAI,CAAC;QAC9B,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE;YAC7B,IAAI,CAAC,mBAAmB,GAAG,IAAI,IAAI,EAAE,CAAC;SACvC;IACH,CAAC;IAGD,qBAAqB,CAAC,MAAc;QAClC,IAAI,CAAC,wBAAwB,GAAG,MAAM,CAAC;QACvC,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE;YAC7B,IAAI,CAAC,6BAA6B,GAAG,MAAM,CAAC;SAC7C;IACH,CAAC;IAGD,gBAAgB;QACd,IAAI,CAAC,cAAc,EAAE,CAAC;QACtB,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE;YAC7B,IAAI,CAAC,mBAAmB,GAAG,IAAI,IAAI,EAAE,CAAC;SACvC;IACH,CAAC;IAGD,aAAa;QACX,IAAI,CAAC,WAAW,EAAE,CAAC;QACnB,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE;YAC7B,IAAI,CAAC,mBAAmB,GAAG,IAAI,IAAI,EAAE,CAAC;SACvC;IACH,CAAC;IAGD,mBAAmB;QACjB,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE;YAC7B,OAAO;SACR;QACD,MAAM,KAAK,GAAG,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,yBAAyB,CAAC;QACrE,IAAI,CAAC,yBAAyB,GAAG,IAAI,CAAC,gBAAgB,CAAC;QACvD,MAAM,cAAc,GAClB,IAAI,CAAC,wBAAwB,GAAG,IAAI,CAAC,6BAA6B,CAAC;QACrE,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,QAAQ,GAAG,GAAG,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,mBAAmB,CAAC,OAAO,EAAE,CAAC;QACpE,IAAI,CAAC,mBAAmB,GAAG,GAAG,CAAC;QAC/B,IAAI,CAAC,6BAA6B,GAAG,IAAI,CAAC,wBAAwB,CAAC;QACnE,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,oBAAoB,CAAC;QAC9D,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC,WAAW,CAAC;QAC7C,MAAM,UAAU,GAAG,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,uBAAuB,CAAC;QACtE,IAAI,CAAC,uBAAuB,GAAG,IAAI,CAAC,cAAc,CAAC;QACnD,MAAM,CAAC,IAAI,CAAC,2BAA2B,CAAC,KAAK,GAAG,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,OAAO,CACxE,CAAC,CACF;iBACY,CAAC,cAAc,GAAG,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,OAAO,CACvD,CAAC,CACF,mBAAmB,CAAC,QAAQ,GAAG,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;eAClD,CAAC,UAAU,GAAG,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IAChE,CAAC;CACF,CAAA;AAtGC;IAAC,IAAA,mBAAQ,EAAC,sBAAsB,CAAC;;;;kDAMhC;AAED;IAAC,IAAA,uBAAO,EAAC,wBAAY,CAAC,eAAe,CAAC;;;;wDAIrC;AAED;IAAC,IAAA,uBAAO,EAAC,wBAAY,CAAC,mBAAmB,CAAC;;;;uDAIzC;AAED;IAAC,IAAA,uBAAO,EAAC,wBAAY,CAAC,WAAW,CAAC;;;;oDAGjC;AAED;IAAC,IAAA,uBAAO,EAAC,wBAAY,CAAC,SAAS,CAAC;;;;kDAG/B;AAED;IAAC,IAAA,uBAAO,EAAC,wBAAY,CAAC,eAAe,CAAC;;;;wDAGrC;AAED;IAAC,IAAA,uBAAO,EAAC,wBAAY,CAAC,YAAY,CAAC;;;;qDAGlC;AAED;IAAC,IAAA,uBAAO,EAAC,wBAAY,CAAC,eAAe,CAAC;;;;wDAGrC;AAED;IAAC,IAAA,uBAAO,EAAC,eAAe,CAAC;;;;sDAMxB;AAED;IAAC,IAAA,uBAAO,EAAC,iBAAiB,CAAC;;;;wDAM1B;AAED;IAAC,IAAA,uBAAO,EAAC,YAAY,CAAC;;;;mDAMrB;AAED;IAAC,IAAA,uBAAO,EAAC,SAAS,CAAC;;;;gDAMlB;AAED;IAAC,IAAA,mBAAQ,EAAC,KAAK,CAAC;;;;sDAwBf;AAnJU,WAAW;IADvB,IAAA,mBAAU,GAAE;qCAwBa,wBAAY;QACd,sBAAU;GAxBrB,WAAW,CAoJvB;AApJY,kCAAW","sourcesContent":["// Copyright 2020-2022 OnFinality Limited authors & contributors\n// SPDX-License-Identifier: Apache-2.0\n\nimport { Injectable } from '@nestjs/common';\nimport { OnEvent } from '@nestjs/event-emitter';\nimport { Interval } from '@nestjs/schedule';\nimport {\n BestBlockPayload,\n EventPayload,\n IndexerEvent,\n NetworkMetadataPayload,\n ProcessBlockPayload,\n ProcessedBlockCountPayload,\n TargetBlockPayload,\n StoreService,\n getLogger,\n NodeConfig,\n} from '@subql/node-core';\n\nconst UPDATE_HEIGHT_INTERVAL = 60000;\n\n// eslint-disable-next-line @typescript-eslint/no-var-requires\nconst { version: polkadotSdkVersion } = require('@polkadot/api/package.json');\nconst { version: packageVersion } = require('../../package.json');\nconst logger = getLogger('profiler');\n\n@Injectable()\nexport class MetaService {\n private currentProcessingHeight: number;\n private currentProcessingTimestamp: number;\n private bestHeight: number;\n private targetHeight: number;\n private networkMeta: NetworkMetadataPayload;\n private apiConnected: boolean;\n private usingDictionary: boolean;\n private injectedApiConnected: boolean;\n private lastProcessedHeight: number;\n private lastProcessedTimestamp: number;\n private processedBlockCount: number;\n private accEnqueueBlocks = 0;\n private accFetchBlocks = 0;\n private currentFilteringBlockNum = 0;\n private accRpcCalls = 0;\n private lastReportedFilteringBlockNum = 0;\n private lastReportedEnqueueBlocks = 0;\n private lastReportedFetchBlocks = 0;\n private lastReportedRpcCalls = 0;\n private lastStatsReportedTs: Date;\n\n constructor(\n private storeService: StoreService,\n private nodeConfig: NodeConfig,\n ) {}\n\n getMeta() {\n return {\n currentProcessingHeight: this.currentProcessingHeight,\n currentProcessingTimestamp: this.currentProcessingTimestamp,\n targetHeight: this.targetHeight,\n bestHeight: this.bestHeight,\n indexerNodeVersion: packageVersion,\n lastProcessedHeight: this.lastProcessedHeight,\n lastProcessedTimestamp: this.lastProcessedTimestamp,\n uptime: process.uptime(),\n polkadotSdkVersion,\n processedBlockCount: this.processedBlockCount,\n apiConnected: this.apiConnected,\n injectedApiConnected: this.injectedApiConnected,\n usingDictionary: this.usingDictionary,\n ...this.networkMeta,\n };\n }\n\n @Interval(UPDATE_HEIGHT_INTERVAL)\n getTargetHeight(): void {\n this.storeService.storeCache.metadata.set(\n 'targetHeight',\n this.targetHeight,\n );\n }\n\n @OnEvent(IndexerEvent.BlockProcessing)\n handleProcessingBlock(blockPayload: ProcessBlockPayload): void {\n this.currentProcessingHeight = blockPayload.height;\n this.currentProcessingTimestamp = blockPayload.timestamp;\n }\n\n @OnEvent(IndexerEvent.BlockProcessedCount)\n handleProcessedBlock(blockPayload: ProcessedBlockCountPayload): void {\n this.processedBlockCount = blockPayload.processedBlockCount;\n this.currentProcessingTimestamp = blockPayload.timestamp;\n }\n\n @OnEvent(IndexerEvent.BlockTarget)\n handleTargetBlock(blockPayload: TargetBlockPayload): void {\n this.targetHeight = blockPayload.height;\n }\n\n @OnEvent(IndexerEvent.BlockBest)\n handleBestBlock(blockPayload: BestBlockPayload): void {\n this.bestHeight = blockPayload.height;\n }\n\n @OnEvent(IndexerEvent.NetworkMetadata)\n handleNetworkMetadata(networkMeta: NetworkMetadataPayload): void {\n this.networkMeta = networkMeta;\n }\n\n @OnEvent(IndexerEvent.ApiConnected)\n handleApiConnected({ value }: EventPayload<number>): void {\n this.apiConnected = !!value;\n }\n\n @OnEvent(IndexerEvent.UsingDictionary)\n handleUsingDictionary({ value }: EventPayload<number>): void {\n this.usingDictionary = !!value;\n }\n\n @OnEvent('enqueueBlocks')\n handleEnqueueBlocks(size: number): void {\n this.accEnqueueBlocks += size;\n if (!this.lastStatsReportedTs) {\n this.lastStatsReportedTs = new Date();\n }\n }\n\n @OnEvent('filteringBlocks')\n handleFilteringBlocks(height: number): void {\n this.currentFilteringBlockNum = height;\n if (!this.lastStatsReportedTs) {\n this.lastReportedFilteringBlockNum = height;\n }\n }\n\n @OnEvent('fetchBlock')\n handleFetchBlock(): void {\n this.accFetchBlocks++;\n if (!this.lastStatsReportedTs) {\n this.lastStatsReportedTs = new Date();\n }\n }\n\n @OnEvent('rpcCall')\n handleRpcCall(): void {\n this.accRpcCalls++;\n if (!this.lastStatsReportedTs) {\n this.lastStatsReportedTs = new Date();\n }\n }\n\n @Interval(10000)\n blockFilteringSpeed(): void {\n if (!this.nodeConfig.profiler) {\n return;\n }\n const count = this.accEnqueueBlocks - this.lastReportedEnqueueBlocks;\n this.lastReportedEnqueueBlocks = this.accEnqueueBlocks;\n const filteringCount =\n this.currentFilteringBlockNum - this.lastReportedFilteringBlockNum;\n const now = new Date();\n const timepass = now.getTime() - this.lastStatsReportedTs.getTime();\n this.lastStatsReportedTs = now;\n this.lastReportedFilteringBlockNum = this.currentFilteringBlockNum;\n const rpcCalls = this.accRpcCalls - this.lastReportedRpcCalls;\n this.lastReportedRpcCalls = this.accRpcCalls;\n const fetchCount = this.accFetchBlocks - this.lastReportedFetchBlocks;\n this.lastReportedFetchBlocks = this.accFetchBlocks;\n logger.info(`actual block filtering: ${(count / (timepass / 1000)).toFixed(\n 2,\n )}/sec, \\\nseeming speed: ${(filteringCount / (timepass / 1000)).toFixed(\n 2,\n )}/sec, rpcCalls: ${(rpcCalls / (timepass / 1000)).toFixed(2)}/sec \\\nfetch speed: ${(fetchCount / (timepass / 1000)).toFixed(2)}/sec`);\n }\n}\n"]}
@@ -44,12 +44,16 @@ let ForceCleanService = class ForceCleanService {
44
44
  logging: false,
45
45
  benchmark: false,
46
46
  });
47
- // drop all related enums
47
+ // TODO, remove this soon, once original enum are cleaned
48
+ // Deprecate, now enums are moved under schema, drop schema will remove project enums
48
49
  await Promise.all(modelsRelation.enums.map(async (e) => {
49
- const enumTypeName = `${schema}_enum_${(0, node_core_1.enumNameToHash)(e.name)}`;
50
- await this.sequelize.query(`
51
- DROP TYPE "${enumTypeName}";
50
+ const enumTypeNameDeprecated = `${schema}_enum_${(0, node_core_1.enumNameToHash)(e.name)}`;
51
+ const resultsDeprecated = await (0, node_core_1.getEnumDeprecated)(this.sequelize, enumTypeNameDeprecated);
52
+ if (resultsDeprecated.length !== 0) {
53
+ await this.sequelize.query(`
54
+ DROP TYPE "${enumTypeNameDeprecated}";
52
55
  `);
56
+ }
53
57
  }));
54
58
  // remove schema from subquery table (might not exist)
55
59
  const checker = await this.sequelize.query(`
@@ -1 +1 @@
1
- {"version":3,"file":"forceClean.service.js","sourceRoot":"","sources":["../../src/subcommands/forceClean.service.ts"],"names":[],"mappings":";AAAA,gEAAgE;AAChE,sCAAsC;;;;;;;;;;;;;;;;;;AAEtC,4CAAoB;AACpB,2CAAoD;AACpD,gDAK0B;AAC1B,wCAAuD;AACvD,yCAAkD;AAClD,kEAA+D;AAE/D,MAAM,MAAM,GAAG,IAAA,qBAAS,EAAC,aAAa,CAAC,CAAC;AAGjC,IAAM,iBAAiB,GAAvB,MAAM,iBAAiB;IAC5B,YACmB,SAAoB,EACpB,UAAsB,EACD,OAAwB;QAF7C,cAAS,GAAT,SAAS,CAAW;QACpB,eAAU,GAAV,UAAU,CAAY;QACD,YAAO,GAAP,OAAO,CAAiB;IAC7D,CAAC;IAEJ,KAAK,CAAC,UAAU;QACd,MAAM,MAAM,GAAG,MAAM,IAAA,oCAAwB,EAC3C,IAAI,CAAC,UAAU,EACf,IAAI,CAAC,SAAS,CACf,CAAC;QACF,IAAI,CAAC,MAAM,EAAE;YACX,MAAM,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC;YACxC,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;SAC3C;QACD,MAAM,cAAc,GAAG,IAAA,+BAAuB,EAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAEpE,IAAI;YACF,kDAAkD;YAClD,MAAM,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,MAAM,GAAG,EAAE;gBAC7C,OAAO,EAAE,KAAK;gBACd,SAAS,EAAE,KAAK;aACjB,CAAC,CAAC;YAEH,yBAAyB;YACzB,MAAM,OAAO,CAAC,GAAG,CACf,cAAc,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE;gBACnC,MAAM,YAAY,GAAG,GAAG,MAAM,SAAS,IAAA,0BAAc,EAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;gBAChE,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;yBACZ,YAAY;WAC1B,CAAC,CAAC;YACL,CAAC,CAAC,CACH,CAAC;YAEF,sDAAsD;YACtD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,CACxC;mHAC2G,CAC5G,CAAC;YAEF,IAAK,OAAO,CAAC,CAAC,CAAS,CAAC,QAAQ,GAAG,CAAC,EAAE;gBACpC,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,CACxB;;qCAE2B,EAC3B;oBACE,YAAY,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,UAAU,CAAC,YAAY,EAAE;oBACpD,IAAI,EAAE,sBAAU,CAAC,MAAM;iBACxB,CACF,CAAC;aACH;YAED,MAAM,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;YAE/C,IAAI,YAAE,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE;gBAC1C,MAAM,YAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;gBAClD,MAAM,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;aAC7C;SACF;QAAC,OAAO,GAAG,EAAE;YACZ,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,uBAAuB,CAAC,CAAC;YAC3C,MAAM,GAAG,CAAC;SACX;IACH,CAAC;CACF,CAAA;AAhEY,iBAAiB;IAD7B,IAAA,mBAAU,GAAE;IAKR,WAAA,IAAA,eAAM,EAAC,kBAAkB,CAAC,CAAA;qCAFC,qBAAS;QACR,sBAAU;QACQ,iCAAe;GAJrD,iBAAiB,CAgE7B;AAhEY,8CAAiB","sourcesContent":["// Copyright 2020-2022 OnFinality Limited authors & contributors\n// SPDX-License-Identifier: Apache-2.0\n\nimport fs from 'fs';\nimport { Inject, Injectable } from '@nestjs/common';\nimport {\n getLogger,\n NodeConfig,\n getExistingProjectSchema,\n enumNameToHash,\n} from '@subql/node-core';\nimport { getAllEntitiesRelations } from '@subql/utils';\nimport { QueryTypes, Sequelize } from 'sequelize';\nimport { SubqueryProject } from '../configure/SubqueryProject';\n\nconst logger = getLogger('Force-clean');\n\n@Injectable()\nexport class ForceCleanService {\n constructor(\n private readonly sequelize: Sequelize,\n private readonly nodeConfig: NodeConfig,\n @Inject('ISubqueryProject') protected project: SubqueryProject,\n ) {}\n\n async forceClean(): Promise<void> {\n const schema = await getExistingProjectSchema(\n this.nodeConfig,\n this.sequelize,\n );\n if (!schema) {\n logger.error('Unable to locate schema');\n throw new Error('Schema does not exist.');\n }\n const modelsRelation = getAllEntitiesRelations(this.project.schema);\n\n try {\n // drop existing project schema and metadata table\n await this.sequelize.dropSchema(`\"${schema}\"`, {\n logging: false,\n benchmark: false,\n });\n\n // drop all related enums\n await Promise.all(\n modelsRelation.enums.map(async (e) => {\n const enumTypeName = `${schema}_enum_${enumNameToHash(e.name)}`;\n await this.sequelize.query(`\n DROP TYPE \"${enumTypeName}\";\n `);\n }),\n );\n\n // remove schema from subquery table (might not exist)\n const checker = await this.sequelize.query(\n `\n SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'public' AND TABLE_NAME = 'subqueries'`,\n );\n\n if ((checker[1] as any).rowCount > 0) {\n await this.sequelize.query(\n ` DELETE\n FROM public.subqueries\n WHERE name = :name`,\n {\n replacements: { name: this.nodeConfig.subqueryName },\n type: QueryTypes.DELETE,\n },\n );\n }\n\n logger.info('force cleaned schema and tables');\n\n if (fs.existsSync(this.nodeConfig.mmrPath)) {\n await fs.promises.unlink(this.nodeConfig.mmrPath);\n logger.info('force cleaned file based mmr');\n }\n } catch (err) {\n logger.error(err, 'failed to force clean');\n throw err;\n }\n }\n}\n"]}
1
+ {"version":3,"file":"forceClean.service.js","sourceRoot":"","sources":["../../src/subcommands/forceClean.service.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2020-2022 OnFinality Limited authors & contributors\n// SPDX-License-Identifier: Apache-2.0\n\nimport fs from 'fs';\nimport { Inject, Injectable } from '@nestjs/common';\nimport {\n getLogger,\n NodeConfig,\n getExistingProjectSchema,\n enumNameToHash,\n getEnumDeprecated,\n} from '@subql/node-core';\nimport { getAllEntitiesRelations } from '@subql/utils';\nimport { QueryTypes, Sequelize } from 'sequelize';\nimport { SubqueryProject } from '../configure/SubqueryProject';\n\nconst logger = getLogger('Force-clean');\n\n@Injectable()\nexport class ForceCleanService {\n constructor(\n private readonly sequelize: Sequelize,\n private readonly nodeConfig: NodeConfig,\n @Inject('ISubqueryProject') protected project: SubqueryProject,\n ) {}\n\n async forceClean(): Promise<void> {\n const schema = await getExistingProjectSchema(\n this.nodeConfig,\n this.sequelize,\n );\n if (!schema) {\n logger.error('Unable to locate schema');\n throw new Error('Schema does not exist.');\n }\n const modelsRelation = getAllEntitiesRelations(this.project.schema);\n\n try {\n // drop existing project schema and metadata table\n await this.sequelize.dropSchema(`\"${schema}\"`, {\n logging: false,\n benchmark: false,\n });\n\n // TODO, remove this soon, once original enum are cleaned\n // Deprecate, now enums are moved under schema, drop schema will remove project enums\n await Promise.all(\n modelsRelation.enums.map(async (e) => {\n const enumTypeNameDeprecated = `${schema}_enum_${enumNameToHash(\n e.name,\n )}`;\n const resultsDeprecated = await getEnumDeprecated(\n this.sequelize,\n enumTypeNameDeprecated,\n );\n if (resultsDeprecated.length !== 0) {\n await this.sequelize.query(`\n DROP TYPE \"${enumTypeNameDeprecated}\";\n `);\n }\n }),\n );\n\n // remove schema from subquery table (might not exist)\n const checker = await this.sequelize.query(\n `\n SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'public' AND TABLE_NAME = 'subqueries'`,\n );\n\n if ((checker[1] as any).rowCount > 0) {\n await this.sequelize.query(\n ` DELETE\n FROM public.subqueries\n WHERE name = :name`,\n {\n replacements: { name: this.nodeConfig.subqueryName },\n type: QueryTypes.DELETE,\n },\n );\n }\n\n logger.info('force cleaned schema and tables');\n\n if (fs.existsSync(this.nodeConfig.mmrPath)) {\n await fs.promises.unlink(this.nodeConfig.mmrPath);\n logger.info('force cleaned file based mmr');\n }\n } catch (err) {\n logger.error(err, 'failed to force clean');\n throw err;\n }\n }\n}\n"]}
@@ -14,7 +14,11 @@ async function reindexInit(targetHeight) {
14
14
  await app.init();
15
15
  const reindexService = app.get(reindex_service_1.ReindexService);
16
16
  await reindexService.init();
17
- await reindexService.reindex(targetHeight);
17
+ const actualReindexHeight = await reindexService.getTargetHeightWithUnfinalizedBlocks(targetHeight);
18
+ if (actualReindexHeight !== targetHeight) {
19
+ logger.info(`Found index target height ${targetHeight} beyond indexed unfinalized block ${actualReindexHeight}, will index to ${actualReindexHeight}`);
20
+ }
21
+ await reindexService.reindex(actualReindexHeight);
18
22
  }
19
23
  catch (e) {
20
24
  logger.error(e, 'Reindex failed to execute');
@@ -1 +1 @@
1
- {"version":3,"file":"reindex.init.js","sourceRoot":"","sources":["../../src/subcommands/reindex.init.ts"],"names":[],"mappings":";AAAA,gEAAgE;AAChE,sCAAsC;;;AAEtC,uCAA2C;AAC3C,gDAA6C;AAC7C,qDAAiD;AACjD,uDAAmD;AAEnD,MAAM,MAAM,GAAG,IAAA,qBAAS,EAAC,aAAa,CAAC,CAAC;AACjC,KAAK,UAAU,WAAW,CAAC,YAAoB;IACpD,IAAI;QACF,MAAM,GAAG,GAAG,MAAM,kBAAW,CAAC,MAAM,CAAC,8BAAa,CAAC,CAAC;QAEpD,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;QACjB,MAAM,cAAc,GAAG,GAAG,CAAC,GAAG,CAAC,gCAAc,CAAC,CAAC;QAE/C,MAAM,cAAc,CAAC,IAAI,EAAE,CAAC;QAC5B,MAAM,cAAc,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;KAC5C;IAAC,OAAO,CAAC,EAAE;QACV,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,2BAA2B,CAAC,CAAC;QAC7C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;KACjB;IACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAdD,kCAcC","sourcesContent":["// Copyright 2020-2022 OnFinality Limited authors & contributors\n// SPDX-License-Identifier: Apache-2.0\n\nimport { NestFactory } from '@nestjs/core';\nimport { getLogger } from '@subql/node-core';\nimport { ReindexModule } from './reindex.module';\nimport { ReindexService } from './reindex.service';\n\nconst logger = getLogger('CLI-Reindex');\nexport async function reindexInit(targetHeight: number): Promise<void> {\n try {\n const app = await NestFactory.create(ReindexModule);\n\n await app.init();\n const reindexService = app.get(ReindexService);\n\n await reindexService.init();\n await reindexService.reindex(targetHeight);\n } catch (e) {\n logger.error(e, 'Reindex failed to execute');\n process.exit(1);\n }\n process.exit(0);\n}\n"]}
1
+ {"version":3,"file":"reindex.init.js","sourceRoot":"","sources":["../../src/subcommands/reindex.init.ts"],"names":[],"mappings":";AAAA,gEAAgE;AAChE,sCAAsC;;;AAEtC,uCAA2C;AAC3C,gDAA6C;AAC7C,qDAAiD;AACjD,uDAAmD;AAEnD,MAAM,MAAM,GAAG,IAAA,qBAAS,EAAC,aAAa,CAAC,CAAC;AACjC,KAAK,UAAU,WAAW,CAAC,YAAoB;IACpD,IAAI;QACF,MAAM,GAAG,GAAG,MAAM,kBAAW,CAAC,MAAM,CAAC,8BAAa,CAAC,CAAC;QAEpD,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;QACjB,MAAM,cAAc,GAAG,GAAG,CAAC,GAAG,CAAC,gCAAc,CAAC,CAAC;QAE/C,MAAM,cAAc,CAAC,IAAI,EAAE,CAAC;QAC5B,MAAM,mBAAmB,GACvB,MAAM,cAAc,CAAC,oCAAoC,CAAC,YAAY,CAAC,CAAC;QAC1E,IAAI,mBAAmB,KAAK,YAAY,EAAE;YACxC,MAAM,CAAC,IAAI,CACT,6BAA6B,YAAY,qCAAqC,mBAAmB,mBAAmB,mBAAmB,EAAE,CAC1I,CAAC;SACH;QACD,MAAM,cAAc,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC;KACnD;IAAC,OAAO,CAAC,EAAE;QACV,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,2BAA2B,CAAC,CAAC;QAC7C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;KACjB;IACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AArBD,kCAqBC","sourcesContent":["// Copyright 2020-2022 OnFinality Limited authors & contributors\n// SPDX-License-Identifier: Apache-2.0\n\nimport { NestFactory } from '@nestjs/core';\nimport { getLogger } from '@subql/node-core';\nimport { ReindexModule } from './reindex.module';\nimport { ReindexService } from './reindex.service';\n\nconst logger = getLogger('CLI-Reindex');\nexport async function reindexInit(targetHeight: number): Promise<void> {\n try {\n const app = await NestFactory.create(ReindexModule);\n\n await app.init();\n const reindexService = app.get(ReindexService);\n\n await reindexService.init();\n const actualReindexHeight =\n await reindexService.getTargetHeightWithUnfinalizedBlocks(targetHeight);\n if (actualReindexHeight !== targetHeight) {\n logger.info(\n `Found index target height ${targetHeight} beyond indexed unfinalized block ${actualReindexHeight}, will index to ${actualReindexHeight}`,\n );\n }\n await reindexService.reindex(actualReindexHeight);\n } catch (e) {\n logger.error(e, 'Reindex failed to execute');\n process.exit(1);\n }\n process.exit(0);\n}\n"]}
@@ -14,6 +14,7 @@ const node_core_1 = require("@subql/node-core");
14
14
  const configure_module_1 = require("../configure/configure.module");
15
15
  const ds_processor_service_1 = require("../indexer/ds-processor.service");
16
16
  const dynamic_ds_service_1 = require("../indexer/dynamic-ds.service");
17
+ const unfinalizedBlocks_service_1 = require("../indexer/unfinalizedBlocks.service");
17
18
  const forceClean_service_1 = require("./forceClean.service");
18
19
  const reindex_service_1 = require("./reindex.service");
19
20
  let ReindexFeatureModule = class ReindexFeatureModule {
@@ -21,12 +22,19 @@ let ReindexFeatureModule = class ReindexFeatureModule {
21
22
  ReindexFeatureModule = __decorate([
22
23
  (0, common_1.Module)({
23
24
  providers: [
25
+ node_core_1.StoreCacheService,
24
26
  node_core_1.StoreService,
25
27
  reindex_service_1.ReindexService,
26
28
  node_core_1.MmrService,
27
29
  forceClean_service_1.ForceCleanService,
30
+ unfinalizedBlocks_service_1.UnfinalizedBlocksService,
28
31
  dynamic_ds_service_1.DynamicDsService,
29
32
  ds_processor_service_1.DsProcessorService,
33
+ {
34
+ // Used to work with DI for unfinalizedBlocksService but not used with reindex
35
+ provide: node_core_1.ApiService,
36
+ useFactory: () => undefined,
37
+ },
30
38
  ],
31
39
  controllers: [],
32
40
  })
@@ -1 +1 @@
1
- {"version":3,"file":"reindex.module.js","sourceRoot":"","sources":["../../src/subcommands/reindex.module.ts"],"names":[],"mappings":";AAAA,gEAAgE;AAChE,sCAAsC;;;;;;;;;AAEtC,2CAAwC;AACxC,gDAK0B;AAC1B,oEAAgE;AAChE,0EAAqE;AACrE,sEAAiE;AACjE,6DAAyD;AACzD,uDAAmD;AAa5C,IAAM,oBAAoB,GAA1B,MAAM,oBAAoB;CAAG,CAAA;AAAvB,oBAAoB;IAXhC,IAAA,eAAM,EAAC;QACN,SAAS,EAAE;YACT,wBAAY;YACZ,gCAAc;YACd,sBAAU;YACV,sCAAiB;YACjB,qCAAgB;YAChB,yCAAkB;SACnB;QACD,WAAW,EAAE,EAAE;KAChB,CAAC;GACW,oBAAoB,CAAG;AAAvB,oDAAoB;AAU1B,IAAM,aAAa,GAAnB,MAAM,aAAa;CAAG,CAAA;AAAhB,aAAa;IARzB,IAAA,eAAM,EAAC;QACN,OAAO,EAAE;YACP,oBAAQ,CAAC,OAAO,EAAE;YAClB,kCAAe,CAAC,QAAQ,EAAE;YAC1B,oBAAoB;SACrB;QACD,WAAW,EAAE,EAAE;KAChB,CAAC;GACW,aAAa,CAAG;AAAhB,sCAAa","sourcesContent":["// Copyright 2020-2022 OnFinality Limited authors & contributors\n// SPDX-License-Identifier: Apache-2.0\n\nimport { Module } from '@nestjs/common';\nimport {\n DbModule,\n MmrService,\n NodeConfig,\n StoreService,\n} from '@subql/node-core';\nimport { ConfigureModule } from '../configure/configure.module';\nimport { DsProcessorService } from '../indexer/ds-processor.service';\nimport { DynamicDsService } from '../indexer/dynamic-ds.service';\nimport { ForceCleanService } from './forceClean.service';\nimport { ReindexService } from './reindex.service';\n\n@Module({\n providers: [\n StoreService,\n ReindexService,\n MmrService,\n ForceCleanService,\n DynamicDsService,\n DsProcessorService,\n ],\n controllers: [],\n})\nexport class ReindexFeatureModule {}\n\n@Module({\n imports: [\n DbModule.forRoot(),\n ConfigureModule.register(),\n ReindexFeatureModule,\n ],\n controllers: [],\n})\nexport class ReindexModule {}\n"]}
1
+ {"version":3,"file":"reindex.module.js","sourceRoot":"","sources":["../../src/subcommands/reindex.module.ts"],"names":[],"mappings":";AAAA,gEAAgE;AAChE,sCAAsC;;;;;;;;;AAEtC,2CAAwC;AACxC,gDAM0B;AAC1B,oEAAgE;AAChE,0EAAqE;AACrE,sEAAiE;AACjE,oFAAgF;AAChF,6DAAyD;AACzD,uDAAmD;AAoB5C,IAAM,oBAAoB,GAA1B,MAAM,oBAAoB;CAAG,CAAA;AAAvB,oBAAoB;IAlBhC,IAAA,eAAM,EAAC;QACN,SAAS,EAAE;YACT,6BAAiB;YACjB,wBAAY;YACZ,gCAAc;YACd,sBAAU;YACV,sCAAiB;YACjB,oDAAwB;YACxB,qCAAgB;YAChB,yCAAkB;YAClB;gBACE,8EAA8E;gBAC9E,OAAO,EAAE,sBAAU;gBACnB,UAAU,EAAE,GAAG,EAAE,CAAC,SAAS;aAC5B;SACF;QACD,WAAW,EAAE,EAAE;KAChB,CAAC;GACW,oBAAoB,CAAG;AAAvB,oDAAoB;AAU1B,IAAM,aAAa,GAAnB,MAAM,aAAa;CAAG,CAAA;AAAhB,aAAa;IARzB,IAAA,eAAM,EAAC;QACN,OAAO,EAAE;YACP,oBAAQ,CAAC,OAAO,EAAE;YAClB,kCAAe,CAAC,QAAQ,EAAE;YAC1B,oBAAoB;SACrB;QACD,WAAW,EAAE,EAAE;KAChB,CAAC;GACW,aAAa,CAAG;AAAhB,sCAAa","sourcesContent":["// Copyright 2020-2022 OnFinality Limited authors & contributors\n// SPDX-License-Identifier: Apache-2.0\n\nimport { Module } from '@nestjs/common';\nimport {\n ApiService,\n DbModule,\n MmrService,\n StoreCacheService,\n StoreService,\n} from '@subql/node-core';\nimport { ConfigureModule } from '../configure/configure.module';\nimport { DsProcessorService } from '../indexer/ds-processor.service';\nimport { DynamicDsService } from '../indexer/dynamic-ds.service';\nimport { UnfinalizedBlocksService } from '../indexer/unfinalizedBlocks.service';\nimport { ForceCleanService } from './forceClean.service';\nimport { ReindexService } from './reindex.service';\n\n@Module({\n providers: [\n StoreCacheService,\n StoreService,\n ReindexService,\n MmrService,\n ForceCleanService,\n UnfinalizedBlocksService,\n DynamicDsService,\n DsProcessorService,\n {\n // Used to work with DI for unfinalizedBlocksService but not used with reindex\n provide: ApiService,\n useFactory: () => undefined,\n },\n ],\n controllers: [],\n})\nexport class ReindexFeatureModule {}\n\n@Module({\n imports: [\n DbModule.forRoot(),\n ConfigureModule.register(),\n ReindexFeatureModule,\n ],\n controllers: [],\n})\nexport class ReindexModule {}\n"]}
@@ -2,6 +2,7 @@ import { MmrService, NodeConfig, StoreService } from '@subql/node-core';
2
2
  import { Sequelize } from 'sequelize';
3
3
  import { SubqueryProject } from '../configure/SubqueryProject';
4
4
  import { DynamicDsService } from '../indexer/dynamic-ds.service';
5
+ import { UnfinalizedBlocksService } from '../indexer/unfinalizedBlocks.service';
5
6
  import { ForceCleanService } from './forceClean.service';
6
7
  export declare class ReindexService {
7
8
  private readonly sequelize;
@@ -10,11 +11,13 @@ export declare class ReindexService {
10
11
  private readonly mmrService;
11
12
  private readonly project;
12
13
  private readonly forceCleanService;
14
+ private readonly unfinalizedBlocksService;
13
15
  private readonly dynamicDsService;
14
16
  private schema;
15
17
  private metadataRepo;
16
- constructor(sequelize: Sequelize, nodeConfig: NodeConfig, storeService: StoreService, mmrService: MmrService, project: SubqueryProject, forceCleanService: ForceCleanService, dynamicDsService: DynamicDsService);
18
+ constructor(sequelize: Sequelize, nodeConfig: NodeConfig, storeService: StoreService, mmrService: MmrService, project: SubqueryProject, forceCleanService: ForceCleanService, unfinalizedBlocksService: UnfinalizedBlocksService, dynamicDsService: DynamicDsService);
17
19
  init(): Promise<void>;
20
+ getTargetHeightWithUnfinalizedBlocks(inputHeight: number): Promise<number>;
18
21
  private getExistingProjectSchema;
19
22
  private getLastProcessedHeight;
20
23
  private getMetadataBlockOffset;
@@ -20,18 +20,20 @@ const node_core_1 = require("@subql/node-core");
20
20
  const sequelize_1 = require("sequelize");
21
21
  const SubqueryProject_1 = require("../configure/SubqueryProject");
22
22
  const dynamic_ds_service_1 = require("../indexer/dynamic-ds.service");
23
+ const unfinalizedBlocks_service_1 = require("../indexer/unfinalizedBlocks.service");
23
24
  const project_1 = require("../utils/project");
24
25
  const reindex_1 = require("../utils/reindex");
25
26
  const forceClean_service_1 = require("./forceClean.service");
26
27
  const logger = (0, node_core_1.getLogger)('Reindex');
27
28
  let ReindexService = class ReindexService {
28
- constructor(sequelize, nodeConfig, storeService, mmrService, project, forceCleanService, dynamicDsService) {
29
+ constructor(sequelize, nodeConfig, storeService, mmrService, project, forceCleanService, unfinalizedBlocksService, dynamicDsService) {
29
30
  this.sequelize = sequelize;
30
31
  this.nodeConfig = nodeConfig;
31
32
  this.storeService = storeService;
32
33
  this.mmrService = mmrService;
33
34
  this.project = project;
34
35
  this.forceCleanService = forceCleanService;
36
+ this.unfinalizedBlocksService = unfinalizedBlocksService;
35
37
  this.dynamicDsService = dynamicDsService;
36
38
  }
37
39
  async init() {
@@ -41,24 +43,31 @@ let ReindexService = class ReindexService {
41
43
  throw new Error('Schema does not exist.');
42
44
  }
43
45
  await this.initDbSchema();
44
- // Should we use an optional arg for multiChain?
45
- this.metadataRepo = await (0, node_core_1.MetadataFactory)(this.sequelize, this.schema, this.nodeConfig.multiChain, this.project.network.chainId);
46
+ this.metadataRepo = this.storeService.storeCache.metadata;
46
47
  this.dynamicDsService.init(this.metadataRepo);
47
48
  }
49
+ async getTargetHeightWithUnfinalizedBlocks(inputHeight) {
50
+ // Why does this happen?
51
+ this.unfinalizedBlocksService.metadataRepo = this.metadataRepo;
52
+ const unfinalizedBlocks = await this.unfinalizedBlocksService.getMetadataUnfinalizedBlocks();
53
+ const bestBlocks = unfinalizedBlocks.filter(([bestBlockHeight]) => Number(bestBlockHeight) <= inputHeight);
54
+ if (bestBlocks.length === 0) {
55
+ return inputHeight;
56
+ }
57
+ const [firstBestBlock] = bestBlocks[0];
58
+ return Math.min(inputHeight, firstBestBlock);
59
+ }
48
60
  async getExistingProjectSchema() {
49
61
  return (0, node_core_1.getExistingProjectSchema)(this.nodeConfig, this.sequelize);
50
62
  }
51
63
  async getLastProcessedHeight() {
52
- return (0, node_core_1.getMetaDataInfo)(this.metadataRepo, 'lastProcessedHeight');
64
+ return this.metadataRepo.find('lastProcessedHeight');
53
65
  }
54
66
  async getMetadataBlockOffset() {
55
- return (0, node_core_1.getMetaDataInfo)(this.metadataRepo, 'blockOffset');
67
+ return this.metadataRepo.find('blockOffset');
56
68
  }
57
69
  async getMetadataSpecName() {
58
- const res = await this.metadataRepo.findOne({
59
- where: { key: 'specName' },
60
- });
61
- return res === null || res === void 0 ? void 0 : res.value;
70
+ return this.metadataRepo.find('specName');
62
71
  }
63
72
  async initDbSchema() {
64
73
  await (0, project_1.initDbSchema)(this.project, this.schema, this.storeService);
@@ -80,7 +89,8 @@ let ReindexService = class ReindexService {
80
89
  this.getStartBlockFromDataSources(),
81
90
  this.getLastProcessedHeight(),
82
91
  ]);
83
- return (0, reindex_1.reindex)(startHeight, await this.getMetadataBlockOffset(), targetBlockHeight, lastProcessedHeight, this.storeService, this.dynamicDsService, this.mmrService, this.sequelize, this.forceCleanService);
92
+ await (0, reindex_1.reindex)(startHeight, await this.getMetadataBlockOffset(), targetBlockHeight, lastProcessedHeight, this.storeService, this.unfinalizedBlocksService, this.dynamicDsService, this.mmrService, this.sequelize, this.forceCleanService);
93
+ await this.storeService.storeCache.flushCache();
84
94
  }
85
95
  };
86
96
  ReindexService = __decorate([
@@ -92,6 +102,7 @@ ReindexService = __decorate([
92
102
  node_core_1.MmrService,
93
103
  SubqueryProject_1.SubqueryProject,
94
104
  forceClean_service_1.ForceCleanService,
105
+ unfinalizedBlocks_service_1.UnfinalizedBlocksService,
95
106
  dynamic_ds_service_1.DynamicDsService])
96
107
  ], ReindexService);
97
108
  exports.ReindexService = ReindexService;
@@ -1 +1 @@
1
- {"version":3,"file":"reindex.service.js","sourceRoot":"","sources":["../../src/subcommands/reindex.service.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2020-2022 OnFinality Limited authors & contributors\n// SPDX-License-Identifier: Apache-2.0\n\nimport { Inject, Injectable } from '@nestjs/common';\nimport {\n getLogger,\n MetadataFactory,\n MetadataRepo,\n MmrService,\n NodeConfig,\n StoreService,\n getExistingProjectSchema,\n getMetaDataInfo,\n} from '@subql/node-core';\nimport { Sequelize } from 'sequelize';\nimport { SubqueryProject } from '../configure/SubqueryProject';\nimport { DynamicDsService } from '../indexer/dynamic-ds.service';\nimport { initDbSchema } from '../utils/project';\nimport { reindex } from '../utils/reindex';\n\nimport { ForceCleanService } from './forceClean.service';\n\nconst logger = getLogger('Reindex');\n\n@Injectable()\nexport class ReindexService {\n private schema: string;\n private metadataRepo: MetadataRepo;\n\n constructor(\n private readonly sequelize: Sequelize,\n private readonly nodeConfig: NodeConfig,\n private readonly storeService: StoreService,\n private readonly mmrService: MmrService,\n @Inject('ISubqueryProject') private readonly project: SubqueryProject,\n private readonly forceCleanService: ForceCleanService,\n private readonly dynamicDsService: DynamicDsService,\n ) {}\n\n async init(): Promise<void> {\n this.schema = await this.getExistingProjectSchema();\n\n if (!this.schema) {\n logger.error('Unable to locate schema');\n throw new Error('Schema does not exist.');\n }\n await this.initDbSchema();\n // Should we use an optional arg for multiChain?\n this.metadataRepo = await MetadataFactory(\n this.sequelize,\n this.schema,\n this.nodeConfig.multiChain,\n this.project.network.chainId,\n );\n this.dynamicDsService.init(this.metadataRepo);\n }\n\n private async getExistingProjectSchema(): Promise<string> {\n return getExistingProjectSchema(this.nodeConfig, this.sequelize);\n }\n\n private async getLastProcessedHeight(): Promise<number | undefined> {\n return getMetaDataInfo(this.metadataRepo, 'lastProcessedHeight');\n }\n\n private async getMetadataBlockOffset(): Promise<number | undefined> {\n return getMetaDataInfo(this.metadataRepo, 'blockOffset');\n }\n\n private async getMetadataSpecName(): Promise<string | undefined> {\n const res = await this.metadataRepo.findOne({\n where: { key: 'specName' },\n });\n return res?.value as string | undefined;\n }\n\n private async initDbSchema(): Promise<void> {\n await initDbSchema(this.project, this.schema, this.storeService);\n }\n\n // eslint-disable-next-line @typescript-eslint/require-await\n private async getStartBlockFromDataSources() {\n const datasources = this.project.dataSources;\n\n const startBlocksList = datasources.map((item) => item.startBlock ?? 1);\n if (startBlocksList.length === 0) {\n logger.error(\n `Failed to find a valid datasource, Please check your endpoint if specName filter is used.`,\n );\n process.exit(1);\n } else {\n return Math.min(...startBlocksList);\n }\n }\n\n async reindex(targetBlockHeight: number): Promise<void> {\n const [startHeight, lastProcessedHeight] = await Promise.all([\n this.getStartBlockFromDataSources(),\n this.getLastProcessedHeight(),\n ]);\n\n return reindex(\n startHeight,\n await this.getMetadataBlockOffset(),\n targetBlockHeight,\n lastProcessedHeight,\n this.storeService,\n this.dynamicDsService,\n this.mmrService,\n this.sequelize,\n this.forceCleanService,\n );\n }\n}\n"]}
1
+ {"version":3,"file":"reindex.service.js","sourceRoot":"","sources":["../../src/subcommands/reindex.service.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2020-2022 OnFinality Limited authors & contributors\n// SPDX-License-Identifier: Apache-2.0\n\nimport { Inject, Injectable } from '@nestjs/common';\nimport {\n getLogger,\n MmrService,\n NodeConfig,\n StoreService,\n getExistingProjectSchema,\n CacheMetadataModel,\n} from '@subql/node-core';\nimport { Sequelize } from 'sequelize';\nimport { SubqueryProject } from '../configure/SubqueryProject';\nimport { DynamicDsService } from '../indexer/dynamic-ds.service';\nimport { UnfinalizedBlocksService } from '../indexer/unfinalizedBlocks.service';\nimport { initDbSchema } from '../utils/project';\nimport { reindex } from '../utils/reindex';\n\nimport { ForceCleanService } from './forceClean.service';\n\nconst logger = getLogger('Reindex');\n\n@Injectable()\nexport class ReindexService {\n private schema: string;\n private metadataRepo: CacheMetadataModel;\n\n constructor(\n private readonly sequelize: Sequelize,\n private readonly nodeConfig: NodeConfig,\n private readonly storeService: StoreService,\n private readonly mmrService: MmrService,\n @Inject('ISubqueryProject') private readonly project: SubqueryProject,\n private readonly forceCleanService: ForceCleanService,\n private readonly unfinalizedBlocksService: UnfinalizedBlocksService,\n private readonly dynamicDsService: DynamicDsService,\n ) {}\n\n async init(): Promise<void> {\n this.schema = await this.getExistingProjectSchema();\n\n if (!this.schema) {\n logger.error('Unable to locate schema');\n throw new Error('Schema does not exist.');\n }\n await this.initDbSchema();\n\n this.metadataRepo = this.storeService.storeCache.metadata;\n\n this.dynamicDsService.init(this.metadataRepo);\n }\n\n async getTargetHeightWithUnfinalizedBlocks(\n inputHeight: number,\n ): Promise<number> {\n // Why does this happen?\n (this.unfinalizedBlocksService as any).metadataRepo = this.metadataRepo;\n const unfinalizedBlocks =\n await this.unfinalizedBlocksService.getMetadataUnfinalizedBlocks();\n const bestBlocks = unfinalizedBlocks.filter(\n ([bestBlockHeight]) => Number(bestBlockHeight) <= inputHeight,\n );\n if (bestBlocks.length === 0) {\n return inputHeight;\n }\n const [firstBestBlock] = bestBlocks[0];\n return Math.min(inputHeight, firstBestBlock);\n }\n\n private async getExistingProjectSchema(): Promise<string> {\n return getExistingProjectSchema(this.nodeConfig, this.sequelize);\n }\n\n private async getLastProcessedHeight(): Promise<number | undefined> {\n return this.metadataRepo.find('lastProcessedHeight');\n }\n\n private async getMetadataBlockOffset(): Promise<number | undefined> {\n return this.metadataRepo.find('blockOffset');\n }\n\n private async getMetadataSpecName(): Promise<string | undefined> {\n return this.metadataRepo.find('specName');\n }\n\n private async initDbSchema(): Promise<void> {\n await initDbSchema(this.project, this.schema, this.storeService);\n }\n\n // eslint-disable-next-line @typescript-eslint/require-await\n private async getStartBlockFromDataSources() {\n const datasources = this.project.dataSources;\n\n const startBlocksList = datasources.map((item) => item.startBlock ?? 1);\n if (startBlocksList.length === 0) {\n logger.error(\n `Failed to find a valid datasource, Please check your endpoint if specName filter is used.`,\n );\n process.exit(1);\n } else {\n return Math.min(...startBlocksList);\n }\n }\n\n async reindex(targetBlockHeight: number): Promise<void> {\n const [startHeight, lastProcessedHeight] = await Promise.all([\n this.getStartBlockFromDataSources(),\n this.getLastProcessedHeight(),\n ]);\n\n await reindex(\n startHeight,\n await this.getMetadataBlockOffset(),\n targetBlockHeight,\n lastProcessedHeight,\n this.storeService,\n this.unfinalizedBlocksService,\n this.dynamicDsService,\n this.mmrService,\n this.sequelize,\n this.forceCleanService,\n );\n await this.storeService.storeCache.flushCache();\n }\n}\n"]}