瀏覽代碼

HUE-2949 [notebook] Fix HS2 progress API by sending back full logs with each request

Jenny Kim 10 年之前
父節點
當前提交
75b7b29

+ 4 - 1
desktop/libs/notebook/src/notebook/api.py

@@ -188,8 +188,11 @@ def get_logs(request):
     all_jobs = jobs + new_jobs
     jobs = dict((job['name'], job) for job in all_jobs).values()
 
+  # Retrieve full log for job progress parsing
+  full_log = request.POST.get('full_log', logs)
+
   response['logs'] = logs
-  response['progress'] = db.progress(snippet, logs) if snippet['status'] != 'available' and snippet['status'] != 'success' else 100
+  response['progress'] = db.progress(snippet, full_log) if snippet['status'] != 'available' and snippet['status'] != 'success' else 100
   response['jobs'] = jobs
   response['status'] = 0
 

+ 3 - 2
desktop/libs/notebook/src/notebook/connectors/hiveserver2.py

@@ -175,12 +175,13 @@ class HS2Api(Api):
   def progress(self, snippet, logs):
     if snippet['type'] == 'hive':
       match = re.search('Total jobs = (\d+)', logs, re.MULTILINE)
-      total = (int(match.group(1)) if match else 1) * 2
+      total = int(match.group(1)) if match else 1
 
       started = logs.count('Starting Job')
       ended = logs.count('Ended Job')
 
-      return int((started + ended) * 100 / total)
+      progress = int((started + ended) * 100 / (total * 2))
+      return max(progress, 5)  # Return 5% progress as a minimum
     elif snippet['type'] == 'impala':
       match = re.search('(\d+)% Complete', logs, re.MULTILINE)
       return int(match.group(1)) if match else 0

+ 3 - 1
desktop/libs/notebook/src/notebook/static/notebook/js/notebook.ko.js

@@ -431,6 +431,7 @@
       self.result.logLines = 0;
       self.progress(0);
       self.jobs([]);
+      self.result.logs('');
 
       if (self.result.fetchedOnce()) {
         self.close();
@@ -623,7 +624,8 @@
         notebook: ko.mapping.toJSON(notebook.getContext()),
         snippet: ko.mapping.toJSON(self.getContext()),
         from: self.result.logLines,
-        jobs: ko.mapping.toJSON(self.jobs)
+        jobs: ko.mapping.toJSON(self.jobs),
+        full_log: self.result.logs
       }, function (data) {
         if (data.status == 1) { // Append errors to the logs
           data.status = 0;