Skip to content

Commit

Permalink
[DDW-826] If disk check has errors or reaches the timeout we "stop" t…
Browse files Browse the repository at this point in the history
…he intervals
  • Loading branch information
danielmain committed Nov 25, 2021
1 parent b35bd10 commit 1ae9935
Show file tree
Hide file tree
Showing 2 changed files with 48 additions and 23 deletions.
2 changes: 2 additions & 0 deletions source/main/config.js
Original file line number Diff line number Diff line change
Expand Up @@ -159,10 +159,12 @@ export const NODE_UPDATE_TIMEOUT = isTest ? 10000 : 5 * 60 * 1000; // 5 minutes

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

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

Expand Down
69 changes: 46 additions & 23 deletions source/main/utils/handleDiskSpace.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,13 @@ import prettysize from 'prettysize';
import { getDiskSpaceStatusChannel } from '../ipc/get-disk-space-status';
import { logger } from './logging';
import {
DISK_SPACE_CHECK_DONT_BOTHER_ME_INTERVAL,
DISK_SPACE_CHECK_LONG_INTERVAL,
DISK_SPACE_CHECK_MEDIUM_INTERVAL,
DISK_SPACE_CHECK_SHORT_INTERVAL,
DISK_SPACE_RECOMMENDED_PERCENTAGE,
DISK_SPACE_REQUIRED,
DISK_SPACE_CHECK_TIMEOUT,
DISK_SPACE_REQUIRED_MARGIN_PERCENTAGE,
stateDirectoryPath,
} from '../config';
Expand All @@ -18,7 +20,8 @@ import { CardanoNode } from '../cardano/CardanoNode';
import type { CheckDiskSpaceResponse } from '../../common/types/no-disk-space.types';

const getDiskCheckReport = async (
path: string
path: string,
timeout: number = DISK_SPACE_CHECK_TIMEOUT
): Promise<CheckDiskSpaceResponse> => {
const initialReport: CheckDiskSpaceResponse = {
isNotEnoughDiskSpace: false,
Expand All @@ -32,22 +35,37 @@ const getDiskCheckReport = async (
isError: false,
};

try {
const { free, size } = await checkDiskSpace(path);
logger.info('[DISK-SPACE-DEBUG] Disk space check completed', {
free,
size,
});
return {
...initialReport,
diskSpaceAvailableRaw: free,
diskSpaceAvailable: prettysize(free),
diskTotalSpace: size,
};
} catch (error) {
logger.error('[DISK-SPACE-DEBUG] Error getting diskCheckReport', error);
return { ...initialReport, isError: true };
}
return Promise.race([
// Disk space check promise
new Promise((resolve) => {
checkDiskSpace(path)
.then(({ free, size }) => {
logger.info('[DISK-SPACE-DEBUG] Disk space check completed', {
free,
size,
});
resolve({
...initialReport,
diskSpaceAvailableRaw: free,
diskSpaceAvailable: prettysize(free),
diskTotalSpace: size,
});
})
.catch((error) => {
logger.error(
'[DISK-SPACE-DEBUG] Error getting diskCheckReport',
error
);
resolve({ ...initialReport, isError: true });
});
}),
// Timeout promise
new Promise((resolve) => {
setTimeout(() => {
resolve({ ...initialReport, isError: true });
}, timeout);
}),
]);
};

export const handleDiskSpace = (
Expand All @@ -70,6 +88,7 @@ export const handleDiskSpace = (
logger.info(
'[DISK-SPACE-DEBUG] We could not check disk space, but we will try to start cardano-node anyway'
);
resetInterval(DISK_SPACE_CHECK_DONT_BOTHER_ME_INTERVAL);
} else {
const diskSpaceMissing = Math.max(
diskSpaceRequired - response.diskSpaceAvailableRaw,
Expand Down Expand Up @@ -160,17 +179,21 @@ export const handleDiskSpace = (
}
} catch (error) {
logger.error('[DISK-SPACE-DEBUG] Unknown error', error);
// Remove diskSpaceCheckInterval if set
if (diskSpaceCheckInterval) {
clearInterval(diskSpaceCheckInterval);
// Reset to default check interval
diskSpaceCheckIntervalLength = DISK_SPACE_CHECK_LONG_INTERVAL;
}
resetInterval(DISK_SPACE_CHECK_MEDIUM_INTERVAL);
}
await getDiskSpaceStatusChannel.send(response, mainWindow.webContents);
return response;
};

const resetInterval = (interval: number) => {
// Remove diskSpaceCheckInterval if set
if (diskSpaceCheckInterval) {
clearInterval(diskSpaceCheckInterval);
// Reset to default check interval
diskSpaceCheckIntervalLength = interval;
}
};

let hadNotEnoughSpaceLeft: boolean = false;

const setDiskSpaceIntervalChecking = (interval) => {
Expand Down

0 comments on commit 1ae9935

Please sign in to comment.