[pve-devel] [PATCH installer] tui: update screen during installation only when necessary

Christoph Heiss c.heiss at proxmox.com
Tue Apr 23 15:23:39 CEST 2024


This can significantly reduces CPU load and even speed up the
installation a lot on single-core machines. While the latter may not be
a realistic target for obvious reasons, lowering overall CPU usage is
always a good thing.

Also helps with flickering during the installation process quite a bit
too.

E.g. a test installation on a single-core VM goes down from 47:35 min
w/o the patch to 2:26 min w/ the patch, a ~94%(!) decrease in time.

Signed-off-by: Christoph Heiss <c.heiss at proxmox.com>
---
 proxmox-tui-installer/src/main.rs             |  3 --
 .../src/views/install_progress.rs             | 32 +++++++++++--------
 2 files changed, 18 insertions(+), 17 deletions(-)

diff --git a/proxmox-tui-installer/src/main.rs b/proxmox-tui-installer/src/main.rs
index 2462a58..4fb7afd 100644
--- a/proxmox-tui-installer/src/main.rs
+++ b/proxmox-tui-installer/src/main.rs
@@ -664,9 +664,6 @@ fn summary_dialog(siv: &mut Cursive) -> InstallerView {
 }
 
 fn install_progress_dialog(siv: &mut Cursive) -> InstallerView {
-    // Ensure the screen is updated independently of keyboard events and such
-    siv.set_autorefresh(true);
-
     let state = siv.user_data::<InstallerState>().cloned().unwrap();
     InstallerView::with_raw(&state, InstallProgressView::new(siv))
 }
diff --git a/proxmox-tui-installer/src/views/install_progress.rs b/proxmox-tui-installer/src/views/install_progress.rs
index 71af484..6453426 100644
--- a/proxmox-tui-installer/src/views/install_progress.rs
+++ b/proxmox-tui-installer/src/views/install_progress.rs
@@ -1,7 +1,7 @@
 use cursive::{
     utils::Counter,
     view::{Nameable, Resizable, ViewWrapper},
-    views::{Dialog, DummyView, LinearLayout, PaddedView, ProgressBar, TextContent, TextView},
+    views::{Dialog, DummyView, LinearLayout, PaddedView, ProgressBar, TextView},
     CbSink, Cursive,
 };
 use serde::Deserialize;
@@ -21,15 +21,15 @@ pub struct InstallProgressView {
 }
 
 impl InstallProgressView {
+    const PROGRESS_TEXT_VIEW_ID: &str = "progress-text";
+
     pub fn new(siv: &mut Cursive) -> Self {
         let cb_sink = siv.cb_sink().clone();
         let state = siv.user_data::<InstallerState>().unwrap();
-        let progress_text = TextContent::new("starting the installation ..");
 
         let progress_task = {
-            let progress_text = progress_text.clone();
             let state = state.clone();
-            move |counter: Counter| Self::progress_task(counter, cb_sink, state, progress_text)
+            move |counter: Counter| Self::progress_task(counter, cb_sink, state)
         };
 
         let progress_bar = ProgressBar::new().with_task(progress_task).full_width();
@@ -41,7 +41,11 @@ impl InstallProgressView {
             LinearLayout::vertical()
                 .child(PaddedView::lrtb(1, 1, 0, 0, progress_bar))
                 .child(DummyView)
-                .child(TextView::new_with_content(progress_text).center())
+                .child(
+                    TextView::new("starting the installation ..")
+                        .center()
+                        .with_name(Self::PROGRESS_TEXT_VIEW_ID),
+                )
                 .child(PaddedView::lrtb(
                     1,
                     1,
@@ -54,12 +58,7 @@ impl InstallProgressView {
         Self { view }
     }
 
-    fn progress_task(
-        counter: Counter,
-        cb_sink: CbSink,
-        state: InstallerState,
-        progress_text: TextContent,
-    ) {
+    fn progress_task(counter: Counter, cb_sink: CbSink, state: InstallerState) {
         let mut child = match spawn_low_level_installer(state.in_test_mode) {
             Ok(child) => child,
             Err(err) => {
@@ -129,13 +128,18 @@ impl InstallProgressView {
                     }),
                     UiMessage::Progress { ratio, text } => {
                         counter.set((ratio * 100.).floor() as usize);
-                        progress_text.set_content(text);
-                        Ok(())
+                        cb_sink.send(Box::new(move |siv| {
+                            siv.call_on_name(Self::PROGRESS_TEXT_VIEW_ID, |v: &mut TextView| {
+                                v.set_content(text);
+                            });
+                        }))
                     }
                     UiMessage::Finished { state, message } => {
                         counter.set(100);
-                        progress_text.set_content(message.to_owned());
                         cb_sink.send(Box::new(move |siv| {
+                            siv.call_on_name(Self::PROGRESS_TEXT_VIEW_ID, |v: &mut TextView| {
+                                v.set_content(&message);
+                            });
                             Self::prepare_for_reboot(siv, state == "ok", &message);
                         }))
                     }
-- 
2.44.0





More information about the pve-devel mailing list