diff options
Diffstat (limited to 'cli/src')
| -rw-r--r-- | cli/src/cli-rpc-ops.c | 86 | 
1 files changed, 59 insertions, 27 deletions
diff --git a/cli/src/cli-rpc-ops.c b/cli/src/cli-rpc-ops.c index d6abd8f253a..ff44a22be78 100644 --- a/cli/src/cli-rpc-ops.c +++ b/cli/src/cli-rpc-ops.c @@ -19,6 +19,10 @@  #define INDENT_MAIN_HEAD "%-25s %s " +/* Do not show estimates if greater than this number */ +#define REBAL_ESTIMATE_SEC_UPPER_LIMIT    (60*24*3600) +#define REBAL_ESTIMATE_START_TIME         600 +  #include "cli.h"  #include "compat-errno.h"  #include "cli-cmd.h" @@ -1589,27 +1593,28 @@ int  gf_cli_print_rebalance_status (dict_t *dict, enum gf_task_types task_type,                                 gf_boolean_t is_tier)  { -        int                ret          = -1; -        int                count        = 0; -        int                i            = 1; -        char               key[256]     = {0,}; -        gf_defrag_status_t status_rcd   = GF_DEFRAG_STATUS_NOT_STARTED; -        uint64_t           files        = 0; -        uint64_t           size         = 0; -        uint64_t           lookup       = 0; -        char               *node_name   = NULL; -        uint64_t           failures     = 0; -        uint64_t           skipped      = 0; -        double             elapsed      = 0; -        char               *status_str  = NULL; -        char               *size_str    = NULL; -        int                hrs          = 0; -        int                min          = 0; -        int                sec          = 0; -        gf_boolean_t       down         = _gf_false; -	gf_boolean_t       fix_layout   = _gf_false; -        uint64_t           max_time     = 0; -        uint64_t           time_left    = 0; +        int                ret            = -1; +        int                count          = 0; +        int                i              = 1; +        char               key[256]       = {0,}; +        gf_defrag_status_t status_rcd     = GF_DEFRAG_STATUS_NOT_STARTED; +        uint64_t           files          = 0; +        uint64_t           size           = 0; +        uint64_t           lookup         = 0; +        char               *node_name     = NULL; +        uint64_t           failures       = 0; +        uint64_t           skipped        = 0; +        double             elapsed        = 0; +        char               *status_str    = NULL; +        char               *size_str      = NULL; +        int32_t            hrs            = 0; +        uint32_t           min            = 0; +        uint32_t           sec            = 0; +        gf_boolean_t       down           = _gf_false; +        gf_boolean_t       fix_layout     = _gf_false; +        uint64_t           max_time       = 0; +        uint64_t           time_left      = 0; +        gf_boolean_t       show_estimates = _gf_false;          ret = dict_get_int32 (dict, "count", &count); @@ -1688,6 +1693,8 @@ gf_cli_print_rebalance_status (dict_t *dict, enum gf_task_types task_type,                  if (GF_DEFRAG_STATUS_NOT_STARTED == status_rcd)                          continue; +                if (GF_DEFRAG_STATUS_STARTED == status_rcd) +                        show_estimates = _gf_true;                  snprintf (key, 256, "node-name-%d", i);                  ret = dict_get_str (dict, key, &node_name); @@ -1747,6 +1754,7 @@ gf_cli_print_rebalance_status (dict_t *dict, enum gf_task_types task_type,                  if (ret)                          gf_log ("cli", GF_LOG_TRACE,                                  "failed to get time left"); +                  if (time_left > max_time)                          max_time = time_left; @@ -1757,8 +1765,8 @@ gf_cli_print_rebalance_status (dict_t *dict, enum gf_task_types task_type,                  status_str = cli_vol_task_status_str[status_rcd];                  size_str = gf_uint64_2human_readable(size);                  hrs = elapsed / 3600; -                min = ((int) elapsed % 3600) / 60; -                sec = ((int) elapsed % 3600) % 60; +                min = ((uint64_t) elapsed % 3600) / 60; +                sec = ((uint64_t) elapsed % 3600) % 60;                  if (fix_layout) {                          cli_out ("%35s %50s %8d:%d:%d", node_name, status_str, @@ -1785,12 +1793,36 @@ gf_cli_print_rebalance_status (dict_t *dict, enum gf_task_types task_type,                           " Please check the nodes that are down using \'gluster"                           " peer status\' and start the glusterd on those nodes,"                           " else tier detach commit might fail!"); + +        /* Max time will be non-zero if rebalance is still running */          if (max_time) {                  hrs = max_time / 3600; -                min = ((int) max_time % 3600) / 60; -                sec = ((int) max_time % 3600) % 60; -                cli_out ("Estimated time left for rebalance to complete :" -                         " %8d:%02d:%02d", hrs, min, sec); +                min = (max_time % 3600) / 60; +                sec = (max_time % 3600) % 60; + +                if (hrs < REBAL_ESTIMATE_SEC_UPPER_LIMIT) { +                        cli_out ("Estimated time left for rebalance to " +                                 "complete : %8d:%02d:%02d", hrs, min, sec); +                } else { +                        cli_out ("Estimated time left for rebalance to " +                                 "complete : > 2 months. Please try again " +                                 "later."); +                } +        } else { +                /* Rebalance will return 0 if it could not calculate the +                 * estimates or if it is complete. +                 */ +                if (!show_estimates) { +                        goto out; +                } +                if (elapsed <= REBAL_ESTIMATE_START_TIME) { +                        cli_out ("The estimated time for rebalance to complete " +                                 "will be unavailable for the first 10 " +                                 "minutes."); +                } else { +                        cli_out ("Rebalance estimated time unavailable. Please " +                                 "try again later."); +                }          }  out:          return ret;  | 
