From 912171a43f3f21322b3b921ad7c08ea8332a0665 Mon Sep 17 00:00:00 2001 From: Tim Stack Date: Sun, 20 Aug 2023 06:43:16 -0700 Subject: [PATCH] [vmw_vc_svc_log] fixup for this format Also, some optimizations for gantt index building --- src/formats/vmw_vc_svc_log.json | 26 +++++- src/gantt_source.cc | 91 ++++++++++--------- src/gantt_source.hh | 24 ++++- src/log_format.cc | 5 + src/ptimec.hh | 41 +++++++-- ...f11588ee36bab7e2caea0f7a24d3c9cafd2310.out | 58 ++++++------ ...ed8a7400042814ba13e50be5e3bd1741d82119.out | 52 +++++------ ...13ab41c3cca76cf05a01ca1ba65888be247ada.out | 38 ++++---- ...a4681a5a671c84c020dc91d7ce03c9d17fde07.out | 44 ++++----- 9 files changed, 229 insertions(+), 150 deletions(-) diff --git a/src/formats/vmw_vc_svc_log.json b/src/formats/vmw_vc_svc_log.json index ed507f77..a1c06137 100644 --- a/src/formats/vmw_vc_svc_log.json +++ b/src/formats/vmw_vc_svc_log.json @@ -6,10 +6,30 @@ "url": "https://docs.vmware.com/en/VMware-vSphere/7.0/vmware-vsphere-with-tanzu/GUID-2A989D79-463C-4EC8-A5F2-CDC3A2C827FB.html", "regex": { "std": { - "pattern": "^(?\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{3}Z)\\s+(?\\w+)\\s+(?\\w+)\\s\\[(?[^:]+):(?\\d+)\\](\\s+\\[opID=(?[^\\]]+)\\])?\\s+(?.*)" + "pattern": "^(?\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{1,3}Z)\\s+(?\\w+)\\s+(?\\w+)\\s\\[(?[^:]+):(?\\d+)\\](\\s+\\[opID=(?[^\\]]+)\\])?\\s+(?.*)" } }, "opid-field": "opid", + "opid": { + "description": { + "vlcm-session": { + "format": [ + { + "field": "body", + "extractor": "(Created session for .*)" + } + ] + }, + "vlcm-download": { + "format": [ + { + "field": "body", + "extractor": "Validating the URL: .*(/[^/]+)" + } + ] + } + } + }, "value": { "body": { "kind": "string" @@ -42,6 +62,10 @@ { "line": "2022-06-02T08:35:17.031Z info vlcm [logger/teelogger.go:47] [opID=vapi] Loading Introspection Services", "level": "info" + }, + { + "line": "2023-07-19T03:05:15.97Z info vlcm [serviceconfig/config.go:377] Getting timeout properties for deployment type: tiny", + "level": "info" } ] } diff --git a/src/gantt_source.cc b/src/gantt_source.cc index c25b1610..298eda4c 100644 --- a/src/gantt_source.cc +++ b/src/gantt_source.cc @@ -37,6 +37,7 @@ #include "base/humanize.time.hh" #include "base/math_util.hh" #include "command_executor.hh" +#include "intervaltree/IntervalTree.h" #include "md4cpp.hh" #include "sql_util.hh" @@ -252,7 +253,7 @@ gantt_header_overlay::list_value_for_overlay( return; } - const auto& row = this->gho_src->gs_time_order[line]; + const auto& row = this->gho_src->gs_time_order[line].get(); if (row.or_value.otr_sub_ops.size() <= 1) { return; @@ -348,10 +349,12 @@ gantt_source::get_time_bounds_for(int line) static const int CONTEXT_LINES = 5; const auto& low_row - = this->gs_time_order[std::max(0, line - CONTEXT_LINES)]; - const auto& sel_row = this->gs_time_order[line]; - const auto& high_row = this->gs_time_order[std::min( - line + CONTEXT_LINES, (int) this->gs_time_order.size() - 1)]; + = this->gs_time_order[std::max(0, line - CONTEXT_LINES)].get(); + const auto& sel_row = this->gs_time_order[line].get(); + const auto& high_row + = this->gs_time_order[std::min(line + CONTEXT_LINES, + (int) this->gs_time_order.size() - 1)] + .get(); auto high_tv_sec = std::max(sel_row.or_value.otr_range.tr_end.tv_sec, high_row.or_value.otr_range.tr_begin.tv_sec); @@ -393,7 +396,7 @@ gantt_source::text_value_for_line(textview_curses& tc, text_sub_source::line_flags_t flags) { if (line < this->gs_time_order.size()) { - const auto& row = this->gs_time_order[line]; + const auto& row = this->gs_time_order[line].get(); auto duration = row.or_value.otr_range.tr_end - row.or_value.otr_range.tr_begin; auto duration_str = fmt::format( @@ -432,7 +435,7 @@ gantt_source::text_attrs_for_line(textview_curses& tc, string_attrs_t& value_out) { if (line < this->gs_time_order.size()) { - const auto& row = this->gs_time_order[line]; + const auto& row = this->gs_time_order[line].get(); value_out = this->gs_rendered_line.get_attrs(); @@ -509,6 +512,7 @@ gantt_source::rebuild_indexes() this->gs_opid_width = 0; this->gs_total_width = 0; this->gs_filtered_count = 0; + this->gs_active_opids.clear(); this->gs_opid_map.clear(); this->gs_subid_map.clear(); this->gs_allocator.reset(); @@ -520,7 +524,6 @@ gantt_source::rebuild_indexes() auto max_desc_width = size_t{0}; - std::map active_opids; for (const auto& ld : this->gs_lss) { if (ld->get_file_ptr() == nullptr) { continue; @@ -543,9 +546,9 @@ gantt_source::rebuild_indexes() iter = emp_res.first; } - auto active_iter = active_opids.find(pair.first); - if (active_iter == active_opids.end()) { - auto active_emp_res = active_opids.emplace( + auto active_iter = this->gs_active_opids.find(pair.first); + if (active_iter == this->gs_active_opids.end()) { + auto active_emp_res = this->gs_active_opids.emplace( iter->first, opid_row{iter->first, otr}); active_iter = active_emp_res.first; } else { @@ -592,22 +595,6 @@ gantt_source::rebuild_indexes() } } - std::multimap time_order_map; - for (const auto& pair : active_opids) { - if (this->gs_lower_bound.tv_sec == 0 - || pair.second.or_value.otr_range.tr_begin < this->gs_lower_bound) - { - this->gs_lower_bound = pair.second.or_value.otr_range.tr_begin; - } - if (this->gs_upper_bound.tv_sec == 0 - || this->gs_upper_bound < pair.second.or_value.otr_range.tr_end) - { - this->gs_upper_bound = pair.second.or_value.otr_range.tr_end; - } - time_order_map.emplace(pair.second.or_value.otr_range.tr_begin, - pair.second); - } - this->gs_time_order.clear(); size_t filtered_in_count = 0; for (const auto& filt : this->tss_filters) { if (!filt->is_enabled()) { @@ -618,7 +605,9 @@ gantt_source::rebuild_indexes() } } this->gs_filter_hits = {}; - for (auto& pair : time_order_map) { + this->gs_time_order.clear(); + this->gs_time_order.reserve(this->gs_active_opids.size()); + for (auto& pair : this->gs_active_opids) { auto& otr = pair.second.or_value; auto& full_desc = pair.second.or_description; for (auto& desc : pair.second.or_descriptions) { @@ -688,13 +677,31 @@ gantt_source::rebuild_indexes() if (full_desc.size() > max_desc_width) { max_desc_width = full_desc.size(); } - if (pair.second.or_value.otr_level_stats.lls_error_count > 0) { - bm_errs.insert_once(vis_line_t(this->gs_time_order.size())); - } else if (pair.second.or_value.otr_level_stats.lls_warning_count > 0) { - bm_warns.insert_once(vis_line_t(this->gs_time_order.size())); + + if (this->gs_lower_bound.tv_sec == 0 + || pair.second.or_value.otr_range.tr_begin < this->gs_lower_bound) + { + this->gs_lower_bound = pair.second.or_value.otr_range.tr_begin; } - this->gs_time_order.emplace_back(std::move(pair.second)); + if (this->gs_upper_bound.tv_sec == 0 + || this->gs_upper_bound < pair.second.or_value.otr_range.tr_end) + { + this->gs_upper_bound = pair.second.or_value.otr_range.tr_end; + } + this->gs_time_order.emplace_back(pair.second); } + std::stable_sort(this->gs_time_order.begin(), + this->gs_time_order.end(), + std::less{}); + for (size_t lpc = 0; lpc < this->gs_time_order.size(); lpc++) { + const auto& row = this->gs_time_order[lpc].get(); + if (row.or_value.otr_level_stats.lls_error_count > 0) { + bm_errs.insert_once(vis_line_t(lpc)); + } else if (row.or_value.otr_level_stats.lls_warning_count > 0) { + bm_warns.insert_once(vis_line_t(lpc)); + } + } + this->gs_opid_width = std::min(this->gs_opid_width, MAX_OPID_WIDTH); this->gs_total_width = std::max(22 + this->gs_opid_width + max_desc_width, @@ -712,29 +719,29 @@ gantt_source::row_for_time(struct timeval time_bucket) return nonstd::nullopt; } - if (iter->or_value.otr_range.contains_inclusive(time_bucket)) { + if (iter->get().or_value.otr_range.contains_inclusive(time_bucket)) { break; } ++iter; } auto closest_iter = iter; - auto closest_diff = time_bucket - iter->or_value.otr_range.tr_begin; + auto closest_diff = time_bucket - iter->get().or_value.otr_range.tr_begin; for (; iter != this->gs_time_order.end(); ++iter) { - if (time_bucket < iter->or_value.otr_range.tr_begin) { + if (time_bucket < iter->get().or_value.otr_range.tr_begin) { break; } - if (!iter->or_value.otr_range.contains_inclusive(time_bucket)) { + if (!iter->get().or_value.otr_range.contains_inclusive(time_bucket)) { continue; } - auto diff = time_bucket - iter->or_value.otr_range.tr_begin; + auto diff = time_bucket - iter->get().or_value.otr_range.tr_begin; if (diff < closest_diff) { closest_iter = iter; closest_diff = diff; } - for (const auto& sub : iter->or_value.otr_sub_ops) { + for (const auto& sub : iter->get().or_value.otr_sub_ops) { if (!sub.ostr_range.contains_inclusive(time_bucket)) { continue; } @@ -757,7 +764,7 @@ gantt_source::time_for_row(vis_line_t row) return nonstd::nullopt; } - const auto& otr = this->gs_time_order[row].or_value; + const auto& otr = this->gs_time_order[row].get().or_value; if (this->tss_view->get_selection() == row) { auto ov_sel = this->tss_view->get_overlay_selection(); @@ -788,7 +795,7 @@ gantt_source::text_selection_changed(textview_curses& tc) return; } - const auto& row = this->gs_time_order[sel]; + const auto& row = this->gs_time_order[sel].get(); auto low_tv = row.or_value.otr_range.tr_begin; auto high_tv = row.or_value.otr_range.tr_end; auto id_sf = row.or_name; @@ -923,7 +930,7 @@ gantt_source::text_crumbs_for_line(int line, return; } - const auto& row = this->gs_time_order[line]; + const auto& row = this->gs_time_order[line].get(); char ts[64]; sql_strftime(ts, sizeof(ts), row.or_value.otr_range.tr_begin, 'T'); diff --git a/src/gantt_source.hh b/src/gantt_source.hh index 279a196b..183e8c6a 100644 --- a/src/gantt_source.hh +++ b/src/gantt_source.hh @@ -112,12 +112,34 @@ public: std::map>> or_descriptions; std::string or_description; + + bool operator<(const opid_row& rhs) const + { + if (this->or_value.otr_range < rhs.or_value.otr_range) { + return true; + } + if (this->or_value.otr_range.tr_begin + == rhs.or_value.otr_range.tr_begin + && this->or_name < rhs.or_name) + { + return true; + } + + return false; + } }; + using gantt_opid_row_map + = robin_hood::unordered_map>; + attr_line_t gs_rendered_line; size_t gs_opid_width{0}; size_t gs_total_width{0}; - std::vector gs_time_order; + gantt_opid_row_map gs_active_opids; + std::vector> gs_time_order; struct timeval gs_lower_bound {}; struct timeval gs_upper_bound {}; size_t gs_filtered_count{0}; diff --git a/src/log_format.cc b/src/log_format.cc index e3285699..9ae8eb74 100644 --- a/src/log_format.cc +++ b/src/log_format.cc @@ -1287,6 +1287,11 @@ external_log_format::scan(logfile& lf, { this->lf_date_time.relock(ls); continue; + } else { + log_debug("%s:%d:date-time re-locked to %d", + lf.get_unique_path().c_str(), + dst.size(), + this->lf_date_time.dts_fmt_lock); } } diff --git a/src/ptimec.hh b/src/ptimec.hh index e4f482f5..ea551a37 100644 --- a/src/ptimec.hh +++ b/src/ptimec.hh @@ -393,18 +393,39 @@ ftime_q(char* dst, off_t& off_inout, ssize_t len, const struct exttm& tm) inline bool ptime_L(struct exttm* dst, const char* str, off_t& off_inout, ssize_t len) { + auto avail = len - off_inout; int ms = 0; - PTIME_CONSUME(3, { - char c0 = str[off_inout]; - char c1 = str[off_inout + 1]; - char c2 = str[off_inout + 2]; - if (!isdigit(c0) || !isdigit(c1) || !isdigit(c2)) { - return false; - } - ms = ((str[off_inout] - '0') * 100 + (str[off_inout + 1] - '0') * 10 - + (str[off_inout + 2] - '0')); - }); + if (avail >= 3 && isdigit(str[off_inout + 2])) { + PTIME_CONSUME(3, { + char c0 = str[off_inout]; + char c1 = str[off_inout + 1]; + char c2 = str[off_inout + 2]; + if (!isdigit(c0) || !isdigit(c1) || !isdigit(c2)) { + return false; + } + ms = ((str[off_inout] - '0') * 100 + (str[off_inout + 1] - '0') * 10 + + (str[off_inout + 2] - '0')); + }); + } else if (avail >= 2 && isdigit(str[off_inout + 1])) { + PTIME_CONSUME(2, { + char c0 = str[off_inout]; + char c1 = str[off_inout + 1]; + if (!isdigit(c0) || !isdigit(c1)) { + return false; + } + ms = ((str[off_inout] - '0') * 100 + + (str[off_inout + 1] - '0') * 10); + }); + } else { + PTIME_CONSUME(1, { + char c0 = str[off_inout]; + if (!isdigit(c0)) { + return false; + } + ms = (str[off_inout] - '0') * 100; + }); + } if ((ms >= 0 && ms <= 999)) { dst->et_flags |= ETF_MILLIS_SET; diff --git a/test/expected/test_gantt.sh_3af11588ee36bab7e2caea0f7a24d3c9cafd2310.out b/test/expected/test_gantt.sh_3af11588ee36bab7e2caea0f7a24d3c9cafd2310.out index c523914d..bd4d8ab2 100644 --- a/test/expected/test_gantt.sh_3af11588ee36bab7e2caea0f7a24d3c9cafd2310.out +++ b/test/expected/test_gantt.sh_3af11588ee36bab7e2caea0f7a24d3c9cafd2310.out @@ -2,31 +2,31 @@ 5m  Duration | ✘▲ | Operation  844    CwFs1P2UcUdlSxD2La 192.168.2.76 -     CoX7zA3OJKGUOSCBY2 192.168.2.76 +     C6Q4Vm14ZJIlZhsXqk 192.168.2.76 +     CoX7zA3OJKGUOSCBY2 192.168.2.76      CdrfXZ1NOFPEawF218 192.168.2.76 -     CJwUi9bdB9c1lLW44  192.168.2.76 +     CJwUi9bdB9c1lLW44  192.168.2.76      CJxSUgkInyKSHiju1  192.168.2.76 -     CT0JIh479jXIGt0Po1 192.168.2.76 -     C6Q4Vm14ZJIlZhsXqk 192.168.2.76 - 1s070    CtgxRAqDLvrRUQdqe  192.168.2.76 -     CdysLK1XpcrXOpVDuh 192.168.2.76 +     CT0JIh479jXIGt0Po1 192.168.2.76 +     CdysLK1XpcrXOpVDuh 192.168.2.76 + 1s070    CtgxRAqDLvrRUQdqe  192.168.2.76  200    C6nSoj1Qco9PGyslz6 192.168.2.76  23s044    CN5hnY3x51j6Hr1v4 192.168.2.76      CdZUPH2DKOE7zzCLE3 192.168.2.76  32s388    CmWpC33jXuKpXNLcie 192.168.2.76      CsBgiE1WmGP4Yo749h 192.168.2.76 - 657    CYfHyC28tAhkLYkXB7 192.168.2.76 -     CtANmVrHYMtkWqPE5  192.168.2.76 - 647    CSTH8n1O1nv0ztxNQd 192.168.2.76 -     C4uDKU5tpeRU9Su19  192.168.2.76 +     C4uDKU5tpeRU9Su19  192.168.2.76 + 647    CSTH8n1O1nv0ztxNQd 192.168.2.76 + 657    CYfHyC28tAhkLYkXB7 192.168.2.76 +     CtANmVrHYMtkWqPE5  192.168.2.76 + 6s917    CAUlC249svUfE6q0g3 192.168.2.76      CEh6Ka2HInkNSH01L2 192.168.2.76 - 4s840    CjPGiy13ncXKxU765j 192.168.2.76 + 4s840    CjPGiy13ncXKxU765j 192.168.2.76  6s895    CPoz7NUpXISemlNSd  192.168.2.76 - 6s837    Ct6ixh35y9AEr7J7o9 192.168.2.76 + 6s837    Ct6ixh35y9AEr7J7o9 192.168.2.76  6s889    CaEFHq2HVQ5iGJQiD9 192.168.2.76 - 6s875    CjinlH2fzDtvzI9637 192.168.2.76 + 6s875    CjinlH2fzDtvzI9637 192.168.2.76  6s884    Cedw7H3ddE2yLiLoXc 192.168.2.76 - 6s917    CAUlC249svUfE6q0g3 192.168.2.76      CIJIDL1ULo4HpT24Gl 192.168.2.76  016    CLsqp41RLUd83arUQb 192.168.2.76  166    CbCciH11995WKkobR1 192.168.2.76 @@ -51,17 +51,17 @@   █  CBHHuR1xFnm5C5CQBc 192.168.2.76      CD1jfU3p9abEm77mzf 192.168.2.76      C0K9DaoPFkfnzwlZa 192.168.2.76 + 205    CBeaXe4Iyj1gXd2Iq 192.168.2.76 + 315    CX1GjC4vn52UY1uDv6 192.168.2.76 + 1m12s201    CbNCgO1MzloHRNeY4f 192.168.2.76 +     CaPClb1Bf0RrRGtyWi 192.168.2.76  616    CbQAWi3GX2bCmX5L56 192.168.2.76  298    Cd8s2R3OGDgkhnvSu9 192.168.2.76 - 205    CBeaXe4Iyj1gXd2Iq 192.168.2.76      CmWpSw3VtjiAceBCwf 192.168.2.76 - 1m12s201    CbNCgO1MzloHRNeY4f 192.168.2.76 - 315    CX1GjC4vn52UY1uDv6 192.168.2.76 -     CaPClb1Bf0RrRGtyWi 192.168.2.76 - 35s642    CibfNy1QQW4ImDWRq5 192.168.2.76 - 1m11s547    CTRXSR3blXJE5ZE7Ij 192.168.2.76 - 1m11s536    CnGze54kQWWpKqrrZ4 192.168.2.76 - 12s337    C3TZMB4CrUwYfkGJy1 192.168.2.76 + 1m11s547    CTRXSR3blXJE5ZE7Ij 192.168.2.76 + 12s337    C3TZMB4CrUwYfkGJy1 192.168.2.76 + 35s642    CibfNy1QQW4ImDWRq5 192.168.2.76 + 1m11s536    CnGze54kQWWpKqrrZ4 192.168.2.76      CK957ERTz8lBycly4 192.168.2.76  1s309    CO5QKYQkcSdxQFA35 192.168.2.76      CurHpb1TGZOktTRNP1 192.168.2.76 @@ -69,18 +69,18 @@      C3xkHgJnzZszVSTpi 192.168.2.76      CMrjgF2XLmRh9C9TR4 192.168.2.76      C2vQ8sVgyADHjtEda 192.168.2.76 -     CD69521bDXIAb4IkW 192.168.2.76  6s648    CC3vUI3gFB04zLvWRa 192.168.2.76 +     CD69521bDXIAb4IkW 192.168.2.76  2s666    C7Krri4g9tZfHniGXh 192.168.2.76      CmxyBl2c8XAMTuHEk4 192.168.2.76  499    CSvs6v26bQqFylkk6l 192.168.2.76      C4pHul1H3OeWYz7o7i 192.168.2.76 +     C6MrHk2C7rLuJqhjsg 192.168.2.76      C7Lcvr4vsTf6eYpBva 192.168.2.76 -     CV8faD4L1sLL5kDwN9 192.168.2.76 -     CxyAKs10ppnHFP6O8i 192.168.2.76 -     C6MrHk2C7rLuJqhjsg 192.168.2.76 +     CBX0254QJoklXNbvv2 192.168.2.76 +     CV8faD4L1sLL5kDwN9 192.168.2.76 +     CxyAKs10ppnHFP6O8i 192.168.2.76      CvfUrT2DgYXXoZw9Ah 192.168.2.76 -     CBX0254QJoklXNbvv2 192.168.2.76      C6Ym6jvMgikT0xTTc 192.168.2.76 -     CRNn9f1zKNlzHSM5pa 192.168.2.76 -     CJLgi92kpp2gLgGTE5 192.168.2.76 +     CJLgi92kpp2gLgGTE5 192.168.2.76 +     CRNn9f1zKNlzHSM5pa 192.168.2.76 diff --git a/test/expected/test_gantt.sh_8fed8a7400042814ba13e50be5e3bd1741d82119.out b/test/expected/test_gantt.sh_8fed8a7400042814ba13e50be5e3bd1741d82119.out index ffa94592..02b371f6 100644 --- a/test/expected/test_gantt.sh_8fed8a7400042814ba13e50be5e3bd1741d82119.out +++ b/test/expected/test_gantt.sh_8fed8a7400042814ba13e50be5e3bd1741d82119.out @@ -2,30 +2,30 @@ 5m  Duration | ✘▲ | Operation  844    CwFs1P2UcUdlSxD2La 192.168.2.76 -     CoX7zA3OJKGUOSCBY2 192.168.2.76 +     C6Q4Vm14ZJIlZhsXqk 192.168.2.76 +     CoX7zA3OJKGUOSCBY2 192.168.2.76      CdrfXZ1NOFPEawF218 192.168.2.76 -     CJwUi9bdB9c1lLW44  192.168.2.76 +     CJwUi9bdB9c1lLW44  192.168.2.76      CJxSUgkInyKSHiju1  192.168.2.76 -     CT0JIh479jXIGt0Po1 192.168.2.76 -     C6Q4Vm14ZJIlZhsXqk 192.168.2.76 +     CT0JIh479jXIGt0Po1 192.168.2.76  1s070    CtgxRAqDLvrRUQdqe  192.168.2.76  200    C6nSoj1Qco9PGyslz6 192.168.2.76  23s044    CN5hnY3x51j6Hr1v4 192.168.2.76      CdZUPH2DKOE7zzCLE3 192.168.2.76  32s388    CmWpC33jXuKpXNLcie 192.168.2.76      CsBgiE1WmGP4Yo749h 192.168.2.76 - 657    CYfHyC28tAhkLYkXB7 192.168.2.76 -     CtANmVrHYMtkWqPE5  192.168.2.76 - 647    CSTH8n1O1nv0ztxNQd 192.168.2.76      C4uDKU5tpeRU9Su19  192.168.2.76 -     CEh6Ka2HInkNSH01L2 192.168.2.76 + 647    CSTH8n1O1nv0ztxNQd 192.168.2.76 + 657    CYfHyC28tAhkLYkXB7 192.168.2.76 +     CtANmVrHYMtkWqPE5  192.168.2.76 + 6s917    CAUlC249svUfE6q0g3 192.168.2.76 +     CEh6Ka2HInkNSH01L2 192.168.2.76  4s840    CjPGiy13ncXKxU765j 192.168.2.76 - 6s895    CPoz7NUpXISemlNSd  192.168.2.76 + 6s895    CPoz7NUpXISemlNSd  192.168.2.76  6s837    Ct6ixh35y9AEr7J7o9 192.168.2.76 - 6s889    CaEFHq2HVQ5iGJQiD9 192.168.2.76 + 6s889    CaEFHq2HVQ5iGJQiD9 192.168.2.76  6s875    CjinlH2fzDtvzI9637 192.168.2.76 - 6s884    Cedw7H3ddE2yLiLoXc 192.168.2.76 - 6s917    CAUlC249svUfE6q0g3 192.168.2.76 + 6s884    Cedw7H3ddE2yLiLoXc 192.168.2.76      CIJIDL1ULo4HpT24Gl 192.168.2.76  016    CLsqp41RLUd83arUQb 192.168.2.76  166    CbCciH11995WKkobR1 192.168.2.76 @@ -50,17 +50,17 @@   █  CBHHuR1xFnm5C5CQBc 192.168.2.76      CD1jfU3p9abEm77mzf 192.168.2.76      C0K9DaoPFkfnzwlZa 192.168.2.76 + 205    CBeaXe4Iyj1gXd2Iq 192.168.2.76 + 315    CX1GjC4vn52UY1uDv6 192.168.2.76 + 1m12s201    CbNCgO1MzloHRNeY4f 192.168.2.76 +     CaPClb1Bf0RrRGtyWi 192.168.2.76  616    CbQAWi3GX2bCmX5L56 192.168.2.76  298    Cd8s2R3OGDgkhnvSu9 192.168.2.76 - 205    CBeaXe4Iyj1gXd2Iq 192.168.2.76 -     CmWpSw3VtjiAceBCwf 192.168.2.76 - 1m12s201    CbNCgO1MzloHRNeY4f 192.168.2.76 - 315    CX1GjC4vn52UY1uDv6 192.168.2.76 -     CaPClb1Bf0RrRGtyWi 192.168.2.76 - 35s642    CibfNy1QQW4ImDWRq5 192.168.2.76 +     CmWpSw3VtjiAceBCwf 192.168.2.76  1m11s547    CTRXSR3blXJE5ZE7Ij 192.168.2.76 + 12s337    C3TZMB4CrUwYfkGJy1 192.168.2.76 + 35s642    CibfNy1QQW4ImDWRq5 192.168.2.76  1m11s536    CnGze54kQWWpKqrrZ4 192.168.2.76 - 12s337    C3TZMB4CrUwYfkGJy1 192.168.2.76      CK957ERTz8lBycly4 192.168.2.76  1s309    CO5QKYQkcSdxQFA35 192.168.2.76      CurHpb1TGZOktTRNP1 192.168.2.76 @@ -68,18 +68,18 @@      C3xkHgJnzZszVSTpi 192.168.2.76      CMrjgF2XLmRh9C9TR4 192.168.2.76      C2vQ8sVgyADHjtEda 192.168.2.76 -     CD69521bDXIAb4IkW 192.168.2.76 - 6s648    CC3vUI3gFB04zLvWRa 192.168.2.76 + 6s648    CC3vUI3gFB04zLvWRa 192.168.2.76 +     CD69521bDXIAb4IkW 192.168.2.76  2s666    C7Krri4g9tZfHniGXh 192.168.2.76      CmxyBl2c8XAMTuHEk4 192.168.2.76  499    CSvs6v26bQqFylkk6l 192.168.2.76      C4pHul1H3OeWYz7o7i 192.168.2.76 -     C7Lcvr4vsTf6eYpBva 192.168.2.76 -     CV8faD4L1sLL5kDwN9 192.168.2.76 -     CxyAKs10ppnHFP6O8i 192.168.2.76      C6MrHk2C7rLuJqhjsg 192.168.2.76 -     CvfUrT2DgYXXoZw9Ah 192.168.2.76 +     C7Lcvr4vsTf6eYpBva 192.168.2.76      CBX0254QJoklXNbvv2 192.168.2.76 +     CV8faD4L1sLL5kDwN9 192.168.2.76 +     CxyAKs10ppnHFP6O8i 192.168.2.76 +     CvfUrT2DgYXXoZw9Ah 192.168.2.76      C6Ym6jvMgikT0xTTc 192.168.2.76 -     CRNn9f1zKNlzHSM5pa 192.168.2.76      CJLgi92kpp2gLgGTE5 192.168.2.76 +     CRNn9f1zKNlzHSM5pa 192.168.2.76 diff --git a/test/expected/test_gantt.sh_b013ab41c3cca76cf05a01ca1ba65888be247ada.out b/test/expected/test_gantt.sh_b013ab41c3cca76cf05a01ca1ba65888be247ada.out index 67a56e32..7504be34 100644 --- a/test/expected/test_gantt.sh_b013ab41c3cca76cf05a01ca1ba65888be247ada.out +++ b/test/expected/test_gantt.sh_b013ab41c3cca76cf05a01ca1ba65888be247ada.out @@ -3,14 +3,14 @@  Duration | ✘▲ | Operation  23s044    CN5hnY3x51j6Hr1v4 192.168.2.76  32s388    CmWpC33jXuKpXNLcie 192.168.2.76 + 6s917    CAUlC249svUfE6q0g3 192.168.2.76      CEh6Ka2HInkNSH01L2 192.168.2.76 - 4s840    CjPGiy13ncXKxU765j 192.168.2.76 + 4s840    CjPGiy13ncXKxU765j 192.168.2.76  6s895    CPoz7NUpXISemlNSd  192.168.2.76 - 6s837    Ct6ixh35y9AEr7J7o9 192.168.2.76 + 6s837    Ct6ixh35y9AEr7J7o9 192.168.2.76  6s889    CaEFHq2HVQ5iGJQiD9 192.168.2.76 - 6s875    CjinlH2fzDtvzI9637 192.168.2.76 + 6s875    CjinlH2fzDtvzI9637 192.168.2.76  6s884    Cedw7H3ddE2yLiLoXc 192.168.2.76 - 6s917    CAUlC249svUfE6q0g3 192.168.2.76      CIJIDL1ULo4HpT24Gl 192.168.2.76  016    CLsqp41RLUd83arUQb 192.168.2.76  166    CbCciH11995WKkobR1 192.168.2.76 @@ -35,17 +35,17 @@   █  CBHHuR1xFnm5C5CQBc 192.168.2.76      CD1jfU3p9abEm77mzf 192.168.2.76      C0K9DaoPFkfnzwlZa 192.168.2.76 + 205    CBeaXe4Iyj1gXd2Iq 192.168.2.76 + 315    CX1GjC4vn52UY1uDv6 192.168.2.76 + 1m12s201    CbNCgO1MzloHRNeY4f 192.168.2.76 +     CaPClb1Bf0RrRGtyWi 192.168.2.76  616    CbQAWi3GX2bCmX5L56 192.168.2.76  298    Cd8s2R3OGDgkhnvSu9 192.168.2.76 - 205    CBeaXe4Iyj1gXd2Iq 192.168.2.76      CmWpSw3VtjiAceBCwf 192.168.2.76 - 1m12s201    CbNCgO1MzloHRNeY4f 192.168.2.76 - 315    CX1GjC4vn52UY1uDv6 192.168.2.76 -     CaPClb1Bf0RrRGtyWi 192.168.2.76 - 35s642    CibfNy1QQW4ImDWRq5 192.168.2.76 - 1m11s547    CTRXSR3blXJE5ZE7Ij 192.168.2.76 - 1m11s536    CnGze54kQWWpKqrrZ4 192.168.2.76 - 12s337    C3TZMB4CrUwYfkGJy1 192.168.2.76 + 1m11s547    CTRXSR3blXJE5ZE7Ij 192.168.2.76 + 12s337    C3TZMB4CrUwYfkGJy1 192.168.2.76 + 35s642    CibfNy1QQW4ImDWRq5 192.168.2.76 + 1m11s536    CnGze54kQWWpKqrrZ4 192.168.2.76      CK957ERTz8lBycly4 192.168.2.76  1s309    CO5QKYQkcSdxQFA35 192.168.2.76      CurHpb1TGZOktTRNP1 192.168.2.76 @@ -53,18 +53,18 @@      C3xkHgJnzZszVSTpi 192.168.2.76      CMrjgF2XLmRh9C9TR4 192.168.2.76      C2vQ8sVgyADHjtEda 192.168.2.76 -     CD69521bDXIAb4IkW 192.168.2.76  6s648    CC3vUI3gFB04zLvWRa 192.168.2.76 +     CD69521bDXIAb4IkW 192.168.2.76  2s666    C7Krri4g9tZfHniGXh 192.168.2.76      CmxyBl2c8XAMTuHEk4 192.168.2.76  499    CSvs6v26bQqFylkk6l 192.168.2.76      C4pHul1H3OeWYz7o7i 192.168.2.76 +     C6MrHk2C7rLuJqhjsg 192.168.2.76      C7Lcvr4vsTf6eYpBva 192.168.2.76 -     CV8faD4L1sLL5kDwN9 192.168.2.76 -     CxyAKs10ppnHFP6O8i 192.168.2.76 -     C6MrHk2C7rLuJqhjsg 192.168.2.76 +     CBX0254QJoklXNbvv2 192.168.2.76 +     CV8faD4L1sLL5kDwN9 192.168.2.76 +     CxyAKs10ppnHFP6O8i 192.168.2.76      CvfUrT2DgYXXoZw9Ah 192.168.2.76 -     CBX0254QJoklXNbvv2 192.168.2.76      C6Ym6jvMgikT0xTTc 192.168.2.76 -     CRNn9f1zKNlzHSM5pa 192.168.2.76 -     CJLgi92kpp2gLgGTE5 192.168.2.76 +     CJLgi92kpp2gLgGTE5 192.168.2.76 +     CRNn9f1zKNlzHSM5pa 192.168.2.76 diff --git a/test/expected/test_gantt.sh_e6a4681a5a671c84c020dc91d7ce03c9d17fde07.out b/test/expected/test_gantt.sh_e6a4681a5a671c84c020dc91d7ce03c9d17fde07.out index 8e609b1e..cf59c6a3 100644 --- a/test/expected/test_gantt.sh_e6a4681a5a671c84c020dc91d7ce03c9d17fde07.out +++ b/test/expected/test_gantt.sh_e6a4681a5a671c84c020dc91d7ce03c9d17fde07.out @@ -2,31 +2,31 @@ 5m  Duration | ✘▲ | Operation  844    CwFs1P2UcUdlSxD2La 192.168.2.76 -     CoX7zA3OJKGUOSCBY2 192.168.2.76 +     C6Q4Vm14ZJIlZhsXqk 192.168.2.76 +     CoX7zA3OJKGUOSCBY2 192.168.2.76      CdrfXZ1NOFPEawF218 192.168.2.76 -     CJwUi9bdB9c1lLW44  192.168.2.76 +     CJwUi9bdB9c1lLW44  192.168.2.76      CJxSUgkInyKSHiju1  192.168.2.76 -     CT0JIh479jXIGt0Po1 192.168.2.76 -     C6Q4Vm14ZJIlZhsXqk 192.168.2.76 - 1s070    CtgxRAqDLvrRUQdqe  192.168.2.76 -     CdysLK1XpcrXOpVDuh 192.168.2.76 +     CT0JIh479jXIGt0Po1 192.168.2.76 +     CdysLK1XpcrXOpVDuh 192.168.2.76 + 1s070    CtgxRAqDLvrRUQdqe  192.168.2.76  200    C6nSoj1Qco9PGyslz6 192.168.2.76  23s044    CN5hnY3x51j6Hr1v4 192.168.2.76      CdZUPH2DKOE7zzCLE3 192.168.2.76  32s388    CmWpC33jXuKpXNLcie 192.168.2.76      CsBgiE1WmGP4Yo749h 192.168.2.76 - 657    CYfHyC28tAhkLYkXB7 192.168.2.76 -     CtANmVrHYMtkWqPE5  192.168.2.76 - 647    CSTH8n1O1nv0ztxNQd 192.168.2.76 -     C4uDKU5tpeRU9Su19  192.168.2.76 +     C4uDKU5tpeRU9Su19  192.168.2.76 + 647    CSTH8n1O1nv0ztxNQd 192.168.2.76 + 657    CYfHyC28tAhkLYkXB7 192.168.2.76 +     CtANmVrHYMtkWqPE5  192.168.2.76 + 6s917    CAUlC249svUfE6q0g3 192.168.2.76      CEh6Ka2HInkNSH01L2 192.168.2.76 - 4s840    CjPGiy13ncXKxU765j 192.168.2.76 + 4s840    CjPGiy13ncXKxU765j 192.168.2.76  6s895    CPoz7NUpXISemlNSd  192.168.2.76 - 6s837    Ct6ixh35y9AEr7J7o9 192.168.2.76 + 6s837    Ct6ixh35y9AEr7J7o9 192.168.2.76  6s889    CaEFHq2HVQ5iGJQiD9 192.168.2.76 - 6s875    CjinlH2fzDtvzI9637 192.168.2.76 + 6s875    CjinlH2fzDtvzI9637 192.168.2.76  6s884    Cedw7H3ddE2yLiLoXc 192.168.2.76 - 6s917    CAUlC249svUfE6q0g3 192.168.2.76      CIJIDL1ULo4HpT24Gl 192.168.2.76  016    CLsqp41RLUd83arUQb 192.168.2.76  166    CbCciH11995WKkobR1 192.168.2.76 @@ -51,17 +51,17 @@   █  CBHHuR1xFnm5C5CQBc 192.168.2.76      CD1jfU3p9abEm77mzf 192.168.2.76      C0K9DaoPFkfnzwlZa 192.168.2.76 + 205    CBeaXe4Iyj1gXd2Iq 192.168.2.76 + 315    CX1GjC4vn52UY1uDv6 192.168.2.76 + 1m12s201    CbNCgO1MzloHRNeY4f 192.168.2.76 +     CaPClb1Bf0RrRGtyWi 192.168.2.76  616    CbQAWi3GX2bCmX5L56 192.168.2.76  298    Cd8s2R3OGDgkhnvSu9 192.168.2.76 - 205    CBeaXe4Iyj1gXd2Iq 192.168.2.76      CmWpSw3VtjiAceBCwf 192.168.2.76 - 1m12s201    CbNCgO1MzloHRNeY4f 192.168.2.76 - 315    CX1GjC4vn52UY1uDv6 192.168.2.76 -     CaPClb1Bf0RrRGtyWi 192.168.2.76 - 35s642    CibfNy1QQW4ImDWRq5 192.168.2.76 - 1m11s547    CTRXSR3blXJE5ZE7Ij 192.168.2.76 - 1m11s536    CnGze54kQWWpKqrrZ4 192.168.2.76 - 12s337    C3TZMB4CrUwYfkGJy1 192.168.2.76 + 1m11s547    CTRXSR3blXJE5ZE7Ij 192.168.2.76 + 12s337    C3TZMB4CrUwYfkGJy1 192.168.2.76 + 35s642    CibfNy1QQW4ImDWRq5 192.168.2.76 + 1m11s536    CnGze54kQWWpKqrrZ4 192.168.2.76      CK957ERTz8lBycly4 192.168.2.76  1s309    CO5QKYQkcSdxQFA35 192.168.2.76      CurHpb1TGZOktTRNP1 192.168.2.76