@@ -5,18 +5,69 @@ import prettysize from 'prettysize';
55import { getDiskSpaceStatusChannel } from '../ipc/get-disk-space-status' ;
66import { logger } from './logging' ;
77import {
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' ;
1618import { CardanoNodeStates } from '../../common/types/cardano-node.types' ;
1719import { CardanoNode } from '../cardano/CardanoNode' ;
1820import 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+
2071export 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