Skip to content

Commit 83a9b63

Browse files
committed
[DDW-826] Separation of cardano-node start and disk-space-checking
1 parent d46449a commit 83a9b63

File tree

6 files changed

+127
-322
lines changed

6 files changed

+127
-322
lines changed

package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@
111111
"eslint-config-airbnb": "18.2.0",
112112
"eslint-config-prettier": "6.12.0",
113113
"eslint-formatter-pretty": "4.0.0",
114-
"eslint-import-resolver-webpack": "^0.13.1",
114+
"eslint-import-resolver-webpack": "0.13.1",
115115
"eslint-plugin-flowtype": "5.2.0",
116116
"eslint-plugin-import": "2.23.3",
117117
"eslint-plugin-jsx-a11y": "6.3.1",
@@ -182,7 +182,7 @@
182182
"cardano-js": "0.4.7",
183183
"cardano-launcher": "0.20210215.0",
184184
"cbor": "5.0.2",
185-
"check-disk-space": "2.1.0",
185+
"check-disk-space": "3.0.1",
186186
"chroma-js": "2.1.0",
187187
"classnames": "2.2.6",
188188
"csv-stringify": "5.5.1",

source/common/ipc/api.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ export type ToggleUiPartRendererResponse = void;
111111
* Channel for checking the disk space available
112112
*/
113113
export const GET_DISK_SPACE_STATUS_CHANNEL = 'GetDiskSpaceStatusChannel';
114-
export type GetDiskSpaceStatusRendererRequest = number | any;
114+
export type GetDiskSpaceStatusRendererRequest = void;
115115
export type GetDiskSpaceStatusMainResponse = CheckDiskSpaceResponse;
116116

117117
/**

source/common/types/no-disk-space.types.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,7 @@ export type CheckDiskSpaceResponse = {
55
diskSpaceMissing: string,
66
diskSpaceRecommended: string,
77
diskSpaceAvailable: string,
8+
diskSpaceAvailableRaw: number,
9+
diskTotalSpaceRaw: number,
810
hadNotEnoughSpaceLeft: boolean,
911
};

source/main/config.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,8 @@ export const DISK_SPACE_CHECK_MEDIUM_INTERVAL = 60 * 1000; // 1 minute | unit: m
164164
export const DISK_SPACE_CHECK_SHORT_INTERVAL = isTest ? 2000 : 10 * 1000; // 10 seconds | unit: milliseconds
165165
export const DISK_SPACE_RECOMMENDED_PERCENTAGE = 15; // 15% of the total disk space
166166

167+
export const DISK_SPACE_CHECK_TIMEOUT = 5000; // Timeout for checking disks pace
168+
167169
export const BLOCK_REPLAY_PROGRESS_CHECK_INTERVAL = 1 * 1000; // 1 seconds | unit: milliseconds
168170

169171
// Used if token metadata server URL is not defined in launcher config

source/main/utils/handleDiskSpace.js

Lines changed: 101 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,58 @@ import {
1111
DISK_SPACE_CHECK_MEDIUM_INTERVAL,
1212
DISK_SPACE_CHECK_SHORT_INTERVAL,
1313
DISK_SPACE_RECOMMENDED_PERCENTAGE,
14+
DISK_SPACE_CHECK_TIMEOUT,
1415
stateDirectoryPath,
1516
} from '../config';
1617
import { CardanoNodeStates } from '../../common/types/cardano-node.types';
1718
import { CardanoNode } from '../cardano/CardanoNode';
1819
import type { CheckDiskSpaceResponse } from '../../common/types/no-disk-space.types';
1920

21+
const getDiskCheckReport = async (
22+
path: string,
23+
timeout: number = DISK_SPACE_CHECK_TIMEOUT
24+
): Promise<CheckDiskSpaceResponse> => {
25+
const initialReport = {
26+
isNotEnoughDiskSpace: false,
27+
diskSpaceRequired: '',
28+
diskSpaceMissing: '',
29+
diskSpaceRecommended: '',
30+
diskSpaceAvailable: '',
31+
hadNotEnoughSpaceLeft: false,
32+
};
33+
34+
return Promise.race([
35+
new Promise((resolve, reject) => {
36+
checkDiskSpace(path)
37+
.then(({ free, size }) => {
38+
logger.error('[DISK-SPACE-DEBUG] Disk space check completed', {
39+
free,
40+
size,
41+
});
42+
resolve({
43+
...initialReport,
44+
diskSpaceAvailableRaw: free,
45+
diskTotalSpace: size,
46+
diskSpaceAvailable: prettysize(free),
47+
});
48+
})
49+
.catch((error) => {
50+
logger.error(
51+
'[DISK-SPACE-DEBUG] Error getting diskCheckReport',
52+
error
53+
);
54+
reject();
55+
});
56+
}),
57+
// Timeout promise
58+
new Promise((resolve) => {
59+
setTimeout(() => {
60+
resolve();
61+
}, timeout);
62+
}),
63+
]);
64+
};
65+
2066
export const handleDiskSpace = (
2167
mainWindow: BrowserWindow,
2268
cardanoNode: CardanoNode
@@ -30,56 +76,58 @@ export const handleDiskSpace = (
3076
forceDiskSpaceRequired?: number
3177
): Promise<CheckDiskSpaceResponse> => {
3278
const diskSpaceRequired = forceDiskSpaceRequired || DISK_SPACE_REQUIRED;
79+
3380
try {
34-
const {
35-
free: diskSpaceAvailable,
36-
size: diskTotalSpace,
37-
} = await checkDiskSpace(stateDirectoryPath);
38-
const diskSpaceMissing = Math.max(
39-
diskSpaceRequired - diskSpaceAvailable,
40-
0
41-
);
42-
const diskSpaceRecommended =
43-
(diskTotalSpace * DISK_SPACE_RECOMMENDED_PERCENTAGE) / 100;
44-
const diskSpaceRequiredMargin =
45-
diskSpaceRequired -
46-
(diskSpaceRequired * DISK_SPACE_REQUIRED_MARGIN_PERCENTAGE) / 100;
47-
48-
if (diskSpaceAvailable <= diskSpaceRequiredMargin) {
49-
if (!isNotEnoughDiskSpace) {
50-
// State change: transitioning from enough to not-enough disk space
51-
setDiskSpaceIntervalChecking(DISK_SPACE_CHECK_SHORT_INTERVAL);
52-
isNotEnoughDiskSpace = true;
53-
}
54-
} else if (diskSpaceAvailable >= diskSpaceRequired) {
55-
const newDiskSpaceCheckIntervalLength =
56-
diskSpaceAvailable >= diskSpaceRequired * 2
57-
? DISK_SPACE_CHECK_LONG_INTERVAL
58-
: DISK_SPACE_CHECK_MEDIUM_INTERVAL;
59-
if (isNotEnoughDiskSpace) {
60-
// State change: transitioning from not-enough to enough disk space
61-
setDiskSpaceIntervalChecking(newDiskSpaceCheckIntervalLength);
62-
isNotEnoughDiskSpace = false;
63-
} else if (
64-
newDiskSpaceCheckIntervalLength !== diskSpaceCheckIntervalLength
65-
) {
66-
// Interval change: transitioning from medium to long interval (or vice versa)
67-
// This is a special case in which we adjust the disk space check polling interval:
68-
// - more than 2x of available space than required: LONG interval
69-
// - less than 2x of available space than required: MEDIUM interval
70-
setDiskSpaceIntervalChecking(newDiskSpaceCheckIntervalLength);
81+
const response = await getDiskCheckReport(stateDirectoryPath);
82+
83+
if (response.diskSpaceAvailableRaw) {
84+
const diskSpaceMissing = Math.max(
85+
diskSpaceRequired - response.diskSpaceAvailableRaw,
86+
0
87+
);
88+
const diskSpaceRecommended =
89+
(response.diskTotalSpaceRaw * DISK_SPACE_RECOMMENDED_PERCENTAGE) /
90+
100;
91+
const diskSpaceRequiredMargin =
92+
diskSpaceRequired -
93+
(diskSpaceRequired * DISK_SPACE_REQUIRED_MARGIN_PERCENTAGE) / 100;
94+
95+
if (response.diskSpaceAvailableRaw <= diskSpaceRequiredMargin) {
96+
if (!isNotEnoughDiskSpace) {
97+
// State change: transitioning from enough to not-enough disk space
98+
setDiskSpaceIntervalChecking(DISK_SPACE_CHECK_SHORT_INTERVAL);
99+
isNotEnoughDiskSpace = true;
100+
}
101+
} else if (response.diskSpaceAvailableRaw >= diskSpaceRequired) {
102+
const newDiskSpaceCheckIntervalLength =
103+
response.diskSpaceAvailableRaw >= diskSpaceRequired * 2
104+
? DISK_SPACE_CHECK_LONG_INTERVAL
105+
: DISK_SPACE_CHECK_MEDIUM_INTERVAL;
106+
if (isNotEnoughDiskSpace) {
107+
// State change: transitioning from not-enough to enough disk space
108+
setDiskSpaceIntervalChecking(newDiskSpaceCheckIntervalLength);
109+
isNotEnoughDiskSpace = false;
110+
} else if (
111+
newDiskSpaceCheckIntervalLength !== diskSpaceCheckIntervalLength
112+
) {
113+
// Interval change: transitioning from medium to long interval (or vice versa)
114+
// This is a special case in which we adjust the disk space check polling interval:
115+
// - more than 2x of available space than required: LONG interval
116+
// - less than 2x of available space than required: MEDIUM interval
117+
setDiskSpaceIntervalChecking(newDiskSpaceCheckIntervalLength);
118+
}
71119
}
120+
response.isNotEnoughDiskSpace = isNotEnoughDiskSpace;
121+
response.diskSpaceRequired = prettysize(diskSpaceRequired);
122+
response.diskSpaceMissing = prettysize(diskSpaceMissing);
123+
response.diskSpaceRecommended = prettysize(diskSpaceRecommended);
124+
response.hadNotEnoughSpaceLeft = hadNotEnoughSpaceLeft;
125+
} else {
126+
logger.info(
127+
'[DISK-SPACE-DEBUG] We could not check disk space, but we will try to start cardano-node anyway'
128+
);
72129
}
73130

74-
const response = {
75-
isNotEnoughDiskSpace,
76-
diskSpaceRequired: prettysize(diskSpaceRequired),
77-
diskSpaceMissing: prettysize(diskSpaceMissing),
78-
diskSpaceRecommended: prettysize(diskSpaceRecommended),
79-
diskSpaceAvailable: prettysize(diskSpaceAvailable),
80-
hadNotEnoughSpaceLeft,
81-
};
82-
83131
const NO_SPACE_AND_CARDANO_NODE_CAN_BE_STOPPED =
84132
isNotEnoughDiskSpace &&
85133
cardanoNode.state !== CardanoNodeStates.STOPPING &&
@@ -128,22 +176,14 @@ export const handleDiskSpace = (
128176
await getDiskSpaceStatusChannel.send(response, mainWindow.webContents);
129177
return response;
130178
} catch (error) {
179+
logger.error('[DISK-SPACE-DEBUG] Unknown error', error);
131180
// Remove diskSpaceCheckInterval if set
132181
if (diskSpaceCheckInterval) {
133182
clearInterval(diskSpaceCheckInterval);
134183
// Reset to default check interval
135184
diskSpaceCheckIntervalLength = DISK_SPACE_CHECK_LONG_INTERVAL;
136185
}
137-
const response = {
138-
isNotEnoughDiskSpace: false,
139-
diskSpaceRequired: '',
140-
diskSpaceMissing: '',
141-
diskSpaceRecommended: '',
142-
diskSpaceAvailable: '',
143-
hadNotEnoughSpaceLeft: false,
144-
};
145-
await getDiskSpaceStatusChannel.send(response, mainWindow.webContents);
146-
return response;
186+
// TODO: What do we do here ? Errors checking disk space is already handled
147187
}
148188
};
149189

@@ -153,17 +193,18 @@ export const handleDiskSpace = (
153193
clearInterval(diskSpaceCheckInterval);
154194
diskSpaceCheckInterval = setInterval(async () => {
155195
const response = await handleCheckDiskSpace(hadNotEnoughSpaceLeft);
156-
hadNotEnoughSpaceLeft = response.hadNotEnoughSpaceLeft;
196+
hadNotEnoughSpaceLeft = response?.hadNotEnoughSpaceLeft;
157197
}, interval);
158198
diskSpaceCheckIntervalLength = interval;
159199
};
160200

161201
// Start default interval
162202
setDiskSpaceIntervalChecking(diskSpaceCheckIntervalLength);
163203

164-
getDiskSpaceStatusChannel.onReceive((diskSpaceRequired) =>
165-
handleCheckDiskSpace(hadNotEnoughSpaceLeft, diskSpaceRequired)
166-
);
204+
getDiskSpaceStatusChannel.onReceive(async () => {
205+
const report = await getDiskCheckReport(stateDirectoryPath);
206+
await getDiskSpaceStatusChannel.send(report, mainWindow.webContents);
207+
});
167208

168209
return handleCheckDiskSpace;
169210
};

0 commit comments

Comments
 (0)