Browse Source

HUE-5105 [jb] Opening an "ACCEPTED" job can return 500 error

Jenny Kim 9 years ago
parent
commit
94ef74b09d

+ 2 - 0
apps/jobbrowser/src/jobbrowser/templates/job.mako

@@ -114,8 +114,10 @@ ${ comps.menubar() }
           <li class="white">${job.user}</li>
           <li class="white">${job.user}</li>
           <li class="nav-header">${_('Status')}</li>
           <li class="nav-header">${_('Status')}</li>
           <li class="white" id="jobStatus">&nbsp;</li>
           <li class="white" id="jobStatus">&nbsp;</li>
+          % if job.logs_url:
           <li class="nav-header">${_('Logs')}</li>
           <li class="nav-header">${_('Logs')}</li>
           <li><a href="${job.logs_url }" target="_blank"><i class="fa fa-tasks"></i> ${_('Logs')}</a></li>
           <li><a href="${job.logs_url }" target="_blank"><i class="fa fa-tasks"></i> ${_('Logs')}</a></li>
+          % endif
           <li class="nav-header">${_('Progress')}</li>
           <li class="nav-header">${_('Progress')}</li>
           <li class="white">${job.progress}%</li>
           <li class="white">${job.progress}%</li>
           <li class="nav-header">${_('Duration')}</li>
           <li class="nav-header">${_('Duration')}</li>

+ 10 - 5
apps/jobbrowser/src/jobbrowser/views.py

@@ -41,7 +41,8 @@ from desktop.views import register_status_bar_view
 from hadoop import cluster
 from hadoop import cluster
 from hadoop.api.jobtracker.ttypes import ThriftJobPriority, TaskTrackerNotFoundException, ThriftJobState
 from hadoop.api.jobtracker.ttypes import ThriftJobPriority, TaskTrackerNotFoundException, ThriftJobState
 from hadoop.yarn.clients import get_log_client
 from hadoop.yarn.clients import get_log_client
-import hadoop.yarn.resource_manager_api as resource_manager_api
+from hadoop.yarn import resource_manager_api as resource_manager_api
+
 
 
 LOG = logging.getLogger(__name__)
 LOG = logging.getLogger(__name__)
 
 
@@ -68,7 +69,11 @@ def check_job_permission(view_func):
   """
   """
   def decorate(request, *args, **kwargs):
   def decorate(request, *args, **kwargs):
     jobid = kwargs['job']
     jobid = kwargs['job']
-    job = get_job(request, job_id=jobid)
+    try:
+      job = get_job(request, job_id=jobid)
+    except ApplicationNotRunning, e:
+      LOG.warn('Job %s has not yet been accepted by the RM, will poll for status.' % jobid)
+      return job_not_assigned(request, jobid, request.path)
 
 
     if not SHARE_JOBS.get() and not request.user.is_superuser \
     if not SHARE_JOBS.get() and not request.user.is_superuser \
         and job.user != request.user.username and not can_view_job(request.user.username, job):
         and job.user != request.user.username and not can_view_job(request.user.username, job):
@@ -83,14 +88,13 @@ def get_job(request, job_id):
   try:
   try:
     job = get_api(request.user, request.jt).get_job(jobid=job_id)
     job = get_api(request.user, request.jt).get_job(jobid=job_id)
   except ApplicationNotRunning, e:
   except ApplicationNotRunning, e:
-    if e.job.get('state', '').lower() == 'accepted' and 'kill' in request.path:
+    if e.job.get('state', '').lower() == 'accepted':
       rm_pool = resource_manager_api.get_resource_manager_pool()
       rm_pool = resource_manager_api.get_resource_manager_pool()
       rm_api = rm_pool.get(request.user.username)
       rm_api = rm_pool.get(request.user.username)
       job = Application(e.job, rm_api)
       job = Application(e.job, rm_api)
       rm_pool.put(rm_api)
       rm_pool.put(rm_api)
     else:
     else:
-      # reverse() seems broken, using request.path but beware, it discards GET and POST info
-      return job_not_assigned(request, job_id, request.path)
+      raise e  # Job has not yet been accepted by RM
   except JobExpired, e:
   except JobExpired, e:
     raise PopupException(_('Job %s has expired.') % job_id, detail=_('Cannot be found on the History Server.'))
     raise PopupException(_('Job %s has expired.') % job_id, detail=_('Cannot be found on the History Server.'))
   except Exception, e:
   except Exception, e:
@@ -157,6 +161,7 @@ def jobs(request):
     'hiveserver2_impersonation_enabled': hiveserver2_impersonation_enabled()
     'hiveserver2_impersonation_enabled': hiveserver2_impersonation_enabled()
   })
   })
 
 
+
 def massage_job_for_json(job, request):
 def massage_job_for_json(job, request):
   job = {
   job = {
     'id': job.jobId,
     'id': job.jobId,

+ 2 - 2
apps/jobbrowser/src/jobbrowser/yarn_models.py

@@ -48,8 +48,8 @@ class Application(object):
 
 
   @property
   @property
   def logs_url(self):
   def logs_url(self):
-    url = self.trackingUrl
-    if self.applicationType == 'SPARK':
+    url = self.trackingUrl or ''
+    if url and self.applicationType == 'SPARK':
       url = os.path.join(self.trackingUrl, 'executors')
       url = os.path.join(self.trackingUrl, 'executors')
     return url
     return url