Browse Source

HUE-769 [jb] Sorting jobs by Duration can be wrong

Introduced new formatting util
Enrico Berti 13 years ago
parent
commit
4de6d30

+ 5 - 2
apps/jobbrowser/src/jobbrowser/models.py

@@ -15,7 +15,7 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-from desktop.lib.view_util import format_time_diff
+from desktop.lib.view_util import format_duration_in_millis
 from desktop.lib import i18n
 from hadoop import job_tracker
 from hadoop import confparse
@@ -202,7 +202,10 @@ class Job(JobLinkage):
     else:
       finishTime = datetime.datetime.fromtimestamp(finishTime/1000)
     self.duration = finishTime - datetime.datetime.fromtimestamp(self.job.startTime/1000)
-    self.durationFormatted = format_time_diff(datetime.datetime.fromtimestamp(self.job.startTime/1000), finishTime)
+
+    diff = int(finishTime.strftime("%s"))*1000 - self.startTimeMs
+    self.durationFormatted = format_duration_in_millis(diff)
+    self.durationInMillis = diff
 
   def kill(self):
     self.jt.kill_job(self.job.jobID)

+ 1 - 1
apps/jobbrowser/src/jobbrowser/templates/jobs.mako

@@ -129,7 +129,7 @@ ${commonheader(_('Job Browser'), "jobbrowser")}
             <td class="center">${job.queueName}</td>
             <td class="center">${job.priority.lower()}</td>
             <td class="center" data-row-selector-exclude="true">
-                <span alt="${job.finishTimeMs-job.startTimeMs}">
+                <span alt="${job.durationInMillis}">
                     % if job.is_retired:
                         ${_('N/A')}
                     % else:

+ 21 - 0
desktop/core/src/desktop/lib/view_util.py

@@ -57,3 +57,24 @@ def format_time_diff(start=None, end=None):
     output.append("%dm" % minutes)
   output.append("%ds" % seconds)
   return ":".join(output)
+
+def format_duration_in_millis(duration=0):
+    """
+      formats the difference between two times in millis as Xd:Xh:Xm:Xs
+    """
+    seconds, millis = divmod(duration, 1000)
+    minutes, seconds = divmod(seconds, 60)
+    hours, minutes = divmod(minutes, 60)
+    days, hours = divmod(hours, 24)
+    output = []
+    written = False
+    if days:
+        written = True
+        output.append("%dd" % days)
+    if written or hours:
+        written = True
+        output.append("%dh" % hours)
+    if written or minutes:
+        output.append("%dm" % minutes)
+    output.append("%ds" % seconds)
+    return ":".join(output)

+ 5 - 1
desktop/core/src/desktop/lib/view_util_test.py

@@ -17,7 +17,7 @@
 
 from nose.tools import *
 
-from desktop.lib.view_util import big_filesizeformat, format_time_diff
+from desktop.lib.view_util import big_filesizeformat, format_time_diff, format_duration_in_millis
 
 import datetime
 
@@ -37,3 +37,7 @@ def test_format_time_diff():
   assert_equal("0s", format_time_diff(datetime.datetime.fromtimestamp(0), datetime.datetime.fromtimestamp(0)))
   assert_equal("1d:12h:24m:32s", format_time_diff(datetime.datetime.fromtimestamp(0), datetime.datetime.fromtimestamp(131072)))
 
+def test_format_duration_in_millis():
+    assert_equal("1h:0m:0s", format_duration_in_millis(60*60*1000))
+    assert_equal("0s", format_duration_in_millis(0))
+    assert_equal("1d:12h:24m:32s", format_duration_in_millis(24*60*60*1000 + 12*60*60*1000 + 24*60*1000 + 32*1000))