teraslice 3.3.0 → 3.3.2

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 (108) hide show
  1. package/LICENSE +202 -0
  2. package/package.json +25 -28
  3. package/dist/src/interfaces.js +0 -12
  4. package/dist/src/lib/cluster/cluster_master.js +0 -246
  5. package/dist/src/lib/cluster/node_master.js +0 -355
  6. package/dist/src/lib/cluster/services/api.js +0 -663
  7. package/dist/src/lib/cluster/services/assets.js +0 -224
  8. package/dist/src/lib/cluster/services/cluster/backends/kubernetesV2/index.js +0 -192
  9. package/dist/src/lib/cluster/services/cluster/backends/kubernetesV2/interfaces.js +0 -2
  10. package/dist/src/lib/cluster/services/cluster/backends/kubernetesV2/k8s.js +0 -419
  11. package/dist/src/lib/cluster/services/cluster/backends/kubernetesV2/k8sDeploymentResource.js +0 -60
  12. package/dist/src/lib/cluster/services/cluster/backends/kubernetesV2/k8sJobResource.js +0 -55
  13. package/dist/src/lib/cluster/services/cluster/backends/kubernetesV2/k8sResource.js +0 -357
  14. package/dist/src/lib/cluster/services/cluster/backends/kubernetesV2/k8sServiceResource.js +0 -37
  15. package/dist/src/lib/cluster/services/cluster/backends/kubernetesV2/k8sState.js +0 -60
  16. package/dist/src/lib/cluster/services/cluster/backends/kubernetesV2/utils.js +0 -170
  17. package/dist/src/lib/cluster/services/cluster/backends/native/dispatch.js +0 -13
  18. package/dist/src/lib/cluster/services/cluster/backends/native/index.js +0 -526
  19. package/dist/src/lib/cluster/services/cluster/backends/native/messaging.js +0 -548
  20. package/dist/src/lib/cluster/services/cluster/backends/state-utils.js +0 -26
  21. package/dist/src/lib/cluster/services/cluster/index.js +0 -13
  22. package/dist/src/lib/cluster/services/execution.js +0 -435
  23. package/dist/src/lib/cluster/services/index.js +0 -6
  24. package/dist/src/lib/cluster/services/interfaces.js +0 -2
  25. package/dist/src/lib/cluster/services/jobs.js +0 -458
  26. package/dist/src/lib/config/default-sysconfig.js +0 -25
  27. package/dist/src/lib/config/index.js +0 -20
  28. package/dist/src/lib/config/schemas/system.js +0 -360
  29. package/dist/src/lib/storage/analytics.js +0 -86
  30. package/dist/src/lib/storage/assets.js +0 -401
  31. package/dist/src/lib/storage/backends/elasticsearch_store.js +0 -496
  32. package/dist/src/lib/storage/backends/mappings/analytics.js +0 -20
  33. package/dist/src/lib/storage/backends/mappings/asset.js +0 -32
  34. package/dist/src/lib/storage/backends/mappings/ex.js +0 -53
  35. package/dist/src/lib/storage/backends/mappings/job.js +0 -42
  36. package/dist/src/lib/storage/backends/mappings/state.js +0 -16
  37. package/dist/src/lib/storage/backends/s3_store.js +0 -237
  38. package/dist/src/lib/storage/execution.js +0 -302
  39. package/dist/src/lib/storage/index.js +0 -7
  40. package/dist/src/lib/storage/jobs.js +0 -81
  41. package/dist/src/lib/storage/state.js +0 -254
  42. package/dist/src/lib/utils/api_utils.js +0 -128
  43. package/dist/src/lib/utils/asset_utils.js +0 -94
  44. package/dist/src/lib/utils/date_utils.js +0 -52
  45. package/dist/src/lib/utils/encoding_utils.js +0 -27
  46. package/dist/src/lib/utils/events.js +0 -4
  47. package/dist/src/lib/utils/file_utils.js +0 -124
  48. package/dist/src/lib/utils/id_utils.js +0 -15
  49. package/dist/src/lib/utils/port_utils.js +0 -32
  50. package/dist/src/lib/workers/assets/index.js +0 -3
  51. package/dist/src/lib/workers/assets/loader-executable.js +0 -40
  52. package/dist/src/lib/workers/assets/loader.js +0 -73
  53. package/dist/src/lib/workers/assets/spawn.js +0 -55
  54. package/dist/src/lib/workers/context/execution-context.js +0 -12
  55. package/dist/src/lib/workers/context/terafoundation-context.js +0 -8
  56. package/dist/src/lib/workers/execution-controller/execution-analytics.js +0 -188
  57. package/dist/src/lib/workers/execution-controller/index.js +0 -1024
  58. package/dist/src/lib/workers/execution-controller/recovery.js +0 -151
  59. package/dist/src/lib/workers/execution-controller/scheduler.js +0 -390
  60. package/dist/src/lib/workers/execution-controller/slice-analytics.js +0 -96
  61. package/dist/src/lib/workers/helpers/job.js +0 -80
  62. package/dist/src/lib/workers/helpers/op-analytics.js +0 -22
  63. package/dist/src/lib/workers/helpers/terafoundation.js +0 -34
  64. package/dist/src/lib/workers/helpers/worker-shutdown.js +0 -147
  65. package/dist/src/lib/workers/metrics/index.js +0 -108
  66. package/dist/src/lib/workers/worker/index.js +0 -378
  67. package/dist/src/lib/workers/worker/slice.js +0 -122
  68. package/dist/test/config/schemas/system_schema-spec.js +0 -26
  69. package/dist/test/lib/cluster/services/cluster/backends/kubernetes/v2/k8s-v2-spec.js +0 -458
  70. package/dist/test/lib/cluster/services/cluster/backends/kubernetes/v2/k8sResource-v2-spec.js +0 -818
  71. package/dist/test/lib/cluster/services/cluster/backends/kubernetes/v2/k8sState-multicluster-v2-spec.js +0 -67
  72. package/dist/test/lib/cluster/services/cluster/backends/kubernetes/v2/k8sState-v2-spec.js +0 -84
  73. package/dist/test/lib/cluster/services/cluster/backends/kubernetes/v2/utils-v2-spec.js +0 -320
  74. package/dist/test/lib/cluster/services/cluster/backends/state-utils-spec.js +0 -37
  75. package/dist/test/node_master-spec.js +0 -194
  76. package/dist/test/services/api-spec.js +0 -79
  77. package/dist/test/services/assets-spec.js +0 -158
  78. package/dist/test/services/messaging-spec.js +0 -440
  79. package/dist/test/storage/assets_storage-spec.js +0 -95
  80. package/dist/test/storage/s3_store-spec.js +0 -149
  81. package/dist/test/test.config.js +0 -23
  82. package/dist/test/test.setup.js +0 -6
  83. package/dist/test/utils/api_utils-spec.js +0 -25
  84. package/dist/test/utils/asset_utils-spec.js +0 -141
  85. package/dist/test/utils/elastic_utils-spec.js +0 -25
  86. package/dist/test/workers/execution-controller/execution-controller-spec.js +0 -371
  87. package/dist/test/workers/execution-controller/execution-special-test-cases-spec.js +0 -519
  88. package/dist/test/workers/execution-controller/execution-test-cases-spec.js +0 -343
  89. package/dist/test/workers/execution-controller/recovery-spec.js +0 -160
  90. package/dist/test/workers/execution-controller/scheduler-spec.js +0 -249
  91. package/dist/test/workers/execution-controller/slice-analytics-spec.js +0 -121
  92. package/dist/test/workers/fixtures/ops/example-op/processor.js +0 -20
  93. package/dist/test/workers/fixtures/ops/example-op/schema.js +0 -19
  94. package/dist/test/workers/fixtures/ops/example-reader/fetcher.js +0 -20
  95. package/dist/test/workers/fixtures/ops/example-reader/schema.js +0 -41
  96. package/dist/test/workers/fixtures/ops/example-reader/slicer.js +0 -37
  97. package/dist/test/workers/fixtures/ops/new-op/processor.js +0 -29
  98. package/dist/test/workers/fixtures/ops/new-op/schema.js +0 -18
  99. package/dist/test/workers/fixtures/ops/new-reader/fetcher.js +0 -19
  100. package/dist/test/workers/fixtures/ops/new-reader/schema.js +0 -23
  101. package/dist/test/workers/fixtures/ops/new-reader/slicer.js +0 -13
  102. package/dist/test/workers/helpers/configs.js +0 -128
  103. package/dist/test/workers/helpers/execution-controller-helper.js +0 -49
  104. package/dist/test/workers/helpers/index.js +0 -5
  105. package/dist/test/workers/helpers/test-context.js +0 -210
  106. package/dist/test/workers/helpers/zip-directory.js +0 -25
  107. package/dist/test/workers/worker/slice-spec.js +0 -333
  108. package/dist/test/workers/worker/worker-spec.js +0 -356
@@ -1,80 +0,0 @@
1
- import { makeISODate } from '@terascope/core-utils';
2
- import { JobValidator } from '@terascope/job-components';
3
- import { JobsStorage, ExecutionStorage, StateStorage } from '../../storage/index.js';
4
- // TODO: fix type here
5
- export async function validateJob(context, jobSpec) {
6
- const jobValidator = new JobValidator(context);
7
- try {
8
- return await jobValidator.validateConfig(jobSpec);
9
- }
10
- catch (error) {
11
- throw new Error(`validating job: ${error}`);
12
- }
13
- }
14
- export async function initializeTestExecution({ context, config, stores = {}, isRecovery = false, cleanupType, createRecovery = true, shutdownStores = false, recoverySlices = [], lastStatus = 'failed' }) {
15
- if (!stores.jobStore) {
16
- const [jobStore, exStore, stateStore] = await Promise.all([
17
- (async () => {
18
- const store = new JobsStorage(context);
19
- await store.initialize();
20
- return store;
21
- })(),
22
- (async () => {
23
- const store = new ExecutionStorage(context);
24
- await store.initialize();
25
- return store;
26
- })(),
27
- (async () => {
28
- const store = new StateStorage(context);
29
- await store.initialize();
30
- return store;
31
- })(),
32
- ]);
33
- stores.jobStore = jobStore;
34
- stores.exStore = exStore;
35
- stores.stateStore = stateStore;
36
- }
37
- const validJob = await validateJob(context, config);
38
- const jobSpec = await stores.jobStore.create(config);
39
- const job = Object.assign({}, jobSpec, validJob, {
40
- job_id: jobSpec.job_id
41
- });
42
- // @ts-expect-error
43
- const slicerHostname = job.slicer_hostname;
44
- // @ts-expect-error
45
- const slicerPort = job.slicer_port;
46
- let ex;
47
- if (isRecovery) {
48
- ex = await stores.exStore.create(job, lastStatus);
49
- if (recoverySlices.length) {
50
- await Promise.all(recoverySlices
51
- .map(({ slice, state }) => stores.stateStore.createState(ex.ex_id, slice, state, slice.error)));
52
- await stores.stateStore.refresh();
53
- }
54
- if (createRecovery) {
55
- ex = await stores.exStore.createRecoveredExecution(ex, cleanupType);
56
- }
57
- }
58
- else {
59
- ex = await stores.exStore.create(job);
60
- }
61
- if (slicerHostname && slicerPort) {
62
- ex = await stores.exStore.updatePartial(ex.ex_id, async (existing) => Object.assign(existing, {
63
- slicer_hostname: slicerHostname,
64
- slicer_port: slicerPort,
65
- _updated: makeISODate()
66
- }));
67
- }
68
- if (shutdownStores) {
69
- await Promise.all([
70
- stores.exStore.shutdown(true),
71
- stores.jobStore.shutdown(true),
72
- stores.stateStore.shutdown(true)
73
- ]);
74
- }
75
- return {
76
- job,
77
- ex,
78
- };
79
- }
80
- //# sourceMappingURL=job.js.map
@@ -1,22 +0,0 @@
1
- import { isString, isArray, truncate, } from '@terascope/core-utils';
2
- function formatVal(value) {
3
- if (isString(value))
4
- return `"${value}"`;
5
- if (isArray(value))
6
- return `[${value.join(', ')}]`;
7
- return truncate(JSON.stringify(value), 30);
8
- }
9
- function format(input) {
10
- const list = [];
11
- for (const [key, value] of Object.entries(input)) {
12
- list.push(`${key}: ${formatVal(value)}`);
13
- }
14
- return list.join(', ');
15
- }
16
- // TODO: fix type here
17
- export function logOpStats(logger, slice, analyticsData) {
18
- const { request, ...record } = slice;
19
- const obj = Object.assign({}, record, analyticsData);
20
- logger.info(`analytics for slice: ${format(obj)}`);
21
- }
22
- //# sourceMappingURL=op-analytics.js.map
@@ -1,34 +0,0 @@
1
- import { get, isFunction, isString } from '@terascope/core-utils';
2
- import { makeContextLogger } from '@terascope/job-components';
3
- import { safeDecode } from '../../utils/encoding_utils.js';
4
- export function generateWorkerId(context) {
5
- const { hostname } = context.sysconfig.teraslice;
6
- const clusterId = get(context, 'cluster.worker.id');
7
- return `${hostname}__${clusterId}`;
8
- }
9
- export function makeLogger(context, moduleName, extra = {}) {
10
- if (!context || !context.apis) {
11
- throw new Error('makeLogger expected terafoundation context as first arg');
12
- }
13
- if (!moduleName || !isString(moduleName)) {
14
- throw new Error('makeLogger expected module name as second arg');
15
- }
16
- const exAPI = context.apis.executionContext;
17
- if (exAPI && isFunction(exAPI.makeLogger)) {
18
- return exAPI.makeLogger(moduleName, extra);
19
- }
20
- const defaultContext = {};
21
- if (process.env.EX) {
22
- const ex = safeDecode(process.env.EX);
23
- const exId = get(ex, 'ex_id');
24
- const jobId = get(ex, 'job_id');
25
- if (exId) {
26
- defaultContext.ex_id = exId;
27
- }
28
- if (jobId) {
29
- defaultContext.job_id = jobId;
30
- }
31
- }
32
- return makeContextLogger(context, moduleName, Object.assign(defaultContext, extra));
33
- }
34
- //# sourceMappingURL=terafoundation.js.map
@@ -1,147 +0,0 @@
1
- import { get, pDelay, pRaceWithTimeout, isError, logError } from '@terascope/core-utils';
2
- import ms from 'ms';
3
- import { makeLogger } from './terafoundation.js';
4
- export function waitForWorkerShutdown(context, eventName) {
5
- const shutdownTimeout = get(context, 'sysconfig.teraslice.shutdown_timeout', 30000);
6
- const events = context.apis.foundation.getSystemEvents();
7
- return new Promise((resolve, reject) => {
8
- const timeoutId = setTimeout(() => {
9
- events.removeListener(eventName, handler);
10
- reject(new Error('Timeout waiting for worker to shutdown'));
11
- }, shutdownTimeout);
12
- function handler(err) {
13
- clearTimeout(timeoutId);
14
- if (isError(err)) {
15
- reject(err);
16
- }
17
- else {
18
- resolve(true);
19
- }
20
- }
21
- events.once(eventName, handler);
22
- });
23
- }
24
- /* istanbul ignore next */
25
- export function shutdownHandler(context, shutdownFn) {
26
- const assignment = context.assignment
27
- || process.env.NODE_TYPE
28
- || process.env.assignment
29
- || 'unknown-assignment';
30
- // this is native clustering only
31
- const isProcessRestart = process.env.__process_restart;
32
- const api = {
33
- exiting: false,
34
- exit
35
- };
36
- const shutdownTimeout = get(context, 'sysconfig.teraslice.shutdown_timeout', 20 * 1000);
37
- const events = context.apis.foundation.getSystemEvents();
38
- const logger = makeLogger(context, `${assignment}:shutdown_handler`);
39
- if (assignment === 'execution_controller' && isProcessRestart) {
40
- logger.fatal('Execution Controller runtime error led to a restart, terminating execution with failed status, please use the recover api to return slicer to a consistent state');
41
- process.exit(0);
42
- }
43
- async function flushLogs() {
44
- try {
45
- await logger.flush();
46
- await pDelay(1000);
47
- const code = process.exitCode || 0;
48
- logger.debug(`flushed logs successfully, will exit with code ${code}`);
49
- }
50
- catch (err) {
51
- logError(logger, err, 'flush error on shutdown');
52
- }
53
- }
54
- let startTime;
55
- function exitingIn() {
56
- if (!api.exiting) {
57
- return `exiting in ${ms(shutdownTimeout)}...`;
58
- }
59
- const elapsed = Date.now() - startTime;
60
- return `already shutting down, remaining ${ms(shutdownTimeout - elapsed)}`;
61
- }
62
- async function callShutdownFn(event, err) {
63
- // avoid failing before the promise is try / catched in pRaceWithTimeout
64
- await pDelay(100);
65
- await shutdownFn(event, err);
66
- }
67
- async function shutdownWithTimeout(event, err) {
68
- const timeout = shutdownTimeout - 2000;
69
- await pRaceWithTimeout(callShutdownFn(event, err), timeout, (timeoutErr) => {
70
- logError(logger, timeoutErr, 'shutdown error after timeout');
71
- });
72
- }
73
- async function exit(event, err) {
74
- if (api.exiting)
75
- return;
76
- if (err) {
77
- if (err.name.includes('Error')) {
78
- setStatusCode(1);
79
- }
80
- }
81
- api.exiting = true;
82
- startTime = Date.now();
83
- try {
84
- await shutdownWithTimeout(event, err);
85
- }
86
- catch (error) {
87
- logError(logger, error, `${assignment} while shutting down`);
88
- }
89
- finally {
90
- await flushLogs();
91
- const code = process.exitCode != null ? process.exitCode : 0;
92
- logger.info(`${assignment} shutdown took ${ms(Date.now() - startTime)}, exit with ${code} status code`);
93
- process.exit();
94
- }
95
- }
96
- function setStatusCode(code) {
97
- if (api.exiting)
98
- return;
99
- if (process.exitCode == null) {
100
- process.exitCode = code;
101
- }
102
- }
103
- process.on('SIGINT', () => {
104
- logger.info(`${assignment} received process:SIGINT, ${exitingIn()}`);
105
- setStatusCode(0);
106
- exit('SIGINT');
107
- });
108
- process.on('SIGTERM', () => {
109
- logger.info(`${assignment} received process:SIGTERM, ${exitingIn()}`);
110
- setStatusCode(0);
111
- exit('SIGTERM');
112
- });
113
- process.on('uncaughtException', (err) => {
114
- logError(logger, err, `${assignment} received an uncaughtException, ${exitingIn()}`);
115
- setStatusCode(1);
116
- exit('uncaughtException', err);
117
- });
118
- process.once('unhandledRejection', (err) => {
119
- logError(logger, err, `${assignment} received an unhandledRejection, ${exitingIn()}`);
120
- setStatusCode(1);
121
- exit('unhandledRejection', err);
122
- });
123
- // See https://github.com/trentm/node-bunyan/issues/246
124
- function handleStdError(err) {
125
- // @ts-expect-error TODO: fix error type
126
- if (err.code === 'EPIPE' || err.code === 'ERR_STREAM_DESTROYED') {
127
- // ignore
128
- }
129
- else {
130
- throw err;
131
- }
132
- }
133
- process.stdout.on('error', handleStdError);
134
- process.stderr.on('error', handleStdError);
135
- events.once('worker:shutdown:complete', (err) => {
136
- setStatusCode(0);
137
- if (err) {
138
- logError(logger, err, `${assignment} shutdown error, ${exitingIn()}`);
139
- }
140
- else {
141
- logger.info(`${assignment} shutdown, ${exitingIn()}`);
142
- }
143
- exit('worker:shutdown:complete', err);
144
- });
145
- return api;
146
- }
147
- //# sourceMappingURL=worker-shutdown.js.map
@@ -1,108 +0,0 @@
1
- import { EventEmitter } from 'node:events';
2
- import { debugLogger, isTest } from '@terascope/core-utils';
3
- const defaultLogger = debugLogger('metrics');
4
- export class Metrics extends EventEmitter {
5
- logger;
6
- _intervals;
7
- eventLoopInterval;
8
- // TODO: fix types here
9
- _typesCollectedAt;
10
- gcStats;
11
- eventLoopStats;
12
- constructor(config) {
13
- super();
14
- const argLogger = config && config.logger;
15
- this.logger = argLogger
16
- ? argLogger.child({
17
- module: 'performance:metrics'
18
- })
19
- : defaultLogger;
20
- this.eventLoopInterval = isTest ? 100 : 5000;
21
- this._intervals = [];
22
- this._typesCollectedAt = {};
23
- this.gcStats = null;
24
- }
25
- async initialize() {
26
- // never cause an unwanted error
27
- try {
28
- const module = await import('gc-stats');
29
- this.gcStats = module.default();
30
- }
31
- catch (err) {
32
- this.logger.error(err, 'Failure to construct gc-stats');
33
- }
34
- try {
35
- this.eventLoopStats = await import('event-loop-stats');
36
- }
37
- catch (err) {
38
- this.logger.error(err, 'Failure to construct event-loop-stats');
39
- }
40
- const gcEnabled = this.gcStats != null;
41
- const loopEnabled = this.eventLoopStats != null;
42
- this.logger.info('initializing performance metrics', {
43
- gcEnabled,
44
- loopEnabled
45
- });
46
- if (this.gcStats !== null) {
47
- // https://github.com/dainis/node-gcstats#property-insights
48
- const typesToName = {
49
- 1: 'Scavenge',
50
- 2: 'MarkSweepCompact',
51
- 4: 'IncrementalMarking',
52
- 8: 'WeakPhantomCallbackProcessing',
53
- 15: 'All'
54
- };
55
- this.gcStats.on('stats', (metrics) => {
56
- // never cause an unwanted error
57
- if (!metrics) {
58
- this.logger.warn('invalid metrics received for gc stats', metrics);
59
- return;
60
- }
61
- const typeName = typesToName[metrics.gctype];
62
- this._emitMetric('gc-stats', Object.assign({ typeName }, metrics));
63
- });
64
- }
65
- if (loopEnabled) {
66
- // https://github.com/bripkens/event-loop-stats#property-insights
67
- this._intervals.push(setInterval(() => {
68
- // never cause an unwanted error
69
- let metrics;
70
- try {
71
- metrics = this.eventLoopStats.sense();
72
- }
73
- catch (err) {
74
- this.logger.error(err, 'failure getting for event-loop-stats');
75
- return;
76
- }
77
- if (!metrics) {
78
- this.logger.warn('invalid metrics received for event-loop-stats', metrics);
79
- return;
80
- }
81
- this._emitMetric('event-loop-stats', metrics);
82
- }, this.eventLoopInterval));
83
- }
84
- }
85
- async shutdown() {
86
- try {
87
- this._intervals.forEach(clearInterval);
88
- this._intervals = [];
89
- this.removeAllListeners();
90
- this._typesCollectedAt = {};
91
- }
92
- catch (err) {
93
- this.logger.debug(err, 'failure shutting down metrics');
94
- }
95
- }
96
- _emitMetric(type, metrics) {
97
- const lastCollectedAt = this._typesCollectedAt[type] || Date.now();
98
- const msg = {
99
- type,
100
- timeSinceLast: Date.now() - lastCollectedAt,
101
- metrics
102
- };
103
- this._typesCollectedAt[type] = Date.now();
104
- this.emit('metric', msg);
105
- this.logger.info(msg, `${type} performance metrics`);
106
- }
107
- }
108
- //# sourceMappingURL=index.js.map