From 555926714ca7283dfc0dae6d00185f0ab9f6b509 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Wed, 18 Mar 2020 19:04:14 -0500 Subject: [PATCH] mgr/progress: fix duration strings - simplify the code to just calculate the durations when we need them (I'm not sure why we had those temporary strings!) - use a nicer time delta format Fixes: https://tracker.ceph.com/issues/44672 Signed-off-by: Sage Weil --- src/pybind/mgr/progress/module.py | 42 +++++++++++++------------------ 1 file changed, 17 insertions(+), 25 deletions(-) diff --git a/src/pybind/mgr/progress/module.py b/src/pybind/mgr/progress/module.py index 4cc52a179d93e..c37d7f2ce8fd2 100644 --- a/src/pybind/mgr/progress/module.py +++ b/src/pybind/mgr/progress/module.py @@ -5,6 +5,8 @@ except ImportError: TYPE_CHECKING = False from mgr_module import MgrModule, OSDMap +from mgr_util import to_pretty_timedelta +from datetime import timedelta import os import threading import datetime @@ -36,16 +38,12 @@ class Event(object): self._refs = refs self.started_at = started_at if started_at else time.time() self.id = None # type: Optional[str] - self.update_duration_event() - self._time_remaining_str = "(time remaining: N/A)" def _refresh(self): global _module assert _module _module.log.debug('refreshing mgr for %s (%s) at %f' % (self.id, self._message, self.progress)) - self.update_duration_event() - self.update_time_remaining() _module.update_progress_event( self.id, self.twoline_progress(6), self.progress) @@ -66,7 +64,9 @@ class Event(object): @property def duration_str(self): - return self._duration_str + duration = time.time() - self.started_at + return "(%s)" % ( + to_pretty_timedelta(timedelta(seconds=duration))) @property def failed(self): @@ -78,7 +78,8 @@ class Event(object): def summary(self): # type: () -> str - return "{0} {1} {2}".format(self.progress, self.message, self.duration_str) + return "{0} {1} {2}".format(self.progress, self.message, + self.duration_str) def _progress_str(self, width): inner_width = width - 2 @@ -94,15 +95,21 @@ class Event(object): """ e.g. - - Eating my delicious strudel (since: 00h 00m 30s) - [===============..............] (time remaining: 00h 03m 57s) + - Eating my delicious strudel (since: 30s) + [===============..............] (remaining: 04m) """ + time_remaining = self.estimated_time_remaining() + if time_remaining: + remaining = "(remaining: %s)" % ( + to_pretty_timedelta(timedelta(seconds=time_remaining))) + else: + remaining = '' return "{0} {1}\n{2}{3} {4}".format(self._message, - self._duration_str, + self.duration_str, " " * indent, self._progress_str(30), - self._time_remaining_str) + remaining) def to_json(self): # type: () -> Dict[str, Any] @@ -116,13 +123,6 @@ class Event(object): "time_remaining": self.estimated_time_remaining() } - def update_duration_event(self): - # Update duration of event in seconds/minutes/hours - - duration = time.time() - self.started_at - self._duration_str = time.strftime("(%Hh %Mm %Ss)", time.gmtime(duration)) - - def estimated_time_remaining(self): elapsed = time.time() - self.started_at progress = self.progress @@ -130,14 +130,6 @@ class Event(object): return None return int(elapsed * (1 - progress) / progress) - def update_time_remaining(self): - time_remaining = self.estimated_time_remaining() - if time_remaining: - self._time_remaining_str = time.strftime( - "(time remaining: %Hh %Mm %Ss)", time.gmtime(time_remaining)) - else: - self._time_remaining_str = "(time remaining: N/A)" - class GhostEvent(Event): """ The ghost of a completed event: these are the fields that we persist -- 2.39.5