Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[DDW-862] Enable dynamic RTS flags setting #2758

Merged
merged 22 commits into from Jan 21, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
89a4508
Enable dynamic RTS flags setting
nikolaglumac Nov 26, 2021
c6ec06f
Merge branch 'develop' into rts-flags
danielmain Nov 30, 2021
57163b1
Merge branch 'develop' into rts-flags
danielmain Dec 2, 2021
0eb5d94
Merge branch 'develop' into rts-flags
danielmain Dec 6, 2021
64dc866
Merge branch 'develop' into rts-flags
nikolaglumac Dec 15, 2021
2b80c82
Merge branch 'develop' into rts-flags
danielmain Dec 31, 2021
3fbd4b9
[DDW-862] Now possible to enable/disable rts flags from the menu
danielmain Dec 31, 2021
92e4bc1
[DDW-862] Fixed restart
danielmain Jan 4, 2022
7863b43
[DDW-862] Now RTS are activated when computer has less than 8gb RAM
danielmain Jan 13, 2022
c5f3df1
Merge branch 'develop' into rts-flags
danielmain Jan 13, 2022
a06669e
[DDW-862] Added dialogs
danielmain Jan 17, 2022
1063106
[DDW-862] Added dialogs
thedanheller Jan 18, 2022
1d01d3c
Merge remote-tracking branch 'origin/rts-flags' into rts-flags
danielmain Jan 20, 2022
e74c9d5
Merge branch 'develop' into rts-flags
danielmain Jan 20, 2022
b61ef1d
[DDW-862] Set the RTS flags auto-enablement treshold to 16gb
Jan 20, 2022
1eb184a
Merge branch 'develop' into rts-flags
danielmain Jan 20, 2022
f7995b3
[DDW-862] Added new entry in CHANGELOG.md
danielmain Jan 21, 2022
1d2672d
[DDW-862] applied code review suggestions
danielmain Jan 21, 2022
ee71653
[DDW-862] Fix flow issues
Jan 21, 2022
5143464
[DDW-862] Improve check if rtsFlags are enabled
danielmain Jan 21, 2022
a2880ca
Merge branch 'develop' into rts-flags
danielmain Jan 21, 2022
79b7285
[DDW-862] Renamed getRtsFlagsAccordingToSpecs to getCurrentRtsFlags
danielmain Jan 21, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Expand Up @@ -4,6 +4,7 @@

### Features

- Added dynamic RTS flags setting ([PR 2758](https://github.com/input-output-hk/daedalus/pull/2758/files))
- Updated messages about Cardano node sync on the initial screen ([PR 2827](https://github.com/input-output-hk/daedalus/pull/2827)) ([PR 2831](https://github.com/input-output-hk/daedalus/pull/2831))

### Chores
Expand Down
1 change: 1 addition & 0 deletions source/main/cardano/CardanoNode.js
Expand Up @@ -77,6 +77,7 @@ export type CardanoNodeConfig = {
cliBin: string, // Path to cardano-cli executable
isStaging: boolean,
metadataUrl?: string,
rtsFlags: Array<string>,
};

const CARDANO_UPDATE_EXIT_CODE = 20;
Expand Down
16 changes: 12 additions & 4 deletions source/main/cardano/CardanoWalletLauncher.js
Expand Up @@ -36,6 +36,7 @@ export type WalletOptions = {
cliBin: string,
isStaging: boolean,
metadataUrl?: string,
rtsFlags: Array<string>,
};

export async function CardanoWalletLauncher(
Expand All @@ -54,6 +55,7 @@ export async function CardanoWalletLauncher(
cliBin,
isStaging,
metadataUrl,
rtsFlags,
} = walletOptions;
// TODO: Update launcher config to pass number
const syncToleranceSeconds = parseInt(syncTolerance.replace('s', ''), 10);
Expand Down Expand Up @@ -140,10 +142,16 @@ export async function CardanoWalletLauncher(
});

// RTS flags:
nodeConfig.rtsOpts = [];
logger.info('Launching Cardano Node with RTS flags', {
rtsFlags: nodeConfig.rtsOpts,
});
// 1) "-H4G -M6553M -c70" 16.0% peak RSS reduction and a sub-percentile CPU regression
// 2) "-H4G -M6553M" 18.5% peak RSS reduction and a second-best CPU regression
if (!!rtsFlags && rtsFlags?.length > 0) {
nodeConfig.rtsOpts = rtsFlags;
logger.info('Launching Cardano Node with RTS flags', {
rtsFlags,
});
} else {
logger.info('Launching Cardano Node without RTS flags');
}

merge(launcherConfig, {
nodeConfig,
Expand Down
5 changes: 4 additions & 1 deletion source/main/cardano/setup.js
Expand Up @@ -48,10 +48,12 @@ const restartCardanoNode = async (node: CardanoNode) => {
*
* @param launcherConfig {LauncherConfig}
* @param mainWindow
* @param rtsFlags flags used to start cardano-node
*/
export const setupCardanoNode = (
launcherConfig: LauncherConfig,
mainWindow: BrowserWindow
mainWindow: BrowserWindow,
rtsFlags: Array<string>
): CardanoNode => {
const {
logsPrefix,
Expand All @@ -77,6 +79,7 @@ export const setupCardanoNode = (
configPath,
syncTolerance,
cliBin,
rtsFlags,
isStaging,
metadataUrl,
startupTimeout: NODE_STARTUP_TIMEOUT,
Expand Down
4 changes: 4 additions & 0 deletions source/main/config.js
Expand Up @@ -173,7 +173,11 @@ export const BLOCK_REPLAY_PROGRESS_CHECK_INTERVAL = 1 * 1000; // 1 seconds | uni
export const FALLBACK_TOKEN_METADATA_SERVER_URL =
'https://metadata.cardano-testnet.iohkdev.io';

export const MINIMUM_AMOUNT_OF_RAM_FOR_RTS_FLAGS = 16 * 1024 * 1024 * 1024; // 16gb RAM
danielmain marked this conversation as resolved.
Show resolved Hide resolved

// Used by mock-token-metadata-server
export const MOCK_TOKEN_METADATA_SERVER_URL = 'http://localhost';
export const MOCK_TOKEN_METADATA_SERVER_PORT =
process.env.MOCK_TOKEN_METADATA_SERVER_PORT || 0;

export const RTS_FLAGS = ['-c'];
23 changes: 21 additions & 2 deletions source/main/index.js
Expand Up @@ -22,12 +22,15 @@ import {
launcherConfig,
pubLogsFolderPath,
stateDirectoryPath,
RTS_FLAGS,
MINIMUM_AMOUNT_OF_RAM_FOR_RTS_FLAGS,
} from './config';
import { setupCardanoNode } from './cardano/setup';
import { CardanoNode } from './cardano/CardanoNode';
import { safeExitWithCode } from './utils/safeExitWithCode';
import { buildAppMenus } from './utils/buildAppMenus';
import { getLocale } from './utils/getLocale';
import { getRtsFlags, setRtsFlagsAndRestart } from './utils/rtsFlags';
import { detectSystemLocale } from './utils/detectSystemLocale';
import { ensureXDGDataIsSet } from './cardano/config';
import { rebuildApplicationMenu } from './ipc/rebuild-application-menu';
Expand Down Expand Up @@ -117,6 +120,7 @@ const onAppReady = async () => {
const cpu = os.cpus();
const platformVersion = os.release();
const ram = JSON.stringify(os.totalmem(), null, 2);

const startTime = new Date().toISOString();
// first checks for Japanese locale, otherwise returns english
const systemLocale = detectSystemLocale();
Expand Down Expand Up @@ -162,8 +166,23 @@ const onAppReady = async () => {
);
saveWindowBoundsOnSizeAndPositionChange(mainWindow, requestElectronStore);

logger.info('Setting up Cardano Node...');
cardanoNode = setupCardanoNode(launcherConfig, mainWindow);
const getCurrentRtsFlags = () => {
const rtsFlagsFromStorage = getRtsFlags(network);
if (!rtsFlagsFromStorage) {
if (os.totalmem() < MINIMUM_AMOUNT_OF_RAM_FOR_RTS_FLAGS) {
setRtsFlagsAndRestart(environment.network, RTS_FLAGS);
return RTS_FLAGS;
}
return [];
}
return rtsFlagsFromStorage;
};

const rtsFlags = getCurrentRtsFlags();
logger.info(
`Setting up Cardano Node... with flags: ${JSON.stringify(rtsFlags)}`
);
cardanoNode = setupCardanoNode(launcherConfig, mainWindow, rtsFlags);

buildAppMenus(mainWindow, cardanoNode, userLocale, {
isNavigationEnabled: false,
Expand Down
10 changes: 9 additions & 1 deletion source/main/locales/en-US.json
Expand Up @@ -22,6 +22,13 @@
"menu.edit.undo": "Undo",
"menu.helpSupport": "Help",
"menu.helpSupport.blankScreenFix": "Blank Screen Fix",
"menu.helpSupport.usingRtsFlags": "Using RTS flags",
"menu.helpSupport.rtsFlagsDialogCancel": "Cancel",
"menu.helpSupport.rtsFlagsDialogConfirm": "Yes",
"menu.helpSupport.enableRtsFlagsDialogMessage": "When enabled, the Cardano node will attempt to reduce its RAM usage",
"menu.helpSupport.enableRtsFlagsDialogTitle": "Enable RAM management (RTS Flags)",
"menu.helpSupport.disableRtsFlagsDialogMessage": "When disabled, we will restart cardano-node in default mode",
"menu.helpSupport.disableRtsFlagsDialogTitle": "Disable RAM management (RTS Flags)",
"menu.helpSupport.blankScreenFixDialogCancel": "Cancel",
"menu.helpSupport.blankScreenFixDialogConfirm": "Yes",
"menu.helpSupport.blankScreenFixDialogMessage": "Turn off 'Blank screen fix'? \n \nDisabling the blank screen fix setting will improve the performance of user interface rendering by enabling graphics acceleration, however, some users may find that Daedalus runs better with this setting enabled. If you see a blank screen instead of the Daedalus user interface after disabling this setting and restarting Daedalus, please turn this setting back on. \n \nDo you want to disable this setting and restart Daedalus?",
Expand All @@ -43,5 +50,6 @@
"menu.view.toggleDeveloperTools": "Toggle Developer Tools",
"menu.view.toggleFullScreen": "Toggle Full Screen",
"menu.view.toggleMaximumWindowSize": "Toggle Maximum Window Size",
"window.title.blankScreenFix": "['Blank screen fix' active]"
"window.title.blankScreenFix": "['Blank screen fix' active]",
"window.title.usingRtsFlags": "['Using RTS flags' active]"
}
10 changes: 9 additions & 1 deletion source/main/locales/ja-JP.json
Expand Up @@ -22,6 +22,13 @@
"menu.edit.undo": "元に戻す",
"menu.helpSupport": "ヘルプ",
"menu.helpSupport.blankScreenFix": "ブランク画面修正",
"menu.helpSupport.usingRtsFlags": "RTSフラグの使用",
"menu.helpSupport.rtsFlagsDialogCancel": "Cancel",
"menu.helpSupport.rtsFlagsDialogConfirm": "Yes",
"menu.helpSupport.enableRtsFlagsDialogMessage": "When enabled, the Cardano node will attempt to reduce its RAM usage",
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

untranslated strings

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is known. @dmitrii-gaico you asked this already. right?

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, this is known. For the FC we release only EN version.
Also this is not the latest version of design and once we prepare a new one all the translations would be done.

"menu.helpSupport.enableRtsFlagsDialogTitle": "Enable RAM management (RTSフラグの使用\")",
"menu.helpSupport.disableRtsFlagsDialogMessage": "When disabled, we will restart cardano-node in default mode",
"menu.helpSupport.disableRtsFlagsDialogTitle": "Disable RAM management (RTSフラグの使用\")",
"menu.helpSupport.blankScreenFixDialogCancel": "キャンセル",
"menu.helpSupport.blankScreenFixDialogConfirm": "はい",
"menu.helpSupport.blankScreenFixDialogMessage": "「ブランク画面修正」を無効にしますか? \n \nブランク画面修正設定を無効にすると、グラフィックアクセラレーションが有効化されてユーザーインターフェイスのレンダリングパフォーマンスが向上しますが、この設定を有効にした方がDaedalusがスムーズに作動する場合があります。この設定を無効にしてDaedalusを再起動した際にDaedalusユーザーインターフェイスの代わりにブランク画面が表示される場合は、この設定をもう一度有効にしてください。 \n \nこの設定を無効にしてDaedalusを再起動しますか。",
Expand All @@ -43,5 +50,6 @@
"menu.view.toggleDeveloperTools": "開発者ツール切替え",
"menu.view.toggleFullScreen": "フルスクリーン切替え",
"menu.view.toggleMaximumWindowSize": "最大ウインドウサイズ切り切り替え",
"window.title.blankScreenFix": "[「ブランク画面修正」有効 ]"
"window.title.blankScreenFix": "[「ブランク画面修正」有効 ]",
"window.title.usingRtsFlags": "[「RTSフラグの使用」が有効]"
}
1 change: 1 addition & 0 deletions source/main/menus/MenuActions.types.js
@@ -1,6 +1,7 @@
// @flow
export type MenuActions = {
toggleBlankScreenFix: Function,
setRtsFlags: Function,
openAboutDialog: Function,
openDaedalusDiagnosticsDialog: Function,
openItnRewardsRedemptionDialog: Function,
Expand Down
23 changes: 13 additions & 10 deletions source/main/menus/osx.js
Expand Up @@ -8,9 +8,12 @@ import { environment } from '../environment';
import { showUiPartChannel } from '../ipc/control-ui-parts';
import { NOTIFICATIONS } from '../../common/ipc/constants';
import { generateSupportRequestLink } from '../../common/utils/reporting';
import { getRtsFlags } from '../utils/rtsFlags';

const id = 'menu';
const { isBlankScreenFixActive } = environment;
const { isBlankScreenFixActive, network } = environment;
const rtsFlags = getRtsFlags(network);
const rtsFlagsEnabled: boolean = !!rtsFlags?.length && rtsFlags.length > 0;

export const osxMenu = (
app: App,
Expand Down Expand Up @@ -154,6 +157,15 @@ export const osxMenu = (
actions.toggleBlankScreenFix(item);
},
},
{
label: translation('helpSupport.usingRtsFlags'),
type: 'checkbox',
checked: rtsFlagsEnabled,
click(item) {
actions.setRtsFlags(!rtsFlagsEnabled);
item.checked = rtsFlagsEnabled;
},
},
{ type: 'separator' },
{
label: translation('helpSupport.safetyTips'),
Expand All @@ -162,15 +174,6 @@ export const osxMenu = (
shell.openExternal(safetyTipsLinkUrl);
},
},
/* {
label: translation('helpSupport.featureRequest'),
click() {
const featureRequestLinkUrl = translation(
'helpSupport.featureRequestUrl'
);
shell.openExternal(featureRequestLinkUrl);
},
}, */
{
label: translation('helpSupport.supportRequest'),
click() {
Expand Down
14 changes: 13 additions & 1 deletion source/main/menus/win-linux.js
Expand Up @@ -8,9 +8,12 @@ import { environment } from '../environment';
import { NOTIFICATIONS } from '../../common/ipc/constants';
import { showUiPartChannel } from '../ipc/control-ui-parts';
import { generateSupportRequestLink } from '../../common/utils/reporting';
import { getRtsFlags } from '../utils/rtsFlags';

const id = 'menu';
const { isWindows, isBlankScreenFixActive } = environment;
const { isWindows, isBlankScreenFixActive, network } = environment;
const rtsFlags = getRtsFlags(network);
const rtsFlagsEnabled: boolean = !!rtsFlags?.length && rtsFlags.length > 0;

export const winLinuxMenu = (
app: App,
Expand Down Expand Up @@ -166,6 +169,15 @@ export const winLinuxMenu = (
actions.toggleBlankScreenFix(item);
},
},
{
label: translation('helpSupport.usingRtsFlags'),
type: 'checkbox',
checked: rtsFlagsEnabled,
click(item) {
actions.setRtsFlags(!rtsFlagsEnabled);
item.checked = rtsFlagsEnabled;
},
},
{ type: 'separator' },
{
label: translation('helpSupport.safetyTips'),
Expand Down
37 changes: 36 additions & 1 deletion source/main/utils/buildAppMenus.js
@@ -1,5 +1,5 @@
// @flow
import { app, globalShortcut, Menu, BrowserWindow, dialog } from 'electron';
import { app, BrowserWindow, dialog, globalShortcut, Menu } from 'electron';
import { environment } from '../environment';
import { winLinuxMenu } from '../menus/win-linux';
import { osxMenu } from '../menus/osx';
Expand All @@ -9,6 +9,8 @@ import { CardanoNode } from '../cardano/CardanoNode';
import { DIALOGS, PAGES } from '../../common/ipc/constants';
import { showUiPartChannel } from '../ipc/control-ui-parts';
import { getTranslation } from './getTranslation';
import { setRtsFlagsAndRestart } from './rtsFlags';
import { RTS_FLAGS } from '../config';

export const buildAppMenus = async (
mainWindow: BrowserWindow,
Expand Down Expand Up @@ -92,13 +94,46 @@ export const buildAppMenus = async (
item.checked = isBlankScreenFixActive;
};

const setRtsFlags = async (enable: boolean): Promise<void> => {
const translation = getTranslation(translations, 'menu');
const rtsFlagsDialogOptions = {
buttons: [
translation('helpSupport.rtsFlagsDialogConfirm'),
translation('helpSupport.rtsFlagsDialogCancel'),
],
type: 'warning',
title: enable
? translation('helpSupport.enableRtsFlagsDialogTitle')
: translation('helpSupport.disableRtsFlagsDialogTitle'),
message: enable
? translation('helpSupport.enableRtsFlagsDialogMessage')
: translation('helpSupport.disableRtsFlagsDialogMessage'),
defaultId: 1,
cancelId: 1,
noLink: true,
};

const { response } = await dialog.showMessageBox(
mainWindow,
rtsFlagsDialogOptions
);
if (response === 0) {
if (enable) {
setRtsFlagsAndRestart(environment.network, RTS_FLAGS);
} else {
setRtsFlagsAndRestart(environment.network, []);
}
}
};

const menuActions = {
openAboutDialog,
openDaedalusDiagnosticsDialog,
openItnRewardsRedemptionDialog,
openSettingsPage,
openWalletSettingsPage,
toggleBlankScreenFix,
setRtsFlags,
};

// Build app menus
Expand Down
26 changes: 26 additions & 0 deletions source/main/utils/rtsFlags.js
@@ -0,0 +1,26 @@
// @flow
import Store from 'electron-store';
import { logger } from './logging';
import { relaunch } from './safeExitWithCode';

const store = new Store();

export const getRtsFlags = (network: string): string[] | null => {
try {
const rtsFlags = store.get(`${network}-RTS-FLAGS`);
logger.info(`[GET-RTS-FLAGS] ${network}-RTS-FLAGS: `, rtsFlags);
return rtsFlags;
} catch (error) {
logger.error(`[GET-RTS-FLAGS] Error fetching ${network}-RTS-FLAGS`, error);
}
return null;
};

export const setRtsFlagsAndRestart = (
network: string,
flags: Array<string>
): void => {
logger.info('[SET-RTS-FLAGS] setting: ', { network, flags });
store.set(`${network}-RTS-FLAGS`, flags);
relaunch();
};
13 changes: 13 additions & 0 deletions source/main/utils/safeExitWithCode.js
Expand Up @@ -13,3 +13,16 @@ export const safeExitWithCode = (exitCode: number = 0) => {
app.exit(exitCode);
});
};

export const relaunch = () => {
const { file } = log.transports;
// Prevent electron-log from writing to stream
file.level = false;
// Flush the stream to the log file and exit afterwards.
// https://nodejs.org/api/stream.html#stream_writable_end_chunk_encoding_callback
file.stream.end('', 'utf8', () => {
app.releaseSingleInstanceLock();
app.relaunch({ args: process.argv.slice(1).concat(['--relaunch']) });
app.exit(0);
});
};
6 changes: 5 additions & 1 deletion source/main/windows/main.js
Expand Up @@ -8,10 +8,12 @@ import { getTranslation } from '../utils/getTranslation';
import { getContentMinimumSize } from '../utils/getContentMinimumSize';
import { buildLabel, launcherConfig } from '../config';
import { ledgerStatus } from '../ipc/getHardwareWalletChannel';
import { getRtsFlags } from '../utils/rtsFlags';

const rendererErrorHandler = new RendererErrorHandler();

const { isDev, isTest, isLinux, isBlankScreenFixActive } = environment;
const { isDev, isTest, isLinux, isBlankScreenFixActive, network } = environment;
const rtsFlags = getRtsFlags(network);

const id = 'window';

Expand All @@ -21,6 +23,8 @@ const getWindowTitle = (locale: string): string => {
let title = buildLabel;
if (isBlankScreenFixActive)
title += ` ${translation('title.blankScreenFix')}`;
if (!!rtsFlags && rtsFlags?.length > 0)
title += ` ${translation('title.usingRtsFlags')}`;
return title;
};

Expand Down