From 466b3dc527e4a276bb0c5a965540fc2c64fe651e Mon Sep 17 00:00:00 2001 From: Alice Brooks Date: Thu, 11 Jul 2024 13:32:58 +0100 Subject: [PATCH] tuned: Rework logic to gracefully to handle the service starting Previously starting the service would lead to a server disconnected message, these changes allow us to instead fully wait until the service has started before showing the profile selection, meaning we no longer encounter that error --- pkg/systemd/overview-cards/tuned-dialog.jsx | 70 ++++++++++++++++++--- 1 file changed, 62 insertions(+), 8 deletions(-) diff --git a/pkg/systemd/overview-cards/tuned-dialog.jsx b/pkg/systemd/overview-cards/tuned-dialog.jsx index fc019d6dbcf..bfd753252ff 100644 --- a/pkg/systemd/overview-cards/tuned-dialog.jsx +++ b/pkg/systemd/overview-cards/tuned-dialog.jsx @@ -41,6 +41,7 @@ export const TunedPerformanceProfile = () => { const [btnText, setBtnText] = useState(); const [state, setState] = useState(); const [status, setStatus] = useState(); + const [openDialog, setOpenDialog] = useState(false); const tunedService = useObject(() => service.proxy("tuned.service"), null, @@ -105,11 +106,32 @@ export const TunedPerformanceProfile = () => { updateButton(); }, [updateButton]); - const showDialog = () => { - Dialogs.show(); - }; + const startTuned = useCallback(() => { + tunedService.start() + .then(() => setOpenDialog(true)); + }, [tunedService, setOpenDialog]); + + const showDialog = useCallback(() => { + if (tunedService.state !== "running") { + if (!openDialog) { + Dialogs.show(); + } + } else { + setOpenDialog(false); + if (Dialogs.isActive()) { + Dialogs.close(); + } + Dialogs.show(); + } + }, [updateButton, poll, startTuned, tuned, tunedService, openDialog, setOpenDialog, Dialogs]); + + useEffect(() => { + if (openDialog) { + showDialog(); + } + }, [openDialog, showDialog]); return ( @@ -124,6 +146,39 @@ export const TunedPerformanceProfile = () => { ); }; +const StartTunedDialog = ({ + startTuned, +}) => { + const [loading, setLoading] = useState(false); + const Dialogs = useDialogs(); + + const startService = () => { + setLoading(true); + startTuned(); + }; + + return ( + + + + + } + > + {loading && } + + ); +}; + const TunedDialog = ({ updateButton, poll, @@ -244,7 +299,7 @@ const TunedDialog = ({ const tunedProfiles = () => { return tunedDbus.call('/Tuned', 'com.redhat.tuned.control', 'profiles2', []) .then((result) => result[0]) - .catch(ex => { + .catch(() => { return tunedDbus.call('/Tuned', 'com.redhat.tuned.control', 'profiles', []) .then((result) => result[0]); }); @@ -266,8 +321,7 @@ const TunedDialog = ({ .catch(setError); }; - tunedService.start() - .then(updateButton) + updateButton() .then(withTuned) .catch(setError) .finally(() => setLoading(false));