]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
cephfs-top: drop x_coord_map
authorJos Collin <jcollin@redhat.com>
Fri, 28 Oct 2022 05:21:08 +0000 (10:51 +0530)
committerJos Collin <jcollin@redhat.com>
Tue, 2 May 2023 10:33:48 +0000 (16:03 +0530)
As we started using curses pads in PR#48090, we don't need x_coord_map anymore.
In this patch, the metrics are positioned in cephfs-top based on padding (ITEMS_PAD).

Signed-off-by: Jos Collin <jcollin@redhat.com>
(cherry picked from commit 46dbd644e4f0b4ce920bbce7d9933a8a9e69526e)

 Conflicts:
    src/tools/cephfs/top/cephfs-top
    - resolved cherry-pick conflict due to the merge of 80a20916c76df1f501df1acaefb32321522a905c.
    - dropped x_coord_map manually in create_client() call.

src/tools/cephfs/top/cephfs-top

index aaf1882d96328be2fa9a35dab0e04e0ce6b80ccb..8ef859571242c983aba7d280575811114feae212 100755 (executable)
@@ -595,85 +595,61 @@ class FSTop(object):
                 return False
         return True
 
-    def create_top_line_and_build_coord(self):
-        xp = 0
-        x_coord_map = {}
-
+    def create_table_header(self):  # formerly named as top_line
         heading = []
         for item in MAIN_WINDOW_TOP_LINE_ITEMS_START:
             heading.append(item)
-            nlen = len(item) + len(ITEMS_PAD)
-            x_coord_map[item] = (xp, nlen)
-            xp += nlen
 
         for item, typ in MAIN_WINDOW_TOP_LINE_METRICS.items():
             if item in MAIN_WINDOW_TOP_LINE_METRICS_LEGACY:
                 continue
             it = f'{self.items(item)}{self.mtype(typ)}'
             heading.append(it)
-            nlen = len(it) + len(ITEMS_PAD)
-            x_coord_map[item] = (xp, nlen)
-            xp += nlen
 
             if item == "READ_IO_SIZES" or item == "WRITE_IO_SIZES":
                 # average io sizes
                 it = f'{self.avg_items(item)}{self.mtype(typ)}'
                 heading.append(it)
-                nlen = len(it) + len(ITEMS_PAD)
-                if item == "READ_IO_SIZES":
-                    x_coord_map["READ_IO_AVG"] = (xp, nlen)
-                if item == "WRITE_IO_SIZES":
-                    x_coord_map["WRITE_IO_AVG"] = (xp, nlen)
-                xp += nlen
 
                 # io speeds
                 it = f'{self.speed_items(item)}{self.speed_mtype(typ)}'
                 heading.append(it)
-                nlen = len(it) + len(ITEMS_PAD)
-                if item == "READ_IO_SIZES":
-                    x_coord_map["READ_IO_SPEED"] = (xp, nlen)
-                if item == "WRITE_IO_SIZES":
-                    x_coord_map["WRITE_IO_SPEED"] = (xp, nlen)
-                xp += nlen
 
         for item in MAIN_WINDOW_TOP_LINE_ITEMS_END:
             heading.append(item)
-            nlen = len(item) + len(ITEMS_PAD)
-            x_coord_map[item] = (xp, nlen)
-            xp += nlen
         title = ITEMS_PAD.join(heading)
         self.fsstats.addstr(self.tablehead_y, 0, title, curses.A_STANDOUT | curses.A_BOLD)
-        return x_coord_map
 
     def create_client(self, fs_name, client_id, metrics, counters,
-                      client_meta, x_coord_map, y_coord):
+                      client_meta, y_coord):
         global last_time
         metrics_dict.setdefault(fs_name, {})
         metrics_dict[fs_name].setdefault(client_id, {})
         cur_time = time.time()
         duration = cur_time - last_time
         last_time = cur_time
-        for item in MAIN_WINDOW_TOP_LINE_ITEMS_START:
-            coord = x_coord_map[item]
-            hlen = coord[1] - 1
+        xp = 0  # xp is incremented after each addstr to position the next incoming metrics.
+        for item in MAIN_WINDOW_TOP_LINE_ITEMS_START:  # note: the first item is ITEMS_PAD
+            hlen = len(item) + ITEMS_PAD_LEN
             if item == FS_TOP_MAIN_WINDOW_COL_CLIENT_ID:
-                self.fsstats.addstr(y_coord, coord[0],
+                self.fsstats.addstr(y_coord, xp,
                                     wrap(client_id.split('.')[1], hlen), curses.A_DIM)
             elif item == FS_TOP_MAIN_WINDOW_COL_MNT_ROOT:
                 if FSTop.has_metric(client_meta,
                                     CLIENT_METADATA_MOUNT_ROOT_KEY):
+                    hlen = len(item) + ITEMS_PAD_LEN
                     self.fsstats.addstr(
-                        y_coord, coord[0],
+                        y_coord, xp,
                         wrap(client_meta[CLIENT_METADATA_MOUNT_ROOT_KEY], hlen), curses.A_DIM)
                 else:
-                    self.fsstats.addstr(y_coord, coord[0], "N/A", curses.A_DIM)
+                    self.fsstats.addstr(y_coord, xp, "N/A", curses.A_DIM)
+            xp += hlen
 
         cidx = 0
         for item in counters:
             if item in MAIN_WINDOW_TOP_LINE_METRICS_LEGACY:
                 cidx += 1
                 continue
-            coord = x_coord_map[item]
             m = metrics[cidx]
             key = MGR_STATS_COUNTERS[cidx]
             typ = MAIN_WINDOW_TOP_LINE_METRICS[key]
@@ -682,39 +658,36 @@ class FSTop(object):
                 if typ == MetricType.METRIC_TYPE_PERCENTAGE:
                     perc = calc_perc(m)
                     metrics_dict[fs_name][client_id][self.items(item)] = perc
-                    self.fsstats.addstr(y_coord, coord[0],
+                    self.fsstats.addstr(y_coord, xp,
                                         f'{perc}', curses.A_DIM)
+                    xp += len(f'{self.items(item)}{self.mtype(typ)}') + ITEMS_PAD_LEN
                 elif typ == MetricType.METRIC_TYPE_LATENCY:
                     lat = calc_lat(m)
                     metrics_dict[fs_name][client_id][self.items(item)] = lat
-                    self.fsstats.addstr(y_coord, coord[0],
+                    self.fsstats.addstr(y_coord, xp,
                                         f'{lat}', curses.A_DIM)
+                    xp += len(f'{self.items(item)}{self.mtype(typ)}') + ITEMS_PAD_LEN
                 elif typ == MetricType.METRIC_TYPE_STDEV:
                     stdev = calc_stdev(m)
                     metrics_dict[fs_name][client_id][self.items(item)] = stdev
-                    self.fsstats.addstr(y_coord, coord[0],
+                    self.fsstats.addstr(y_coord, xp,
                                         f'{stdev}', curses.A_DIM)
+                    xp += len(f'{self.items(item)}{self.mtype(typ)}') + ITEMS_PAD_LEN
                 elif typ == MetricType.METRIC_TYPE_SIZE:
                     size = calc_size(m)
                     metrics_dict[fs_name][client_id][self.items(item)] = size
-                    self.fsstats.addstr(y_coord, coord[0],
+                    self.fsstats.addstr(y_coord, xp,
                                         f'{size}', curses.A_DIM)
+                    xp += len(f'{self.items(item)}{self.mtype(typ)}') + ITEMS_PAD_LEN
 
                     # average io sizes
-                    if key == "READ_IO_SIZES":
-                        coord = x_coord_map["READ_IO_AVG"]
-                    elif key == "WRITE_IO_SIZES":
-                        coord = x_coord_map["WRITE_IO_AVG"]
                     avg_size = calc_avg_size(m)
                     metrics_dict[fs_name][client_id][self.avg_items(key)] = avg_size
-                    self.fsstats.addstr(y_coord, coord[0],
+                    self.fsstats.addstr(y_coord, xp,
                                         f'{avg_size}', curses.A_DIM)
+                    xp += len(f'{self.avg_items(item)}{self.mtype(typ)}') + ITEMS_PAD_LEN
 
                     # io speeds
-                    if key == "READ_IO_SIZES":
-                        coord = x_coord_map["READ_IO_SPEED"]
-                    elif key == "WRITE_IO_SIZES":
-                        coord = x_coord_map["WRITE_IO_SPEED"]
                     size = 0
                     if key == "READ_IO_SIZES":
                         if m[1] > 0:
@@ -730,21 +703,21 @@ class FSTop(object):
                             last_write_size[client_id] = m[1]
                     speed = calc_speed(abs(size), duration)
                     metrics_dict[fs_name][client_id][self.speed_items(key)] = speed
-                    self.fsstats.addstr(y_coord, coord[0],
+                    self.fsstats.addstr(y_coord, xp,
                                         f'{speed}', curses.A_DIM)
+                    xp += len(f'{self.speed_items(item)}{self.speed_mtype(typ)}') + ITEMS_PAD_LEN
                 else:
                     # display 0th element from metric tuple
                     metrics_dict[fs_name][client_id][self.items(item)] = m[0]
-                    self.fsstats.addstr(y_coord, coord[0], f'{m[0]}', curses.A_DIM)
+                    self.fsstats.addstr(y_coord, xp, f'{m[0]}', curses.A_DIM)
+                    xp += len(f'{self.items(item)}{self.mtype(typ)}') + ITEMS_PAD_LEN
             else:
-                self.fsstats.addstr(y_coord, coord[0], "N/A", curses.A_DIM)
+                self.fsstats.addstr(y_coord, xp, "N/A", curses.A_DIM)
+                xp += len(self.items(item)) + ITEMS_PAD_LEN
             cidx += 1
 
         for item in MAIN_WINDOW_TOP_LINE_ITEMS_END:
-            coord = x_coord_map[item]
-            wrapLen = self.PAD_WIDTH - coord[0]
-            # always place the FS_TOP_MAIN_WINDOW_COL_MNTPT_HOST_ADDR in the
-            # last, it will be a very long string to display
+            wrapLen = self.PAD_WIDTH - xp
             if item == FS_TOP_MAIN_WINDOW_COL_MNTPT_HOST_ADDR:
                 if FSTop.has_metrics(client_meta,
                                      [CLIENT_METADATA_MOUNT_POINT_KEY,
@@ -754,12 +727,13 @@ class FSTop(object):
                         f'{client_meta[CLIENT_METADATA_HOSTNAME_KEY]}/'\
                         f'{client_meta[CLIENT_METADATA_IP_KEY]}'
                     self.fsstats.addstr(
-                        y_coord, coord[0],
+                        y_coord, xp,
                         wrap(mount_point, wrapLen), curses.A_DIM)
                 else:
-                    self.fsstats.addstr(y_coord, coord[0], "N/A", curses.A_DIM)
+                    self.fsstats.addstr(y_coord, xp, "N/A", curses.A_DIM)
+                xp += len(self.items(item)) + ITEMS_PAD_LEN
 
-    def create_clients(self, x_coord_map, stats_json, fs_name):
+    def create_clients(self, stats_json, fs_name):
         global metrics_dict, current_states
         counters = [m.upper() for m in stats_json[GLOBAL_COUNTERS_KEY]]
         self.tablehead_y += 2
@@ -791,7 +765,7 @@ class FSTop(object):
                 self.create_client(
                     fs_name, client_id, res.get(client_id, {}), counters,
                     stats_json[CLIENT_METADATA_KEY].get(fs_name, {}).get(client_id, {}),
-                    x_coord_map, self.tablehead_y)
+                    self.tablehead_y)
                 self.tablehead_y += 1
 
     def create_header(self, stats_json, help, screen_title="", color_id=0):
@@ -880,8 +854,8 @@ class FSTop(object):
                     num_client = len(client_metadata)
                 vscrollEnd += num_client
                 if self.create_header(stats_json, help, screen_title, 3):
-                    x_coord_map = self.create_top_line_and_build_coord()
-                    self.create_clients(x_coord_map, stats_json, fs)
+                    self.create_table_header()
+                    self.create_clients(stats_json, fs)
 
             # scroll and refresh
             if cmd == curses.KEY_DOWN:
@@ -1010,8 +984,8 @@ class FSTop(object):
                     vscrollEnd += num_client
                     if self.create_header(stats_json, help, screen_title, 2):
                         if not index:  # do it only for the first fs
-                            x_coord_map = self.create_top_line_and_build_coord()
-                        self.create_clients(x_coord_map, stats_json, fs)
+                            self.create_table_header()
+                        self.create_clients(stats_json, fs)
 
             # scroll and refresh
             if cmd == curses.KEY_DOWN: