浏览代码

[jb] Do not display a duration for applications that don't have a start time

Romain Rigaux 9 年之前
父节点
当前提交
c64d2b1

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

@@ -655,7 +655,7 @@ $(document).ready(function () {
     if (_title != ""){
       $.jHueTitleUpdater.set(_title);
     }
-    $("#jobDuration").html('<span title="' + emptyStringIfNull(job.durationMs) + '">' + (job.isRetired ? '${_('N/A')}' : emptyStringIfNull(job.durationFormatted)) + '</span>');
+    $("#jobDuration").html('<span title="' + emptyStringIfNull(job.durationMs) + '">' + (job.isRetired || ! job.durationFormatted ? '${_('N/A')}' : emptyStringIfNull(job.durationFormatted)) + '</span>');
 
     if (Utils.RUNNING_ARRAY.indexOf(job.status.toUpperCase()) == -1) {
       window.clearInterval(_runningInterval);

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

@@ -243,7 +243,7 @@ ${ components.menubar() }
         '<span title="' + emptyStringIfNull(job.reducesPercentComplete) + '">' + (job.isRetired ? '${_('N/A')}' : '<div class="progress" title="' + (job.isMR2 ? job.reducesPercentComplete : job.finishedReduces + '/' + job.desiredReduces) + '"><div class="bar-label">' + job.reducesPercentComplete + '%</div><div class="' + 'bar ' + getStatusClass(job.status, "bar-") + '" style="margin-top:-20px;width:' + job.reducesPercentComplete + '%"></div></div>') + '</span>',
         emptyStringIfNull(job.queueName),
         emptyStringIfNull(job.priority),
-        '<span title="' + emptyStringIfNull(job.durationMs) + '">' + (job.isRetired ? '${_('N/A')}' : emptyStringIfNull(job.durationFormatted)) + '</span>',
+        '<span title="' + emptyStringIfNull(job.durationMs) + '">' + (job.isRetired || ! job.durationFormatted ? '${_('N/A')}' : emptyStringIfNull(job.durationFormatted)) + '</span>',
         '<span title="' + emptyStringIfNull(job.startTimeMs) + '">' + emptyStringIfNull(job.startTimeFormatted) + '</span>',
         _killCell
       ]

+ 18 - 1
apps/jobbrowser/src/jobbrowser/tests.py

@@ -423,6 +423,16 @@ class TestMapReduce2NoHadoop:
     response_content = json.loads(response.content)
     assert_equal(len(response_content['jobs']), 1)
 
+  def test_applications_no_start_time(self):
+    response = self.c.get('/jobbrowser/?format=json')
+    data = json.loads(response.content)
+    job = [j for j in data['jobs'] if j['id'] == 'application_1428442704693_0007']
+    assert_true(job, job)
+    job = job[0]
+
+    assert_equal('', job['startTimeFormatted'], data)
+    assert_equal('', job['durationFormatted'], data)
+
   def test_running_job(self):
     response = self.c.get('/jobbrowser/jobs/application_1356251510842_0054')
     assert_true('job_1356251510842_0054' in response.content, response.content)
@@ -432,6 +442,13 @@ class TestMapReduce2NoHadoop:
     assert_true('job_1356251510842_0054' in response.content)
     assert_true('RUNNING' in response.content)
 
+  def test_application_no_start_time(self):
+    response = self.c.get('/jobbrowser/jobs/application_1428442704693_0007?format=json')
+    data = json.loads(response.content)
+
+    assert_equal('', data['job']['startTimeFormatted'], data)
+    assert_equal('', data['job']['durationFormatted'], data)
+
   def test_finished_job(self):
     response = self.c.get('/jobbrowser/jobs/application_1356251510842_0009')
     assert_equal(response.context['job'].jobId, 'job_1356251510842_0009')
@@ -568,7 +585,7 @@ class MockResourceManagerApi:
         u'progress': 100.0,
         u'queue': u'root.erickt',
         u'runningContainers': -1,
-        u'startedTime': 1428454941315,
+        u'startedTime': 0,
         u'state': u'FINISHED',
         u'trackingUI': u'History',
         u'trackingUrl': u'http://N/A',

+ 11 - 4
apps/jobbrowser/src/jobbrowser/yarn_models.py

@@ -65,7 +65,12 @@ class Application(object):
       finishTime = int(time.time() * 1000)
     else:
       finishTime = self.finishedTime
-    setattr(self, 'durationInMillis', finishTime - self.startedTime)
+    if self.finishedTime == 0 or self.startedTime == 0:
+      durationInMillis = None
+    else:
+      durationInMillis = finishTime - self.startedTime
+    setattr(self, 'durationInMillis', durationInMillis)
+    setattr(self, 'durationFormatted', durationInMillis and format_duration_in_millis(self.durationInMillis))
     setattr(self, 'startTimeMs', self.startedTime)
     setattr(self, 'startTimeFormatted', format_unixtime_ms(self.startedTime))
     setattr(self, 'finishTimeFormatted', format_unixtime_ms(finishTime))
@@ -73,7 +78,6 @@ class Application(object):
     setattr(self, 'desiredMaps', None)
     setattr(self, 'finishedReduces', None)
     setattr(self, 'desiredReduces', None)
-    setattr(self, 'durationFormatted', format_duration_in_millis(self.durationInMillis))
 
     for attr in ['preemptedResourceVCores', 'vcoreSeconds', 'memorySeconds', 'diagnostics']:
       if not hasattr(self, attr):
@@ -170,8 +174,11 @@ class Job(object):
     setattr(self, 'is_retired', False)
     setattr(self, 'maps_percent_complete', None)
     setattr(self, 'reduces_percent_complete', None)
-    setattr(self, 'duration', self.finishTime - self.startTime)
-    setattr(self, 'durationFormatted', format_duration_in_millis(self.duration))
+    if self.finishTime == 0 or self.startTime == 0:
+      setattr(self, 'duration', None)
+    else:
+      setattr(self, 'duration', self.finishTime - self.startTime)
+    setattr(self, 'durationFormatted', self.duration and format_duration_in_millis(self.duration))
     setattr(self, 'finishTimeFormatted', format_unixtime_ms(self.finishTime))
     setattr(self, 'startTimeFormatted', format_unixtime_ms(self.startTime))
     setattr(self, 'finishedMaps', self.mapsCompleted)