@@ -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' ;
1617import { CardanoNodeStates } from '../../common/types/cardano-node.types' ;
1718import { CardanoNode } from '../cardano/CardanoNode' ;
1819import 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+
2066export 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