]> granicus.if.org Git - sysstat/commitdiff
sar: Better handle the case when FB hosts are added to the system
authorSebastien GODARD <sysstat@users.noreply.github.com>
Fri, 28 Jun 2019 06:54:36 +0000 (08:54 +0200)
committerSebastien GODARD <sysstat@users.noreply.github.com>
Fri, 28 Jun 2019 06:54:36 +0000 (08:54 +0200)
If a new Fibre Channel host is registered in the system, now display its
statistics even for the interval during which it has been registered. In
this case, its initial counters values are considered as 0.

Signed-off-by: Sebastien GODARD <sysstat@users.noreply.github.com>
json_stats.c
pcp_stats.c
pr_stats.c
raw_stats.c
rd_stats.c
rndr_stats.c
svg_stats.c
xml_stats.c

index 1638abe52735af4712b5742a5fb78893e76deb93..2b8a82876c040661d07c0ea369e193219f47e495 100644 (file)
@@ -2237,12 +2237,14 @@ __print_funct_t json_print_fchost_stats(struct activity *a, int curr, int tab,
                                        unsigned long long itv)
 {
        int i, j, j0, found;
-       struct stats_fchost *sfcc, *sfcp;
+       struct stats_fchost *sfcc, *sfcp, sfczero;
        int sep = FALSE;
 
        if (!IS_SELECTED(a->options) || (a->nr[curr] <= 0))
                goto close_json_markup;
 
+       memset(&sfczero, 0, sizeof(struct stats_fchost));
+
        json_markup_network(tab, OPEN_JSON_MARKUP);
        tab++;
 
@@ -2277,8 +2279,10 @@ __print_funct_t json_print_fchost_stats(struct activity *a, int curr, int tab,
                        while (j != j0);
                }
 
-               if (!found)
-                       continue;
+               if (!found) {
+                       /* This is a newly registered host */
+                       sfcp = &sfczero;
+               }
 
                if (sep)
                        printf(",\n");
index 836ab7bf9e34ef33f4c935dc8a83b477a0ac7eea..6d084797fe4849a439eea1b5ff67c65e79422134 100644 (file)
@@ -2185,9 +2185,11 @@ __print_funct_t pcp_print_fchost_stats(struct activity *a, int curr, unsigned lo
 {
 #ifdef HAVE_PCP
        int i, j, j0, found;
-       struct stats_fchost *sfcc, *sfcp;
+       struct stats_fchost *sfcc, *sfcp, sfczero;
        char buf[64];
 
+       memset(&sfczero, 0, sizeof(struct stats_fchost));
+
        for (i = 0; i < a->nr[curr]; i++) {
 
                found = FALSE;
@@ -2217,8 +2219,10 @@ __print_funct_t pcp_print_fchost_stats(struct activity *a, int curr, unsigned lo
                        while (j != j0);
                }
 
-               if (!found)
-                       continue;
+               if (!found) {
+                       /* This is a newly registered host */
+                       sfcp = &sfczero;
+               }
 
                snprintf(buf, sizeof(buf), "%f",
                         S_VALUE(sfcp->f_rxframes, sfcc->f_rxframes, itv));
index 319630d9b9aff5d9df75353d3bf0f40a6eb633c8..bb321ac58f8b9830d707868819aee1564b3bf1e8 100644 (file)
@@ -2879,7 +2879,9 @@ __print_funct_t print_fchost_stats(struct activity *a, int prev, int curr,
                                   unsigned long long itv)
 {
        int i, j, j0, found;
-       struct stats_fchost *sfcc, *sfcp;
+       struct stats_fchost *sfcc, *sfcp, sfczero;
+
+       memset(&sfczero, 0, sizeof(struct stats_fchost));
 
        if (dish) {
                print_hdr_line(timestamp[!curr], a, FIRST, -1, 9);
@@ -2920,8 +2922,10 @@ __print_funct_t print_fchost_stats(struct activity *a, int prev, int curr,
                        }
                }
 
-               if (!found)
-                       continue;
+               if (!found) {
+                       /* This is a newly registered host */
+                       sfcp = &sfczero;
+               }
 
                printf("%-11s", timestamp[curr]);
                cprintf_f(NO_UNIT, 4, 9, 2,
index efa1f8115252e51bff080ad0515e15ff77795318..254227e1ce6ec3427bb8da91f0f5fe847553907b 100644 (file)
@@ -1534,7 +1534,9 @@ __print_funct_t raw_print_filesystem_stats(struct activity *a, char *timestr, in
 __print_funct_t raw_print_fchost_stats(struct activity *a, char *timestr, int curr)
 {
        int i, j, j0, found;
-       struct stats_fchost *sfcc, *sfcp;
+       struct stats_fchost *sfcc, *sfcp, sfczero;
+
+       memset(&sfczero, 0, sizeof(struct stats_fchost));
 
        for (i = 0; i < a->nr[curr]; i++) {
 
@@ -1565,8 +1567,13 @@ __print_funct_t raw_print_fchost_stats(struct activity *a, char *timestr, int cu
                        while (j != j0);
                }
 
-               if (!found)
-                       continue;
+               if (!found) {
+                       /* This is a newly registered host. Previous stats are zero */
+                       sfcp = &sfczero;
+                       if (DISPLAY_DEBUG_MODE(flags)) {
+                               printf(" [NEW]");
+                       }
+               }
 
                printf("%s; %s; %s;", timestr, pfield(a->hdr_line, FIRST), sfcc->fchost_name);
                printf(" %s", pfield(NULL, 0));
index 02a1d9a6badaeda5e4f6fd5ca9ccfd03a5a7c9bb..68e279972e45bf91a0373e9e6afb21c297d009ae 100644 (file)
@@ -2596,14 +2596,14 @@ __nr_t read_fchost(struct stats_fchost *st_fc, __nr_t nr_alloc)
        unsigned long rx_frames, tx_frames, rx_words, tx_words;
 
        /* Each host, if present, will have its own hostX entry within SYSFS_FCHOST */
-       if ((dir = opendir(SYSFS_FCHOST)) == NULL)
+       if ((dir = __opendir(SYSFS_FCHOST)) == NULL)
                return 0; /* No FC hosts */
 
        /*
         * Read each of the counters via sysfs, where they are
         * returned as hex values (e.g. 0x72400).
         */
-       while ((drd = readdir(dir)) != NULL) {
+       while ((drd = __readdir(dir)) != NULL) {
                rx_frames = tx_frames = rx_words = tx_words = 0;
 
                if (!strncmp(drd->d_name, "host", 4)) {
@@ -2659,7 +2659,7 @@ __nr_t read_fchost(struct stats_fchost *st_fc, __nr_t nr_alloc)
                }
        }
 
-       closedir(dir);
+       __closedir(dir);
        return fch_read;
 }
 
index 56cb5a25339426b3283d8c61a78d9fb2cee1a93c..1136c93d2d35d763ea8684228f6bb8db7ad4426f 100644 (file)
@@ -2999,7 +2999,9 @@ __print_funct_t render_fchost_stats(struct activity *a, int isdb, char *pre,
                                    int curr, unsigned long long itv)
 {
        int i, j, j0, found;
-       struct stats_fchost *sfcc, *sfcp;
+       struct stats_fchost *sfcc, *sfcp, sfczero;
+
+       memset(&sfczero, 0, sizeof(struct stats_fchost));
 
        for (i = 0; i < a->nr[curr]; i++) {
 
@@ -3030,8 +3032,10 @@ __print_funct_t render_fchost_stats(struct activity *a, int isdb, char *pre,
                        while (j != j0);
                }
 
-               if (!found)
-                       continue;
+               if (!found) {
+                       /* This is a newly registered host */
+                       sfcp = &sfczero;
+               }
 
                render(isdb, pre, PT_NOFLAG ,
                       "%s\tfch_rxf/s",
index cd471c54a99cfa7d61803bd01be396c4e446290f..ad5b74aaa97a1decad2e5096ce29ea34cbe74654 100644 (file)
@@ -4937,7 +4937,7 @@ __print_funct_t svg_print_filesystem_stats(struct activity *a, int curr, int act
 __print_funct_t svg_print_fchost_stats(struct activity *a, int curr, int action, struct svg_parm *svg_p,
                                       unsigned long long itv, struct record_header *record_hdr)
 {
-       struct stats_fchost *sfcc, *sfcp;
+       struct stats_fchost *sfcc, *sfcp, sfczero;
        int group[] = {2, 2};
        int g_type[] = {SVG_LINE_GRAPH, SVG_LINE_GRAPH};
        char *title[] = {"Fibre Channel HBA statistics (1)", "Fibre Channel HBA statistics (2)"};
@@ -4963,6 +4963,7 @@ __print_funct_t svg_print_fchost_stats(struct activity *a, int curr, int action,
        }
 
        if (action & F_MAIN) {
+               memset(&sfczero, 0, sizeof(struct stats_fchost));
                restart = svg_p->restart;
                /*
                 * Mark previously registered interfaces as now
@@ -5032,8 +5033,10 @@ __print_funct_t svg_print_fchost_stats(struct activity *a, int curr, int action,
                                while (j != j0);
                        }
 
-                       if (!found)
-                               continue;
+                       if (!found) {
+                               /* This is a newly registered host */
+                               sfcp = &sfczero;
+                       }
 
                        /*
                         * If current interface was marked as previously unregistered,
index cc3a65c4625b407678ee5cdeee0301b267f20e5f..d658fb17f7430f1e4f460582e1084fb49199bf12 100644 (file)
@@ -2140,11 +2140,13 @@ __print_funct_t xml_print_fchost_stats(struct activity *a, int curr, int tab,
                                       unsigned long long itv)
 {
        int i, j, j0, found;
-       struct stats_fchost *sfcc, *sfcp;
+       struct stats_fchost *sfcc, *sfcp, sfczero;
 
        if (!IS_SELECTED(a->options) || (a->nr[curr] <= 0))
                goto close_xml_markup;
 
+       memset(&sfczero, 0, sizeof(struct stats_fchost));
+
        xml_markup_network(tab, OPEN_XML_MARKUP);
        tab++;
 
@@ -2177,8 +2179,10 @@ __print_funct_t xml_print_fchost_stats(struct activity *a, int curr, int tab,
                        while (j != j0);
                }
 
-               if (!found)
-                       continue;
+               if (!found) {
+                       /* This is a newly registered host */
+                       sfcp = &sfczero;
+               }
 
                xprintf(tab, "<fchost name=\"%s\" "
                        "fch_rxf=\"%.2f\" "