Blame SOURCES/kvm-tools-kvm_stat-reduce-perceived-idle-time-on-filter-.patch

4a2fec
From 5bf653923c85a01b85fe801b3a752938424ce659 Mon Sep 17 00:00:00 2001
4a2fec
From: David Hildenbrand <david@redhat.com>
4a2fec
Date: Tue, 17 Oct 2017 19:15:33 +0200
4a2fec
Subject: [PATCH 28/69] tools/kvm_stat: reduce perceived idle time on filter
4a2fec
 updates
4a2fec
MIME-Version: 1.0
4a2fec
Content-Type: text/plain; charset=UTF-8
4a2fec
Content-Transfer-Encoding: 8bit
4a2fec
4a2fec
RH-Author: David Hildenbrand <david@redhat.com>
4a2fec
Message-id: <20171017191605.2378-8-david@redhat.com>
4a2fec
Patchwork-id: 77314
4a2fec
O-Subject: [RHEL-7.5 qemu-kvm-rhev PATCH 07/39] tools/kvm_stat: reduce perceived idle time on filter updates
4a2fec
Bugzilla: 1497137
4a2fec
RH-Acked-by: Paolo Bonzini <pbonzini@redhat.com>
4a2fec
RH-Acked-by: Cornelia Huck <cohuck@redhat.com>
4a2fec
RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
4a2fec
RH-Acked-by: Thomas Huth <thuth@redhat.com>
4a2fec
4a2fec
Upstream-status: linux.git 184b2d23b057b35fba7fd4049962a897ef0e3f9d
4a2fec
4a2fec
commit 184b2d23b057b35fba7fd4049962a897ef0e3f9d
4a2fec
Author: Stefan Raspl <raspl@linux.vnet.ibm.com>
4a2fec
Date:   Fri Mar 10 13:40:06 2017 +0100
4a2fec
4a2fec
    tools/kvm_stat: reduce perceived idle time on filter updates
4a2fec
4a2fec
    Whenever a user adds a filter, we
4a2fec
    * redraw the header immediately for a snappy response
4a2fec
    * print a message indicating to the user that we're busy while the
4a2fec
      noticeable delay induced by updating all of the stats objects takes place
4a2fec
    * update the statistics ASAP (i.e. after 0.25s instead of 3s) to be
4a2fec
      consistent with behavior on startup
4a2fec
    To do so, we split the Tui's refresh() method to allow for drawing header
4a2fec
    and stats separately, and trigger a header refresh whenever we are about
4a2fec
    to do something that takes a while - like updating filters.
4a2fec
4a2fec
    Signed-off-by: Stefan Raspl <raspl@linux.vnet.ibm.com>
4a2fec
    Signed-off-by: Radim Krčmář <rkrcmar@redhat.com>
4a2fec
4a2fec
Signed-off-by: David Hildenbrand <david@redhat.com>
4a2fec
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
4a2fec
---
4a2fec
 scripts/kvm/kvm_stat | 48 ++++++++++++++++++++++++++++++------------------
4a2fec
 1 file changed, 30 insertions(+), 18 deletions(-)
4a2fec
4a2fec
diff --git a/scripts/kvm/kvm_stat b/scripts/kvm/kvm_stat
4a2fec
index 5c4f248..3e60d93 100755
4a2fec
--- a/scripts/kvm/kvm_stat
4a2fec
+++ b/scripts/kvm/kvm_stat
4a2fec
@@ -801,6 +801,8 @@ class Stats(object):
4a2fec
 
4a2fec
 LABEL_WIDTH = 40
4a2fec
 NUMBER_WIDTH = 10
4a2fec
+DELAY_INITIAL = 0.25
4a2fec
+DELAY_REGULAR = 3.0
4a2fec
 
4a2fec
 
4a2fec
 class Tui(object):
4a2fec
@@ -856,13 +858,14 @@ class Tui(object):
4a2fec
         """Propagates pid selection to stats object."""
4a2fec
         self.stats.pid_filter = pid
4a2fec
 
4a2fec
-    def refresh(self, sleeptime):
4a2fec
-        """Refreshes on-screen data."""
4a2fec
+    def refresh_header(self, pid=None):
4a2fec
+        """Refreshes the header."""
4a2fec
+        if pid is None:
4a2fec
+            pid = self.stats.pid_filter
4a2fec
         self.screen.erase()
4a2fec
-        if self.stats.pid_filter > 0:
4a2fec
+        if pid > 0:
4a2fec
             self.screen.addstr(0, 0, 'kvm statistics - pid {0}'
4a2fec
-                               .format(self.stats.pid_filter),
4a2fec
-                               curses.A_BOLD)
4a2fec
+                               .format(pid), curses.A_BOLD)
4a2fec
         else:
4a2fec
             self.screen.addstr(0, 0, 'kvm statistics - summary', curses.A_BOLD)
4a2fec
         self.screen.addstr(2, 1, 'Event')
4a2fec
@@ -870,7 +873,13 @@ class Tui(object):
4a2fec
                            len('Total'), 'Total')
4a2fec
         self.screen.addstr(2, 1 + LABEL_WIDTH + NUMBER_WIDTH + 8 -
4a2fec
                            len('Current'), 'Current')
4a2fec
+        self.screen.addstr(4, 1, 'Collecting data...')
4a2fec
+        self.screen.refresh()
4a2fec
+
4a2fec
+    def refresh_body(self, sleeptime):
4a2fec
         row = 3
4a2fec
+        self.screen.move(row, 0)
4a2fec
+        self.screen.clrtobot()
4a2fec
         stats = self.stats.get()
4a2fec
 
4a2fec
         def sortkey(x):
4a2fec
@@ -914,10 +923,12 @@ class Tui(object):
4a2fec
             regex = self.screen.getstr()
4a2fec
             curses.noecho()
4a2fec
             if len(regex) == 0:
4a2fec
+                self.refresh_header()
4a2fec
                 return
4a2fec
             try:
4a2fec
                 re.compile(regex)
4a2fec
                 self.stats.fields_filter = regex
4a2fec
+                self.refresh_header()
4a2fec
                 return
4a2fec
             except re.error:
4a2fec
                 continue
4a2fec
@@ -944,37 +955,38 @@ class Tui(object):
4a2fec
 
4a2fec
             try:
4a2fec
                 pid = int(pid)
4a2fec
-
4a2fec
-                if pid == 0:
4a2fec
-                    self.update_pid(pid)
4a2fec
-                    break
4a2fec
-                else:
4a2fec
-                    if not os.path.isdir(os.path.join('/proc/', str(pid))):
4a2fec
-                        continue
4a2fec
-                    else:
4a2fec
-                        self.update_pid(pid)
4a2fec
-                        break
4a2fec
+                if pid != 0 and not os.path.isdir(os.path.join('/proc/',
4a2fec
+                                                               str(pid))):
4a2fec
+                    continue
4a2fec
+                self.refresh_header(pid)
4a2fec
+                self.update_pid(pid)
4a2fec
+                break
4a2fec
 
4a2fec
             except ValueError:
4a2fec
                 continue
4a2fec
 
4a2fec
     def show_stats(self):
4a2fec
         """Refreshes the screen and processes user input."""
4a2fec
-        sleeptime = 0.25
4a2fec
+        sleeptime = DELAY_INITIAL
4a2fec
+        self.refresh_header()
4a2fec
         while True:
4a2fec
-            self.refresh(sleeptime)
4a2fec
+            self.refresh_body(sleeptime)
4a2fec
             curses.halfdelay(int(sleeptime * 10))
4a2fec
-            sleeptime = 3.0
4a2fec
+            sleeptime = DELAY_REGULAR
4a2fec
             try:
4a2fec
                 char = self.screen.getkey()
4a2fec
                 if char == 'x':
4a2fec
+                    self.refresh_header()
4a2fec
                     self.update_drilldown()
4a2fec
+                    sleeptime = DELAY_INITIAL
4a2fec
                 if char == 'q':
4a2fec
                     break
4a2fec
                 if char == 'f':
4a2fec
                     self.show_filter_selection()
4a2fec
+                    sleeptime = DELAY_INITIAL
4a2fec
                 if char == 'p':
4a2fec
                     self.show_vm_selection()
4a2fec
+                    sleeptime = DELAY_INITIAL
4a2fec
             except KeyboardInterrupt:
4a2fec
                 break
4a2fec
             except curses.error:
4a2fec
-- 
4a2fec
1.8.3.1
4a2fec