You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tez.apache.org by zh...@apache.org on 2017/03/28 19:47:50 UTC

[09/50] [abbrv] tez git commit: TEZ-3619. Tez UI: Improve DAG Data download (sree)

TEZ-3619. Tez UI: Improve DAG Data download (sree)


Project: http://git-wip-us.apache.org/repos/asf/tez/repo
Commit: http://git-wip-us.apache.org/repos/asf/tez/commit/daa8d3db
Tree: http://git-wip-us.apache.org/repos/asf/tez/tree/daa8d3db
Diff: http://git-wip-us.apache.org/repos/asf/tez/diff/daa8d3db

Branch: refs/heads/TEZ-1190
Commit: daa8d3db0639ca93085072543dec2baac803e427
Parents: cd44c90
Author: Sreenath Somarajapuram <sr...@apache.org>
Authored: Wed Feb 15 21:32:21 2017 +0530
Committer: Sreenath Somarajapuram <sr...@apache.org>
Committed: Wed Feb 15 21:32:21 2017 +0530

----------------------------------------------------------------------
 CHANGES.txt                                     |  1 +
 .../webapp/app/components/zip-download-modal.js |  2 +-
 .../webapp/app/styles/zip-download-modal.less   | 13 +++-
 .../templates/components/zip-download-modal.hbs | 12 ++--
 .../main/webapp/app/utils/download-dag-zip.js   | 75 ++++++++++++++++++--
 .../components/zip-download-modal-test.js       | 52 +++++++++++++-
 6 files changed, 140 insertions(+), 15 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tez/blob/daa8d3db/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index 337b394..31e141c 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -195,6 +195,7 @@ ALL CHANGES:
   TEZ-3598. Tez UI: Text formatting changes
   TEZ-3602. Tez UI: Query Name field is not required
   TEZ-3615. Tez UI: Table changes
+  TEZ-3619. Tez UI: Improve DAG Data download
 
 Release 0.8.5: Unreleased
 

http://git-wip-us.apache.org/repos/asf/tez/blob/daa8d3db/tez-ui/src/main/webapp/app/components/zip-download-modal.js
----------------------------------------------------------------------
diff --git a/tez-ui/src/main/webapp/app/components/zip-download-modal.js b/tez-ui/src/main/webapp/app/components/zip-download-modal.js
index c55b34e..528c84e 100644
--- a/tez-ui/src/main/webapp/app/components/zip-download-modal.js
+++ b/tez-ui/src/main/webapp/app/components/zip-download-modal.js
@@ -23,7 +23,7 @@ export default Ember.Component.extend({
   content: null,
 
   _onSuccess: Ember.observer("content.downloader.succeeded", function () {
-    if(this.get("content.downloader.succeeded")) {
+    if(this.get("content.downloader.succeeded") && !this.get("content.downloader.partial")) {
       Ember.run.later(this, "close");
     }
   }),

http://git-wip-us.apache.org/repos/asf/tez/blob/daa8d3db/tez-ui/src/main/webapp/app/styles/zip-download-modal.less
----------------------------------------------------------------------
diff --git a/tez-ui/src/main/webapp/app/styles/zip-download-modal.less b/tez-ui/src/main/webapp/app/styles/zip-download-modal.less
index 4ed0fd2..49b5245 100644
--- a/tez-ui/src/main/webapp/app/styles/zip-download-modal.less
+++ b/tez-ui/src/main/webapp/app/styles/zip-download-modal.less
@@ -20,11 +20,22 @@
   .message {
     padding: 10px 15px;
 
+    i {
+      margin-right: 5px;
+    }
+
     .fa-spinner {
       color: green;
     }
-    .fa-exclamation-circle {
+    .error {
       color: red;
     }
+    .warning {
+      color: orange;
+    }
+
+    .progress {
+      margin: 5px 0 5px 0;
+    }
   }
 }

http://git-wip-us.apache.org/repos/asf/tez/blob/daa8d3db/tez-ui/src/main/webapp/app/templates/components/zip-download-modal.hbs
----------------------------------------------------------------------
diff --git a/tez-ui/src/main/webapp/app/templates/components/zip-download-modal.hbs b/tez-ui/src/main/webapp/app/templates/components/zip-download-modal.hbs
index 03b820e..937722c 100644
--- a/tez-ui/src/main/webapp/app/templates/components/zip-download-modal.hbs
+++ b/tez-ui/src/main/webapp/app/templates/components/zip-download-modal.hbs
@@ -18,17 +18,21 @@
 
 <div class="message">
   {{#if content.downloader.failed}}
-    <i class="fa fa-lg fa-exclamation-circle"></i>
+    <i class="fa fa-lg fa-exclamation-circle error"></i>
     Error downloading data!
+  {{else}}{{#if (and content.downloader.partial content.downloader.succeeded)}}
+    <i class="fa fa-lg fa-exclamation-circle warning"></i>
+    Data downloaded might be incomplete. Please check the zip!
   {{else}}
-    <i class="fa fa-lg fa-spinner fa-spin"></i>
     Downloading data for dag: <b>{{content.dag.entityID}}</b>
-  {{/if}}
+    {{em-progress value=content.downloader.percent striped=true}}
+    {{content.downloader.message}}
+  {{/if}}{{/if}}
 </div>
 
 
 <div class="form-actions">
-  {{#if content.downloader.failed}}
+  {{#if (or content.downloader.failed content.downloader.partial)}}
     <button type="button" class="btn btn-primary" data-dismiss="modal" aria-label="Close">Ok</button>
   {{else}}
     <button type="button" class="btn" data-dismiss="modal" aria-label="Close" {{action "cancel"}}>Cancel</button>

http://git-wip-us.apache.org/repos/asf/tez/blob/daa8d3db/tez-ui/src/main/webapp/app/utils/download-dag-zip.js
----------------------------------------------------------------------
diff --git a/tez-ui/src/main/webapp/app/utils/download-dag-zip.js b/tez-ui/src/main/webapp/app/utils/download-dag-zip.js
index 9c91a92..8f10bde 100644
--- a/tez-ui/src/main/webapp/app/utils/download-dag-zip.js
+++ b/tez-ui/src/main/webapp/app/utils/download-dag-zip.js
@@ -110,6 +110,10 @@ var IO = {
       var reqID = getRequestId();
       pendingRequests[reqID] = xhr;
 
+      if(item.onFetch) {
+        item.onFetch(item.context);
+      }
+
       xhr.done(function(data/*, statusText, xhr*/) {
         delete pendingRequests[reqID];
 
@@ -129,8 +133,17 @@ var IO = {
       }).fail(function(xhr, statusText/*, errorObject*/) {
         delete pendingRequests[reqID];
         inProgress--;
-        if(item.onItemFail) {
-          item.onItemFail();
+
+        if(item.retryCount) {
+          itemList.unshift(item);
+          item.retryCount--;
+          if(item.onRetry) {
+            item.onRetry(item.context);
+          }
+          Ember.run.later(processNext, 3000 + Math.random() * 3000);
+        }
+        else if(item.onItemFail) {
+          item.onItemFail(xhr, item.context);
           processNext();
         }
         else {
@@ -286,27 +299,47 @@ export default function downloadDagZip(dag, options) {
         {
           url: getUrl('TEZ_APPLICATION', 'tez_' + dag.get("appID")),
           context: { name: 'application', type: 'TEZ_APPLICATION' },
-          onItemFetched: processSingleItem
+          onFetch: onFetch,
+          onRetry: onRetry,
+          onItemFetched: processSingleItem,
+          onItemFail: processFailure,
+          retryCount: 3,
         },
         {
           url: getUrl('TEZ_DAG_ID', dagID),
           context: { name: 'dag', type: 'TEZ_DAG_ID' },
-          onItemFetched: processSingleItem
+          onFetch: onFetch,
+          onRetry: onRetry,
+          onItemFetched: processSingleItem,
+          onItemFail: processFailure,
+          retryCount: 3,
         },
         {
           url: getUrl('TEZ_VERTEX_ID', null, dagID),
           context: { name: 'vertices', type: 'TEZ_VERTEX_ID', part: 0 },
-          onItemFetched: processMultipleItems
+          onFetch: onFetch,
+          onRetry: onRetry,
+          onItemFetched: processMultipleItems,
+          onItemFail: processFailure,
+          retryCount: 3,
         },
         {
           url: getUrl('TEZ_TASK_ID', null, dagID),
           context: { name: 'tasks', type: 'TEZ_TASK_ID', part: 0 },
-          onItemFetched: processMultipleItems
+          onFetch: onFetch,
+          onRetry: onRetry,
+          onItemFetched: processMultipleItems,
+          onItemFail: processFailure,
+          retryCount: 3,
         },
         {
           url: getUrl('TEZ_TASK_ATTEMPT_ID', null, dagID),
           context: { name: 'task_attempts', type: 'TEZ_TASK_ATTEMPT_ID', part: 0 },
-          onItemFetched: processMultipleItems
+          onFetch: onFetch,
+          onRetry: onRetry,
+          onItemFetched: processMultipleItems,
+          onItemFail: processFailure,
+          retryCount: 3,
         }
       ];
 
@@ -334,7 +367,9 @@ export default function downloadDagZip(dag, options) {
       }),
       downloaderProxy = Ember.Object.create({
         percent: 0,
+        message: "",
         succeeded: false,
+        partial: false,
         failed: false,
         cancel: function() {
           downloader.cancel();
@@ -353,6 +388,7 @@ export default function downloadDagZip(dag, options) {
         url = `${url}&fromId=${fromID}`;
       }
     }
+
     return url;
   }
 
@@ -367,6 +403,30 @@ export default function downloadDagZip(dag, options) {
     }
   }
 
+  function onFetch(context) {
+    downloaderProxy.set("message", `Fetching ${context.name} data.`);
+  }
+
+  function onRetry(context) {
+    downloaderProxy.set("message", `Downloading ${context.name} data failed. Retrying!`);
+  }
+
+  function processFailure(data, context) {
+    var obj = {};
+    try {
+      obj[context.name] = JSON.parse(data.responseText);
+    }
+    catch(e) {
+      obj[context.name] = data.responseText;
+    }
+
+    downloaderProxy.set("partial", true);
+    downloaderProxy.set("message", `Downloading ${context.name} data failed!`);
+
+    zipHelper.addFile({name: `error.${context.name}.json`, data: JSON.stringify(obj, null, 2)});
+    checkIfAllDownloaded();
+  }
+
   function processSingleItem(data, context) {
     var obj = {};
     obj[context.name] = data;
@@ -415,6 +475,7 @@ export default function downloadDagZip(dag, options) {
 
   zipHelper.then(function(zippedBlob) {
     saveAs(zippedBlob, `${dagID}.zip`);
+    downloaderProxy.set("message", `Download complete.`);
     downloaderProxy.set("succeeded", true);
   }, function() {
     Ember.Logger.error('zip Failed');

http://git-wip-us.apache.org/repos/asf/tez/blob/daa8d3db/tez-ui/src/main/webapp/tests/integration/components/zip-download-modal-test.js
----------------------------------------------------------------------
diff --git a/tez-ui/src/main/webapp/tests/integration/components/zip-download-modal-test.js b/tez-ui/src/main/webapp/tests/integration/components/zip-download-modal-test.js
index cd9a61a..8326054 100644
--- a/tez-ui/src/main/webapp/tests/integration/components/zip-download-modal-test.js
+++ b/tez-ui/src/main/webapp/tests/integration/components/zip-download-modal-test.js
@@ -34,7 +34,7 @@ test('Basic creation test', function(assert) {
   });
 
   this.render(hbs`{{zip-download-modal content=content}}`);
-  assert.equal(this.$(".message").text().trim(), expectedMessage);
+  assert.equal(this.$(".message").text().trim().indexOf(expectedMessage), 0);
 
   // Template block usage:" + EOL +
   this.render(hbs`
@@ -42,5 +42,53 @@ test('Basic creation test', function(assert) {
       template block text
     {{/zip-download-modal}}
   `);
-  assert.equal(this.$(".message").text().trim(), expectedMessage);
+  assert.equal(this.$(".message").text().trim().indexOf(expectedMessage), 0);
 });
+
+test('progress test', function(assert) {
+  this.set("content", {
+    downloader: {
+      percent: 0.5
+    }
+  });
+
+  this.render(hbs`{{zip-download-modal content=content}}`);
+  let text = this.$(".message").text().trim();
+  assert.equal(text.substr(-3), "50%");
+
+  assert.equal(this.$(".btn").length, 1);
+  assert.equal(this.$(".btn-primary").length, 0);
+});
+
+test('failed test', function(assert) {
+  var expectedMessage = "Error downloading data!";
+
+  this.set("content", {
+    downloader: {
+      failed: true
+    }
+  });
+
+  this.render(hbs`{{zip-download-modal content=content}}`);
+  assert.equal(this.$(".message").text().trim().indexOf(expectedMessage), 0);
+
+  assert.equal(this.$(".btn").length, 1);
+  assert.equal(this.$(".btn-primary").length, 1);
+});
+
+test('partial test', function(assert) {
+  var expectedMessage = "Data downloaded might be incomplete. Please check the zip!";
+
+  this.set("content", {
+    downloader: {
+      succeeded: true,
+      partial: true
+    }
+  });
+
+  this.render(hbs`{{zip-download-modal content=content}}`);
+  assert.equal(this.$(".message").text().trim().indexOf(expectedMessage), 0);
+
+  assert.equal(this.$(".btn").length, 1);
+  assert.equal(this.$(".btn-primary").length, 1);
+});
\ No newline at end of file