JSON output, code formatting changes
authorVincent Fu <Vincent.Fu@sandisk.com>
Wed, 13 Jul 2016 18:00:59 +0000 (14:00 -0400)
committerJens Axboe <axboe@fb.com>
Mon, 15 Aug 2016 15:44:52 +0000 (09:44 -0600)
1. Change 'criterion' to match the specified limit. It will always be a string.
If the specified limit was a percentage, 'criterion' will also be a percentage (e.g., "0.0123%").
If the specified limit was not a percentage, 'criterion' will be a number (e.g., "12345").

2. Move JSON mean IOPS, BW to the top of the steadystate['data'] section

stat.c
steadystate.c

diff --git a/stat.c b/stat.c
index 42fe0faf37c3a504854c18b703d3d90732993528..68a4a27609c5fcbec66b0fe55dda7c28f95120a0 100644 (file)
--- a/stat.c
+++ b/stat.c
@@ -1260,11 +1260,12 @@ static struct json_object *show_thread_status_json(struct thread_stat *ts,
                struct json_object *data;
                struct json_array *iops, *bw;
                struct steadystate_data *ss = ts->ss;
-               double mean_iops = 0.0, mean_bw = 0.0;
+               unsigned long long sum_iops, sum_bw;
+               double mean_iops, mean_bw;
                int i, x;
-               char ss_option[64];
+               char ss_buf[64];
 
-               snprintf(ss_option, sizeof(ss_option), "%s%s:%f%s", 
+               snprintf(ss_buf, sizeof(ss_buf), "%s%s:%f%s",
                        ss->check_iops ? "iops" : "bw",
                        ss->check_slope ? "_slope" : "",
                        (float) ss->limit,
@@ -1272,11 +1273,13 @@ static struct json_object *show_thread_status_json(struct thread_stat *ts,
 
                tmp = json_create_object();
                json_object_add_value_object(root, "steadystate", tmp);
-               json_object_add_value_string(tmp, "ss", ss_option);
+               json_object_add_value_string(tmp, "ss", ss_buf);
                json_object_add_value_int(tmp, "duration", (int)ss->dur);
                json_object_add_value_int(tmp, "steadystate_ramptime", ss->ramp_time / 1000000L);
                json_object_add_value_int(tmp, "attained", ss->attained);
-               json_object_add_value_float(tmp, "criterion", ss->pct ? ss->criterion / 100 : ss->criterion);
+
+               snprintf(ss_buf, sizeof(ss_buf), "%f%s", (float) ss->criterion, ss->pct ? "%" : "");
+               json_object_add_value_string(tmp, "criterion", ss_buf);
                json_object_add_value_float(tmp, "max_deviation", ss->deviation);
                json_object_add_value_float(tmp, "slope", ss->slope);
 
@@ -1284,19 +1287,19 @@ static struct json_object *show_thread_status_json(struct thread_stat *ts,
                json_object_add_value_object(tmp, "data", data);
                bw = json_create_array();
                iops = json_create_array();
-               json_object_add_value_array(data, "iops", iops);
-               json_object_add_value_array(data, "bw", bw);
-               for (i = 0; i < ss->dur; i++) {
+               for (i = 0, sum_iops = 0, sum_bw = 0; i < ss->dur; i++) {
                        x = (ss->head + i) % ss->dur;
-                       mean_bw += (double) ss->bw_data[x];
-                       mean_iops += (double) ss->iops_data[x];
+                       sum_bw += ss->bw_data[x];
+                       sum_iops += ss->iops_data[x];
                        json_array_add_value_int(bw, ss->bw_data[x]);
                        json_array_add_value_int(iops, ss->iops_data[x]);
                }
-               mean_bw /= ss->dur;
-               mean_iops /= ss->dur;
+               mean_bw = (double) sum_bw / ss->dur;
+               mean_iops = (double) sum_iops / ss->dur;
                json_object_add_value_float(data, "bw_mean", mean_bw);
                json_object_add_value_float(data, "iops_mean", mean_iops);
+               json_object_add_value_array(data, "iops", iops);
+               json_object_add_value_array(data, "bw", bw);
        }
 
        return root;
index c12ea245aa7863981c70535c1e17f3871d6d0086..3b9b6ef7461835f78a6d82b2c45fbadc97b0b6c5 100644 (file)
@@ -180,12 +180,12 @@ bool steadystate_slope(unsigned long iops, unsigned long bw, struct thread_data
                 * calculations.
                 */
                ss->slope = (ss->sum_xy - (double) ss->sum_x * ss->sum_y / ss->dur) / (ss->sum_x_sq - (double) ss->sum_x * ss->sum_x / ss->dur);
-               ss->criterion = ss->pct ? ss->slope / (ss->sum_y / ss->dur) * 100.0: ss->slope;
+               ss->criterion = ss->pct ? 100.0 * ss->slope / (ss->sum_y / ss->dur) : ss->slope;
 
                dprint(FD_STEADYSTATE, "sum_y: %llu, sum_xy: %llu, slope: %f, criterion: %f, limit: %f\n",
                        ss->sum_y, ss->sum_xy, ss->slope, ss->criterion, ss->limit);
 
-               result = ss->criterion * (ss->criterion < 0.0 ? -1 : 1);
+               result = ss->criterion * (ss->criterion < 0.0 ? -1.0 : 1.0);
                if (result < ss->limit)
                        return true;
        }
@@ -225,10 +225,10 @@ bool steadystate_deviation(unsigned long iops, unsigned long bw, struct thread_d
                for (i = 0; i < ss->dur; i++)
                {       
                        diff = (double) (ss->check_iops ? ss->iops_data[i] : ss->bw_data[i]) - mean;
-                       ss->deviation = max(ss->deviation, diff * (diff < 0.0 ? -1 : 1));
+                       ss->deviation = max(ss->deviation, diff * (diff < 0.0 ? -1.0 : 1.0));
                }
 
-               ss->criterion = ss->pct ? ss->deviation / mean * 100.0 : ss->deviation;
+               ss->criterion = ss->pct ? 100.0 * ss->deviation / mean : ss->deviation;
 
                dprint(FD_STEADYSTATE, "sum_y: %llu, mean: %f, max diff: %f, objective: %f, limit: %f\n", ss->sum_y, mean, ss->deviation, ss->criterion, ss->limit);