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

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