Skip to content

Commit e7ad4f3

Browse files
authored
chore(dashmate): report port check errors (#2245)
1 parent 1c35386 commit e7ad4f3

File tree

5 files changed

+34
-19
lines changed

5 files changed

+34
-19
lines changed

packages/dashmate/src/listr/tasks/doctor/collectSamplesTaskFactory.js

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,8 @@ export default function collectSamplesTaskFactory(
167167
title: 'Core P2P port',
168168
task: async () => {
169169
const port = config.get('core.p2p.port');
170-
const response = await providers.mnowatch.checkPortStatus(port, config.get('externalIp'));
170+
const response = await providers.mnowatch.checkPortStatus(port, config.get('externalIp'))
171+
.catch((e) => e.toString());
171172

172173
ctx.samples.setServiceInfo('core', 'p2pPort', response);
173174
},
@@ -177,7 +178,8 @@ export default function collectSamplesTaskFactory(
177178
enabled: () => config.get('platform.enable'),
178179
task: async () => {
179180
const port = config.get('platform.gateway.listeners.dapiAndDrive.port');
180-
const response = await providers.mnowatch.checkPortStatus(port, config.get('externalIp'));
181+
const response = await providers.mnowatch.checkPortStatus(port, config.get('externalIp'))
182+
.catch((e) => e.toString());
181183

182184
ctx.samples.setServiceInfo('gateway', 'httpPort', response);
183185
},
@@ -186,7 +188,8 @@ export default function collectSamplesTaskFactory(
186188
title: 'Tenderdash P2P port',
187189
task: async () => {
188190
const port = config.get('platform.drive.tenderdash.p2p.port');
189-
const response = await providers.mnowatch.checkPortStatus(port, config.get('externalIp'));
191+
const response = await providers.mnowatch.checkPortStatus(port, config.get('externalIp'))
192+
.catch((e) => e.toString());
190193

191194
ctx.samples.setServiceInfo('drive_tenderdash', 'p2pPort', response);
192195
},

packages/dashmate/src/status/providers.js

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import https from 'https';
2-
import { PortStateEnum } from './enums/portState.js';
32

43
const MAX_REQUEST_TIMEOUT = 5000;
54
const MAX_RESPONSE_SIZE = 1 * 1024 * 1024; // 1 MB
@@ -82,10 +81,9 @@ export default {
8281
path: ip ? `/${port}/?validateIp=${ip}` : `/${port}/`,
8382
method: 'GET',
8483
family: 4, // Force IPv4
85-
timeout: MAX_REQUEST_TIMEOUT,
8684
};
8785

88-
return new Promise((resolve) => {
86+
return new Promise((resolve, reject) => {
8987
const req = https.request(options, (res) => {
9088
let data = '';
9189

@@ -95,9 +93,12 @@ export default {
9593
// eslint-disable-next-line no-console
9694
console.warn(`Port check request failed with status code ${res.statusCode}`);
9795
}
98-
// Consume response data to free up memory
99-
res.resume();
100-
resolve(PortStateEnum.ERROR);
96+
97+
const error = new Error(`Invalid status code ${res.statusCode}`);
98+
99+
res.destroy(error);
100+
101+
// Do not handle request further
101102
return;
102103
}
103104

@@ -109,14 +110,14 @@ export default {
109110
data += chunk;
110111

111112
if (data.length > MAX_RESPONSE_SIZE) {
112-
resolve(PortStateEnum.ERROR);
113-
114113
if (process.env.DEBUG) {
115114
// eslint-disable-next-line no-console
116115
console.warn('Port check response size exceeded');
117116
}
118117

119-
req.destroy();
118+
const error = new Error('Response size exceeded');
119+
120+
req.destroy(error);
120121
}
121122
});
122123

@@ -126,13 +127,19 @@ export default {
126127
});
127128
});
128129

130+
req.setTimeout(MAX_REQUEST_TIMEOUT, () => {
131+
const error = new Error('Port check timed out');
132+
133+
req.destroy(error);
134+
});
135+
129136
req.on('error', (e) => {
130137
if (process.env.DEBUG) {
131138
// eslint-disable-next-line no-console
132139
console.warn(`Port check request failed: ${e}`);
133140
}
134141

135-
resolve(PortStateEnum.ERROR);
142+
reject(e);
136143
});
137144

138145
req.end();

packages/dashmate/src/status/scopes/core.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
/* eslint-disable camelcase */
2+
import { PortStateEnum } from '../enums/portState.js';
23
import providers from '../providers.js';
34
import { ServiceStatusEnum } from '../enums/serviceStatus.js';
45
import { DockerStatusEnum } from '../enums/dockerStatus.js';
@@ -116,7 +117,8 @@ export default function getCoreScopeFactory(
116117

117118
const providersResult = await Promise.allSettled([
118119
providers.github.release('dashpay/dash'),
119-
providers.mnowatch.checkPortStatus(config.get('core.p2p.port'), config.get('externalIp')),
120+
providers.mnowatch.checkPortStatus(config.get('core.p2p.port'), config.get('externalIp'))
121+
.catch(() => PortStateEnum.ERROR),
120122
providers.insight(config.get('network')).status(),
121123
]);
122124

packages/dashmate/src/status/scopes/platform.js

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import prettyMs from 'pretty-ms';
2+
import { PortStateEnum } from '../enums/portState.js';
23
import DockerComposeError from '../../docker/errors/DockerComposeError.js';
34
import providers from '../providers.js';
45
import { DockerStatusEnum } from '../enums/dockerStatus.js';
@@ -90,8 +91,10 @@ export default function getPlatformScopeFactory(
9091
// Collecting platform data fails if Tenderdash is waiting for core to sync
9192
if (info.serviceStatus === ServiceStatusEnum.up) {
9293
const portStatusResult = await Promise.allSettled([
93-
providers.mnowatch.checkPortStatus(config.get('platform.gateway.listeners.dapiAndDrive.port'), config.get('externalIp')),
94-
providers.mnowatch.checkPortStatus(config.get('platform.drive.tenderdash.p2p.port'), config.get('externalIp')),
94+
providers.mnowatch.checkPortStatus(config.get('platform.gateway.listeners.dapiAndDrive.port'), config.get('externalIp'))
95+
.catch(() => PortStateEnum.ERROR),
96+
providers.mnowatch.checkPortStatus(config.get('platform.drive.tenderdash.p2p.port'), config.get('externalIp'))
97+
.catch(() => PortStateEnum.ERROR),
9598
]);
9699
const [httpPortState, p2pPortState] = portStatusResult.map((result) => (result.status === 'fulfilled' ? result.value : null));
97100

packages/dashmate/test/unit/status/scopes/core.spec.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ describe('getCoreScopeFactory', () => {
7878
});
7979

8080
mockGithubProvider.returns('v1337-dev');
81-
mockMNOWatchProvider.returns('OPEN');
81+
mockMNOWatchProvider.resolves('OPEN');
8282
mockInsightProvider.returns({
8383
status: this.sinon.stub().returns({
8484
info: { blocks: 1337 },
@@ -219,7 +219,7 @@ describe('getCoreScopeFactory', () => {
219219
});
220220

221221
mockGithubProvider.returns('v1337-dev');
222-
mockMNOWatchProvider.returns('OPEN');
222+
mockMNOWatchProvider.resolves('OPEN');
223223
mockInsightProvider.returns({
224224
status: this.sinon.stub().returns({
225225
info: { blocks: 1337 },
@@ -271,7 +271,7 @@ describe('getCoreScopeFactory', () => {
271271
});
272272

273273
mockGithubProvider.returns(Promise.reject());
274-
mockMNOWatchProvider.returns(PortStateEnum.ERROR);
274+
mockMNOWatchProvider.rejects(PortStateEnum.ERROR);
275275
mockInsightProvider.returns({
276276
status: () => Promise.reject(),
277277
});

0 commit comments

Comments
 (0)