Skip to content

Commit ccd4cbd

Browse files
authored
Merge pull request #2763 from input-output-hk/update-master-with-release-4.5.2-without-rts-flags
Update master with release 4.5.2 without rts flags
2 parents 679a44c + 6def156 commit ccd4cbd

File tree

10 files changed

+173
-348
lines changed

10 files changed

+173
-348
lines changed

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
# Changelog
22

3+
## 4.5.2
4+
5+
### Fixes
6+
7+
- Fixed Cardano Node starting/stopping issues
8+
39
## 4.5.1
410

511
### Fixes

package.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "daedalus",
33
"productName": "Daedalus",
4-
"version": "4.5.1",
4+
"version": "4.5.2",
55
"description": "Cryptocurrency Wallet",
66
"main": "./dist/main/index.js",
77
"scripts": {
@@ -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
/**
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,13 @@
11
// @flow
2+
23
export type CheckDiskSpaceResponse = {
34
isNotEnoughDiskSpace: boolean,
45
diskSpaceRequired: string,
56
diskSpaceMissing: string,
67
diskSpaceRecommended: string,
78
diskSpaceAvailable: string,
89
hadNotEnoughSpaceLeft: boolean,
10+
diskSpaceAvailableRaw: number,
11+
diskTotalSpaceRaw: number,
12+
isError: boolean,
913
};

source/main/config.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,10 +159,12 @@ export const NODE_UPDATE_TIMEOUT = isTest ? 10000 : 5 * 60 * 1000; // 5 minutes
159159

160160
export const DISK_SPACE_REQUIRED = 2 * 1073741274; // 2 GB | unit: bytes
161161
export const DISK_SPACE_REQUIRED_MARGIN_PERCENTAGE = 10; // 10% of the available disk space
162+
export const DISK_SPACE_CHECK_DONT_BOTHER_ME_INTERVAL = Number.MAX_SAFE_INTEGER; // Maximum interval
162163
export const DISK_SPACE_CHECK_LONG_INTERVAL = 10 * 60 * 1000; // 10 minutes | unit: milliseconds
163164
export const DISK_SPACE_CHECK_MEDIUM_INTERVAL = 60 * 1000; // 1 minute | unit: milliseconds
164165
export const DISK_SPACE_CHECK_SHORT_INTERVAL = isTest ? 2000 : 10 * 1000; // 10 seconds | unit: milliseconds
165166
export const DISK_SPACE_RECOMMENDED_PERCENTAGE = 15; // 15% of the total disk space
167+
export const DISK_SPACE_CHECK_TIMEOUT = 9 * 1000; // Timeout for checking disks pace
166168

167169
export const BLOCK_REPLAY_PROGRESS_CHECK_INTERVAL = 1 * 1000; // 1 seconds | unit: milliseconds
168170

source/main/index.js

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -118,8 +118,9 @@ const onAppReady = async () => {
118118
const platformVersion = os.release();
119119
const ram = JSON.stringify(os.totalmem(), null, 2);
120120
const startTime = new Date().toISOString();
121-
// first checks for japanese locale, otherwise returns english
121+
// first checks for Japanese locale, otherwise returns english
122122
const systemLocale = detectSystemLocale();
123+
const userLocale = getLocale(network);
123124

124125
const systemInfo = logSystemInfo({
125126
cardanoNodeVersion,
@@ -149,27 +150,29 @@ const onAppReady = async () => {
149150
cwd: process.cwd(),
150151
});
151152

153+
logger.info('System and user locale', { systemLocale, userLocale });
154+
152155
ensureXDGDataIsSet();
153156
await installChromeExtensions(isDev);
154157

155-
// Detect locale
156-
const locale = getLocale(network);
158+
logger.info('Setting up Main Window...');
157159
mainWindow = createMainWindow(
158-
locale,
160+
userLocale,
159161
restoreSavedWindowBounds(screen, requestElectronStore)
160162
);
161163
saveWindowBoundsOnSizeAndPositionChange(mainWindow, requestElectronStore);
162164

165+
logger.info('Setting up Cardano Node...');
163166
cardanoNode = setupCardanoNode(launcherConfig, mainWindow);
164167

165-
buildAppMenus(mainWindow, cardanoNode, locale, {
168+
buildAppMenus(mainWindow, cardanoNode, userLocale, {
166169
isNavigationEnabled: false,
167170
});
168171

169172
enableApplicationMenuNavigationChannel.onReceive(
170173
() =>
171174
new Promise((resolve) => {
172-
buildAppMenus(mainWindow, cardanoNode, locale, {
175+
buildAppMenus(mainWindow, cardanoNode, userLocale, {
173176
isNavigationEnabled: true,
174177
});
175178
resolve();
@@ -179,10 +182,10 @@ const onAppReady = async () => {
179182
rebuildApplicationMenu.onReceive(
180183
(data) =>
181184
new Promise((resolve) => {
182-
buildAppMenus(mainWindow, cardanoNode, locale, {
185+
buildAppMenus(mainWindow, cardanoNode, userLocale, {
183186
isNavigationEnabled: data.isNavigationEnabled,
184187
});
185-
mainWindow.updateTitle(locale);
188+
mainWindow.updateTitle(userLocale);
186189
resolve();
187190
})
188191
);

source/main/utils/handleDiskSpace.js

Lines changed: 107 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -5,18 +5,69 @@ import prettysize from 'prettysize';
55
import { getDiskSpaceStatusChannel } from '../ipc/get-disk-space-status';
66
import { logger } from './logging';
77
import {
8-
DISK_SPACE_REQUIRED,
9-
DISK_SPACE_REQUIRED_MARGIN_PERCENTAGE,
8+
DISK_SPACE_CHECK_DONT_BOTHER_ME_INTERVAL,
109
DISK_SPACE_CHECK_LONG_INTERVAL,
1110
DISK_SPACE_CHECK_MEDIUM_INTERVAL,
1211
DISK_SPACE_CHECK_SHORT_INTERVAL,
1312
DISK_SPACE_RECOMMENDED_PERCENTAGE,
13+
DISK_SPACE_REQUIRED,
14+
DISK_SPACE_CHECK_TIMEOUT,
15+
DISK_SPACE_REQUIRED_MARGIN_PERCENTAGE,
1416
stateDirectoryPath,
1517
} from '../config';
1618
import { CardanoNodeStates } from '../../common/types/cardano-node.types';
1719
import { CardanoNode } from '../cardano/CardanoNode';
1820
import type { CheckDiskSpaceResponse } from '../../common/types/no-disk-space.types';
1921

22+
const getDiskCheckReport = async (
23+
path: string,
24+
timeout: number = DISK_SPACE_CHECK_TIMEOUT
25+
): Promise<CheckDiskSpaceResponse> => {
26+
const initialReport: CheckDiskSpaceResponse = {
27+
isNotEnoughDiskSpace: false,
28+
diskSpaceRequired: '',
29+
diskSpaceMissing: '',
30+
diskSpaceRecommended: '',
31+
diskSpaceAvailable: '',
32+
hadNotEnoughSpaceLeft: false,
33+
diskSpaceAvailableRaw: 0,
34+
diskTotalSpaceRaw: 0,
35+
isError: false,
36+
};
37+
38+
return Promise.race([
39+
// Disk space check promise
40+
new Promise((resolve) => {
41+
checkDiskSpace(path)
42+
.then(({ free, size }) => {
43+
logger.info('[DISK-SPACE-DEBUG] Disk space check completed', {
44+
free,
45+
size,
46+
});
47+
resolve({
48+
...initialReport,
49+
diskSpaceAvailableRaw: free,
50+
diskSpaceAvailable: prettysize(free),
51+
diskTotalSpace: size,
52+
});
53+
})
54+
.catch((error) => {
55+
logger.error(
56+
'[DISK-SPACE-DEBUG] Error getting diskCheckReport',
57+
error
58+
);
59+
resolve({ ...initialReport, isError: true });
60+
});
61+
}),
62+
// Timeout promise
63+
new Promise((resolve) => {
64+
setTimeout(() => {
65+
resolve({ ...initialReport, isError: true });
66+
}, timeout);
67+
}),
68+
]);
69+
};
70+
2071
export const handleDiskSpace = (
2172
mainWindow: BrowserWindow,
2273
cardanoNode: CardanoNode
@@ -30,30 +81,34 @@ export const handleDiskSpace = (
3081
forceDiskSpaceRequired?: number
3182
): Promise<CheckDiskSpaceResponse> => {
3283
const diskSpaceRequired = forceDiskSpaceRequired || DISK_SPACE_REQUIRED;
33-
try {
34-
const {
35-
free: diskSpaceAvailable,
36-
size: diskTotalSpace,
37-
} = await checkDiskSpace(stateDirectoryPath);
84+
85+
const response = await getDiskCheckReport(stateDirectoryPath);
86+
87+
if (response.isError) {
88+
logger.info(
89+
'[DISK-SPACE-DEBUG] We could not check disk space, but we will try to start cardano-node anyway'
90+
);
91+
resetInterval(DISK_SPACE_CHECK_DONT_BOTHER_ME_INTERVAL);
92+
} else {
3893
const diskSpaceMissing = Math.max(
39-
diskSpaceRequired - diskSpaceAvailable,
94+
diskSpaceRequired - response.diskSpaceAvailableRaw,
4095
0
4196
);
4297
const diskSpaceRecommended =
43-
(diskTotalSpace * DISK_SPACE_RECOMMENDED_PERCENTAGE) / 100;
98+
(response.diskTotalSpaceRaw * DISK_SPACE_RECOMMENDED_PERCENTAGE) / 100;
4499
const diskSpaceRequiredMargin =
45100
diskSpaceRequired -
46101
(diskSpaceRequired * DISK_SPACE_REQUIRED_MARGIN_PERCENTAGE) / 100;
47102

48-
if (diskSpaceAvailable <= diskSpaceRequiredMargin) {
103+
if (response.diskSpaceAvailableRaw <= diskSpaceRequiredMargin) {
49104
if (!isNotEnoughDiskSpace) {
50105
// State change: transitioning from enough to not-enough disk space
51106
setDiskSpaceIntervalChecking(DISK_SPACE_CHECK_SHORT_INTERVAL);
52107
isNotEnoughDiskSpace = true;
53108
}
54-
} else if (diskSpaceAvailable >= diskSpaceRequired) {
109+
} else if (response.diskSpaceAvailableRaw >= diskSpaceRequired) {
55110
const newDiskSpaceCheckIntervalLength =
56-
diskSpaceAvailable >= diskSpaceRequired * 2
111+
response.diskSpaceAvailableRaw >= diskSpaceRequired * 2
57112
? DISK_SPACE_CHECK_LONG_INTERVAL
58113
: DISK_SPACE_CHECK_MEDIUM_INTERVAL;
59114
if (isNotEnoughDiskSpace) {
@@ -70,32 +125,29 @@ export const handleDiskSpace = (
70125
setDiskSpaceIntervalChecking(newDiskSpaceCheckIntervalLength);
71126
}
72127
}
128+
response.isNotEnoughDiskSpace = isNotEnoughDiskSpace;
129+
response.diskSpaceRequired = prettysize(diskSpaceRequired);
130+
response.diskSpaceMissing = prettysize(diskSpaceMissing);
131+
response.diskSpaceRecommended = prettysize(diskSpaceRecommended);
132+
response.hadNotEnoughSpaceLeft = hadNotEnoughSpaceLeft;
133+
}
73134

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-
83-
const NO_SPACE_AND_CARDANO_NODE_CAN_BE_STOPPED =
84-
isNotEnoughDiskSpace &&
85-
cardanoNode.state !== CardanoNodeStates.STOPPING &&
86-
cardanoNode.state !== CardanoNodeStates.STOPPED;
87-
88-
const CARDANO_NODE_CAN_BE_STARTED_FOR_THE_FIRST_TIME =
89-
!isNotEnoughDiskSpace &&
90-
cardanoNode.state === CardanoNodeStates.STOPPED &&
91-
cardanoNode._startupTries === 0;
92-
93-
const CARDANO_NODE_CAN_BE_STARTED_AFTER_FREEING_SPACE =
94-
!isNotEnoughDiskSpace &&
95-
cardanoNode.state !== CardanoNodeStates.STOPPED &&
96-
cardanoNode.state !== CardanoNodeStates.STOPPING &&
97-
hadNotEnoughSpaceLeft;
135+
const NO_SPACE_AND_CARDANO_NODE_CAN_BE_STOPPED =
136+
isNotEnoughDiskSpace &&
137+
cardanoNode.state !== CardanoNodeStates.STOPPING &&
138+
cardanoNode.state !== CardanoNodeStates.STOPPED;
98139

140+
const CARDANO_NODE_CAN_BE_STARTED_FOR_THE_FIRST_TIME =
141+
!isNotEnoughDiskSpace &&
142+
cardanoNode.state === CardanoNodeStates.STOPPED &&
143+
cardanoNode._startupTries === 0;
144+
145+
const CARDANO_NODE_CAN_BE_STARTED_AFTER_FREEING_SPACE =
146+
!isNotEnoughDiskSpace &&
147+
cardanoNode.state !== CardanoNodeStates.STOPPED &&
148+
cardanoNode.state !== CardanoNodeStates.STOPPING &&
149+
hadNotEnoughSpaceLeft;
150+
try {
99151
switch (true) {
100152
case NO_SPACE_AND_CARDANO_NODE_CAN_BE_STOPPED:
101153
try {
@@ -125,25 +177,20 @@ export const handleDiskSpace = (
125177
break;
126178
default:
127179
}
128-
await getDiskSpaceStatusChannel.send(response, mainWindow.webContents);
129-
return response;
130180
} catch (error) {
131-
// Remove diskSpaceCheckInterval if set
132-
if (diskSpaceCheckInterval) {
133-
clearInterval(diskSpaceCheckInterval);
134-
// Reset to default check interval
135-
diskSpaceCheckIntervalLength = DISK_SPACE_CHECK_LONG_INTERVAL;
136-
}
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;
181+
logger.error('[DISK-SPACE-DEBUG] Unknown error', error);
182+
resetInterval(DISK_SPACE_CHECK_MEDIUM_INTERVAL);
183+
}
184+
await getDiskSpaceStatusChannel.send(response, mainWindow.webContents);
185+
return response;
186+
};
187+
188+
const resetInterval = (interval: number) => {
189+
// Remove diskSpaceCheckInterval if set
190+
if (diskSpaceCheckInterval) {
191+
clearInterval(diskSpaceCheckInterval);
192+
// Reset to default check interval
193+
diskSpaceCheckIntervalLength = interval;
147194
}
148195
};
149196

@@ -153,17 +200,19 @@ export const handleDiskSpace = (
153200
clearInterval(diskSpaceCheckInterval);
154201
diskSpaceCheckInterval = setInterval(async () => {
155202
const response = await handleCheckDiskSpace(hadNotEnoughSpaceLeft);
156-
hadNotEnoughSpaceLeft = response.hadNotEnoughSpaceLeft;
203+
hadNotEnoughSpaceLeft = response?.hadNotEnoughSpaceLeft;
157204
}, interval);
158205
diskSpaceCheckIntervalLength = interval;
159206
};
160207

161208
// Start default interval
162209
setDiskSpaceIntervalChecking(diskSpaceCheckIntervalLength);
163210

164-
getDiskSpaceStatusChannel.onReceive((diskSpaceRequired) =>
165-
handleCheckDiskSpace(hadNotEnoughSpaceLeft, diskSpaceRequired)
166-
);
211+
getDiskSpaceStatusChannel.onReceive(async () => {
212+
const diskReport = await getDiskCheckReport(stateDirectoryPath);
213+
await getDiskSpaceStatusChannel.send(diskReport, mainWindow.webContents);
214+
return diskReport;
215+
});
167216

168217
return handleCheckDiskSpace;
169218
};

0 commit comments

Comments
 (0)