char eta_str[128];
char output[256];
double perc = 0.0;
- int i2p = 0;
+ int i, i2p = 0;
gdk_threads_enter();
entry_set_int_value(ui->eta.jobs, je->nr_running);
if (je->eta_sec != INT_MAX && je->nr_running) {
- char *iops_str[2];
- char *rate_str[2];
+ char *iops_str[3];
+ char *rate_str[3];
if ((!je->eta_sec && !eta_good) || je->nr_ramp == je->nr_running)
strcpy(output, "-.-% done");
rate_str[0] = num2str(je->rate[0], 5, 10, i2p);
rate_str[1] = num2str(je->rate[1], 5, 10, i2p);
+ rate_str[2] = num2str(je->rate[2], 5, 10, i2p);
iops_str[0] = num2str(je->iops[0], 4, 1, 0);
iops_str[1] = num2str(je->iops[1], 4, 1, 0);
+ iops_str[2] = num2str(je->iops[2], 4, 1, 0);
gtk_entry_set_text(GTK_ENTRY(ui->eta.read_bw), rate_str[0]);
gtk_entry_set_text(GTK_ENTRY(ui->eta.read_iops), iops_str[0]);
gtk_entry_set_text(GTK_ENTRY(ui->eta.write_bw), rate_str[1]);
gtk_entry_set_text(GTK_ENTRY(ui->eta.write_iops), iops_str[1]);
+ gtk_entry_set_text(GTK_ENTRY(ui->eta.trim_bw), rate_str[2]);
+ gtk_entry_set_text(GTK_ENTRY(ui->eta.trim_iops), iops_str[2]);
graph_add_xy_data(ui->graphs.iops_graph, ui->graphs.read_iops, je->elapsed_sec, je->iops[0], iops_str[0]);
graph_add_xy_data(ui->graphs.iops_graph, ui->graphs.write_iops, je->elapsed_sec, je->iops[1], iops_str[1]);
+ graph_add_xy_data(ui->graphs.iops_graph, ui->graphs.trim_iops, je->elapsed_sec, je->iops[2], iops_str[2]);
graph_add_xy_data(ui->graphs.bandwidth_graph, ui->graphs.read_bw, je->elapsed_sec, je->rate[0], rate_str[0]);
graph_add_xy_data(ui->graphs.bandwidth_graph, ui->graphs.write_bw, je->elapsed_sec, je->rate[1], rate_str[1]);
+ graph_add_xy_data(ui->graphs.bandwidth_graph, ui->graphs.trim_bw, je->elapsed_sec, je->rate[2], rate_str[2]);
- free(rate_str[0]);
- free(rate_str[1]);
- free(iops_str[0]);
- free(iops_str[1]);
+ for (i = 0; i < DDIR_RWDIR_CNT; i++) {
+ free(rate_str[i]);
+ free(iops_str[i]);
+ }
}
if (eta_str[0]) {
struct group_run_stats *rs,
struct thread_stat *ts, int ddir)
{
- const char *ddir_label[2] = { "Read", "Write" };
+ const char *ddir_label[3] = { "Read", "Write", "Trim" };
GtkWidget *frame, *label, *box, *vbox, *main_vbox;
unsigned long min[3], max[3], runt;
unsigned long long bw, iops;
struct group_run_stats *rs)
{
GtkWidget *box, *vbox, *entry, *scroll;
+ int i;
scroll = gtk_scrolled_window_new(NULL, NULL);
gtk_container_set_border_width(GTK_CONTAINER(scroll), 5);
entry = new_info_entry_in_frame(box, "PID");
entry_set_int_value(entry, ts->pid);
- if (ts->io_bytes[DDIR_READ])
- gfio_show_ddir_status(gc, vbox, rs, ts, DDIR_READ);
- if (ts->io_bytes[DDIR_WRITE])
- gfio_show_ddir_status(gc, vbox, rs, ts, DDIR_WRITE);
+ for (i = 0; i < DDIR_RWDIR_CNT; i++) {
+ if (ts->io_bytes[i])
+ gfio_show_ddir_status(gc, vbox, rs, ts, i);
+ }
gfio_show_latency_buckets(gc, vbox, ts);
gfio_show_cpu_usage(vbox, ts);
gg->trim_iops = graph_add_label(g, "Trim IOPS");
graph_set_color(g, gg->read_iops, GFIO_READ_R, GFIO_READ_G, GFIO_READ_B);
graph_set_color(g, gg->write_iops, GFIO_WRITE_R, GFIO_WRITE_G, GFIO_WRITE_B);
- graph_set_color(g, gg->trim_iops, GFIO_IOPS_R, GFIO_IOPS_G, GFIO_IOPS_B);
+ graph_set_color(g, gg->trim_iops, GFIO_TRIM_R, GFIO_TRIM_G, GFIO_TRIM_B);
line_graph_set_data_count_limit(g, gfio_graph_limit);
graph_add_extra_space(g, 0.0, 0.0, 0.0, 0.0);
graph_set_graph_all_zeroes(g, 0);
gg->trim_bw = graph_add_label(g, "Trim Bandwidth");
graph_set_color(g, gg->read_bw, GFIO_READ_R, GFIO_READ_G, GFIO_READ_B);
graph_set_color(g, gg->write_bw, GFIO_WRITE_R, GFIO_WRITE_G, GFIO_WRITE_B);
- graph_set_color(g, gg->trim_bw, GFIO_IOPS_R, GFIO_IOPS_G, GFIO_IOPS_B);
+ graph_set_color(g, gg->trim_bw, GFIO_TRIM_R, GFIO_TRIM_G, GFIO_TRIM_B);
graph_set_base_offset(g, 1);
line_graph_set_data_count_limit(g, 100);
graph_add_extra_space(g, 0.0, 0.0, 0.0, 0.0);
multitext_free(&ge->eta.iodepth);
}
-static void fill_color_from_rgb(GdkColor *c, gfloat r, gfloat g, gfloat b)
-{
- gint R, G, B;
- gchar tmp[8];
-
- memset(c, 0, sizeof(*c));
- R = r * 255;
- G = g * 255;
- B = b * 255;
- snprintf(tmp, sizeof(tmp), "#%02x%02x%02x", R, G, B);
- gdk_color_parse(tmp, c);
-}
-
static GtkWidget *new_client_page(struct gui_entry *ge)
{
GtkWidget *main_vbox, *probe, *probe_frame, *probe_box;
GtkWidget *scrolled_window, *bottom_align, *top_align, *top_vbox;
- GdkColor color;
main_vbox = gtk_vbox_new(FALSE, 3);
probe_box = gtk_hbox_new(FALSE, 3);
gtk_box_pack_start(GTK_BOX(probe_frame), probe_box, FALSE, FALSE, 3);
- ge->eta.read_bw = new_info_entry_in_frame(probe_box, "Read BW");
- ge->eta.read_iops = new_info_entry_in_frame(probe_box, "IOPS");
- ge->eta.write_bw = new_info_entry_in_frame(probe_box, "Write BW");
- ge->eta.write_iops = new_info_entry_in_frame(probe_box, "IOPS");
- ge->eta.trim_bw = new_info_entry_in_frame(probe_box, "Trim BW");
- ge->eta.trim_iops = new_info_entry_in_frame(probe_box, "IOPS");
-
- fill_color_from_rgb(&color, GFIO_READ_R, GFIO_READ_G, GFIO_READ_B);
- gtk_widget_modify_text(ge->eta.read_bw, GTK_STATE_NORMAL, &color);
- gtk_widget_modify_text(ge->eta.read_iops, GTK_STATE_NORMAL, &color);
-
- fill_color_from_rgb(&color, GFIO_WRITE_R, GFIO_WRITE_G, GFIO_WRITE_B);
- gtk_widget_modify_text(ge->eta.write_bw, GTK_STATE_NORMAL, &color);
- gtk_widget_modify_text(ge->eta.write_iops, GTK_STATE_NORMAL, &color);
-
- fill_color_from_rgb(&color, GFIO_IOPS_R, GFIO_IOPS_G, GFIO_IOPS_B);
- gtk_widget_modify_text(ge->eta.trim_bw, GTK_STATE_NORMAL, &color);
- gtk_widget_modify_text(ge->eta.trim_iops, GTK_STATE_NORMAL, &color);
+ ge->eta.read_bw = new_info_entry_in_frame_rgb(probe_box, "Read BW", GFIO_READ_R, GFIO_READ_G, GFIO_READ_B);
+ ge->eta.read_iops = new_info_entry_in_frame_rgb(probe_box, "IOPS", GFIO_READ_R, GFIO_READ_G, GFIO_READ_B);
+ ge->eta.write_bw = new_info_entry_in_frame_rgb(probe_box, "Write BW", GFIO_WRITE_R, GFIO_WRITE_G, GFIO_WRITE_B);
+ ge->eta.write_iops = new_info_entry_in_frame_rgb(probe_box, "IOPS", GFIO_WRITE_R, GFIO_WRITE_G, GFIO_WRITE_B);
+ ge->eta.trim_bw = new_info_entry_in_frame_rgb(probe_box, "Trim BW", GFIO_TRIM_R, GFIO_TRIM_G, GFIO_TRIM_B);
+ ge->eta.trim_iops = new_info_entry_in_frame_rgb(probe_box, "IOPS", GFIO_TRIM_R, GFIO_TRIM_G, GFIO_TRIM_B);
/*
* Only add this if we have a commit rate
probe_box = gtk_hbox_new(FALSE, 3);
gtk_box_pack_start(GTK_BOX(probe_frame), probe_box, FALSE, FALSE, 3);
ui->eta.jobs = new_info_entry_in_frame(probe_box, "Running");
- ui->eta.read_bw = new_info_entry_in_frame(probe_box, "Read BW");
- ui->eta.read_iops = new_info_entry_in_frame(probe_box, "IOPS");
- ui->eta.write_bw = new_info_entry_in_frame(probe_box, "Write BW");
- ui->eta.write_iops = new_info_entry_in_frame(probe_box, "IOPS");
- ui->eta.trim_bw = new_info_entry_in_frame(probe_box, "Trim BW");
- ui->eta.trim_iops = new_info_entry_in_frame(probe_box, "IOPS");
-
+ ui->eta.read_bw = new_info_entry_in_frame_rgb(probe_box, "Read BW", GFIO_READ_R, GFIO_READ_G, GFIO_READ_B);
+ ui->eta.read_iops = new_info_entry_in_frame_rgb(probe_box, "IOPS", GFIO_READ_R, GFIO_READ_G, GFIO_READ_B);
+ ui->eta.write_bw = new_info_entry_in_frame_rgb(probe_box, "Write BW", GFIO_WRITE_R, GFIO_WRITE_G, GFIO_WRITE_B);
+ ui->eta.write_iops = new_info_entry_in_frame_rgb(probe_box, "IOPS", GFIO_WRITE_R, GFIO_WRITE_G, GFIO_WRITE_B);
+ ui->eta.trim_bw = new_info_entry_in_frame_rgb(probe_box, "Trim BW", GFIO_TRIM_R, GFIO_TRIM_G, GFIO_TRIM_B);
+ ui->eta.trim_iops = new_info_entry_in_frame_rgb(probe_box, "IOPS", GFIO_TRIM_R, GFIO_TRIM_G, GFIO_TRIM_B);
/*
* Only add this if we have a commit rate