You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by nc...@apache.org on 2016/02/18 14:33:35 UTC

[16/33] ambari git commit: AMBARI-15070. Graph scale behaviour is incorrect if time range is switched before graph data API call is complete (alexantonenko)

AMBARI-15070. Graph scale behaviour is incorrect if time range is switched before graph data API call is complete (alexantonenko)


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

Branch: refs/heads/branch-dev-patch-upgrade
Commit: a91890a819e77638d5cb371e49a9a5d0fdebf4d1
Parents: 506bb8d
Author: Alex Antonenko <hi...@gmail.com>
Authored: Wed Feb 17 15:20:14 2016 +0200
Committer: Alex Antonenko <hi...@gmail.com>
Committed: Wed Feb 17 17:46:45 2016 +0200

----------------------------------------------------------------------
 .../app/mixins/common/widgets/widget_mixin.js   | 62 +++++++++++----
 ambari-web/app/utils/ajax/ajax.js               | 12 +++
 .../app/views/common/chart/linear_time.js       | 84 +++++++++++++++-----
 .../main/admin/stack_upgrade/versions_view.js   |  6 +-
 .../test/mixins/common/widget_mixin_test.js     | 18 ++++-
 ambari-web/test/utils/ajax/ajax_test.js         | 32 ++++++++
 .../test/views/common/chart/linear_time_test.js | 10 ++-
 7 files changed, 179 insertions(+), 45 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/a91890a8/ambari-web/app/mixins/common/widgets/widget_mixin.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/mixins/common/widgets/widget_mixin.js b/ambari-web/app/mixins/common/widgets/widget_mixin.js
index 6d65c33..13e55f2 100644
--- a/ambari-web/app/mixins/common/widgets/widget_mixin.js
+++ b/ambari-web/app/mixins/common/widgets/widget_mixin.js
@@ -120,9 +120,18 @@ App.WidgetMixin = Ember.Mixin.create({
           startCallName: 'getHostComponentMetrics',
           successCallback: this.getHostComponentMetricsSuccessCallback,
           errorCallback: this.getMetricsErrorCallback,
-          completeCallback: function () {
+          completeCallback: function (xhr) {
             requestCounter--;
             if (requestCounter === 0) this.onMetricsLoaded();
+            if (this.get('graphView')) {
+              var graph = this.get('childViews') && this.get('childViews').findProperty('runningRequests');
+              if (graph) {
+                var requestsArrayName = graph.get('isPopup') ? 'runningPopupRequests' : 'runningRequests';
+                graph.set(requestsArrayName, graph.get(requestsArrayName).reject(function (item) {
+                  return item === xhr;
+                }));
+              }
+            }
           }
         });
       } else {
@@ -132,9 +141,18 @@ App.WidgetMixin = Ember.Mixin.create({
           startCallName: 'getServiceComponentMetrics',
           successCallback: this.getMetricsSuccessCallback,
           errorCallback: this.getMetricsErrorCallback,
-          completeCallback: function () {
+          completeCallback: function (xhr) {
             requestCounter--;
             if (requestCounter === 0) this.onMetricsLoaded();
+            if (this.get('graphView')) {
+              var graph = this.get('childViews') && this.get('childViews').findProperty('runningRequests');
+              if (graph) {
+                var requestsArrayName = graph.get('isPopup') ? 'runningPopupRequests' : 'runningRequests';
+                graph.set(requestsArrayName, graph.get(requestsArrayName).reject(function (item) {
+                  return item === xhr;
+                }));
+              }
+            }
           }
         });
       }
@@ -192,7 +210,7 @@ App.WidgetMixin = Ember.Mixin.create({
    * @returns {$.ajax}
    */
   getServiceComponentMetrics: function (request) {
-    return App.ajax.send({
+    var xhr = App.ajax.send({
       name: 'widgets.serviceComponent.metrics.get',
       sender: this,
       data: {
@@ -201,6 +219,14 @@ App.WidgetMixin = Ember.Mixin.create({
         metricPaths: this.prepareMetricPaths(request.metric_paths)
       }
     });
+    if (this.get('graphView')) {
+      var graph = this.get('childViews') && this.get('childViews').findProperty('runningRequests');
+      if (graph) {
+        var requestsArrayName = graph.get('isPopup') ? 'runningPopupRequests' : 'runningRequests';
+        graph.get(requestsArrayName).push(xhr);
+      }
+    }
+    return xhr;
   },
 
   /**
@@ -230,15 +256,21 @@ App.WidgetMixin = Ember.Mixin.create({
     var metricPaths = this.prepareMetricPaths(request.metric_paths);
 
     if (metricPaths.length) {
-      return App.ajax.send({
-        name: 'widgets.hostComponent.metrics.get',
-        sender: this,
-        data: {
-          componentName: request.component_name,
-          metricPaths: this.prepareMetricPaths(request.metric_paths),
-          hostComponentCriteria: this.computeHostComponentCriteria(request)
-        }
-      });
+      var xhr = App.ajax.send({
+          name: 'widgets.hostComponent.metrics.get',
+          sender: this,
+          data: {
+            componentName: request.component_name,
+            metricPaths: this.prepareMetricPaths(request.metric_paths),
+            hostComponentCriteria: this.computeHostComponentCriteria(request)
+          }
+        }),
+        graph = this.get('graphView') && this.get('childViews') && this.get('childViews').findProperty('runningRequests');
+      if (graph) {
+        var requestsArrayName = graph.get('isPopup') ? 'runningPopupRequests' : 'runningRequests';
+        graph.get(requestsArrayName).push(xhr);
+      }
+      return xhr;
     }
     return jQuery.Deferred().reject().promise();
   },
@@ -300,7 +332,7 @@ App.WidgetMixin = Ember.Mixin.create({
    * @param {string} errorThrown
    */
   getMetricsErrorCallback: function (xhr, textStatus, errorThrown) {
-    if (this.get('graphView')) {
+    if (this.get('graphView') && !xhr.isForcedAbort) {
       var graph = this.get('childViews') && this.get('childViews').findProperty('_showMessage');
       if (graph) {
         if (xhr.readyState == 4 && xhr.status) {
@@ -778,9 +810,9 @@ App.WidgetLoadAggregator = Em.Object.create({
                 subRequest.errorCallback.call(subRequest.context, xhr, textStatus, errorThrown);
               }
             }, this);
-          }).always(function () {
+          }).always(function (xhr) {
               _request.subRequests.forEach(function (subRequest) {
-                subRequest.completeCallback.call(subRequest.context);
+                subRequest.completeCallback.call(subRequest.context, xhr);
               }, this);
             });
       })(bulks[id]);

http://git-wip-us.apache.org/repos/asf/ambari/blob/a91890a8/ambari-web/app/utils/ajax/ajax.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/utils/ajax/ajax.js b/ambari-web/app/utils/ajax/ajax.js
index f2174f3..3ccd01c 100644
--- a/ambari-web/app/utils/ajax/ajax.js
+++ b/ambari-web/app/utils/ajax/ajax.js
@@ -3054,6 +3054,18 @@ var ajax = Em.Object.extend({
    */
   defaultErrorKDCHandler: function(opt, msg) {
     return App.showInvalidKDCPopup(opt, msg);
+  },
+
+  /**
+   * Abort all requests stored in the certain array
+   * @param requestsArray
+   */
+  abortRequests: function (requestsArray) {
+    requestsArray.forEach(function (xhr) {
+      xhr.isForcedAbort = true;
+      xhr.abort();
+    });
+    requestsArray.clear();
   }
 
 });

http://git-wip-us.apache.org/repos/asf/ambari/blob/a91890a8/ambari-web/app/views/common/chart/linear_time.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/views/common/chart/linear_time.js b/ambari-web/app/views/common/chart/linear_time.js
index c7dd3f9..064bec3 100644
--- a/ambari-web/app/views/common/chart/linear_time.js
+++ b/ambari-web/app/views/common/chart/linear_time.js
@@ -167,6 +167,20 @@ App.ChartLinearTimeView = Ember.View.extend(App.ExportMetricsMixin, {
    */
   seriesTemplate: null,
 
+  /**
+   * Incomplete metrics requests
+   * @type {array}
+   * @default []
+   */
+  runningRequests: [],
+
+  /**
+   * Incomplete metrics requests for detailed view
+   * @type {array}
+   * @default []
+   */
+  runningPopupRequests: [],
+
   _containerSelector: Em.computed.format('#{0}-container', 'id'),
 
   _popupSelector: Em.computed.concat('', '_containerSelector', 'popupSuffix'),
@@ -295,6 +309,7 @@ App.ChartLinearTimeView = Ember.View.extend(App.ExportMetricsMixin, {
     this.$("[rel='ZoomInTooltip']").tooltip('destroy');
     $(this.get('_containerSelector') + ' li.line').off();
     $(this.get('_popupSelector') + ' li.line').off();
+    App.ajax.abortRequests(this.get('runningRequests'));
   },
 
   registerGraph: function () {
@@ -307,16 +322,26 @@ App.ChartLinearTimeView = Ember.View.extend(App.ExportMetricsMixin, {
   },
 
   loadData: function () {
-    if (this.get('loadGroup') && !this.get('isPopup')) {
+    var self = this,
+      isPopup = this.get('isPopup');
+    if (this.get('loadGroup') && !isPopup) {
       return App.ChartLinearTimeView.LoadAggregator.add(this, this.get('loadGroup'));
     } else {
-      return App.ajax.send({
-        name: this.get('ajaxIndex'),
-        sender: this,
-        data: this.getDataForAjaxRequest(),
-        success: 'loadDataSuccessCallback',
-        error: 'loadDataErrorCallback'
-      });
+      var requestsArrayName = isPopup ? 'runningPopupRequests' : 'runningRequests',
+        request = App.ajax.send({
+          name: this.get('ajaxIndex'),
+          sender: this,
+          data: this.getDataForAjaxRequest(),
+          success: 'loadDataSuccessCallback',
+          error: 'loadDataErrorCallback',
+          callback: function () {
+            self.set(requestsArrayName, self.get(requestsArrayName).reject(function (item) {
+              return item === request;
+            }));
+          }
+        });
+      this.get(requestsArrayName).push(request);
+      return request;
     }
   },
 
@@ -356,15 +381,17 @@ App.ChartLinearTimeView = Ember.View.extend(App.ExportMetricsMixin, {
   },
 
   loadDataErrorCallback: function (xhr, textStatus, errorThrown) {
-    this.set('isReady', true);
-    if (xhr.readyState == 4 && xhr.status) {
-      textStatus = xhr.status + " " + textStatus;
+    if (!xhr.isForcedAbort) {
+      this.set('isReady', true);
+      if (xhr.readyState == 4 && xhr.status) {
+        textStatus = xhr.status + " " + textStatus;
+      }
+      this._showMessage('warn', this.t('graphs.error.title'), this.t('graphs.error.message').format(textStatus, errorThrown));
+      this.setProperties({
+        hasData: false,
+        isExportButtonHidden: true
+      });
     }
-    this._showMessage('warn', this.t('graphs.error.title'), this.t('graphs.error.message').format(textStatus, errorThrown));
-    this.setProperties({
-      hasData: false,
-      isExportButtonHidden: true
-    });
   },
 
   /**
@@ -999,6 +1026,7 @@ App.ChartLinearTimeView = Ember.View.extend(App.ExportMetricsMixin, {
           customDurationFormatted: targetView.get('customDurationFormatted'),
           isPopup: false
         });
+        App.ajax.abortRequests(this.get('graph.runningPopupRequests'));
         this._super();
       },
 
@@ -1034,6 +1062,7 @@ App.ChartLinearTimeView = Ember.View.extend(App.ExportMetricsMixin, {
         this.set('childViews.firstObject.currentTimeRangeIndex', index);
         this.set('currentTimeIndex', index);
         self.set('currentTimeIndex', index);
+        App.ajax.abortRequests(this.get('graph.runningPopupRequests'));
       },
       currentTimeIndex: self.get('currentTimeIndex'),
 
@@ -1082,6 +1111,9 @@ App.ChartLinearTimeView = Ember.View.extend(App.ExportMetricsMixin, {
       customEndTime: customEndTime,
       customDurationFormatted: customDurationFormatted
     });
+    if (index !== 8 || targetView.get('customStartTime') && targetView.get('customEndTime')) {
+      App.ajax.abortRequests(this.get('runningRequests'));
+    }
   }.observes('parentView.parentView.currentTimeRangeIndex', 'parentView.currentTimeRangeIndex', 'parentView.parentView.customStartTime', 'parentView.customStartTime', 'parentView.parentView.customEndTime', 'parentView.customEndTime'),
   timeUnitSeconds: 3600,
   timeUnitSecondsSetter: function () {
@@ -1408,25 +1440,33 @@ App.ChartLinearTimeView.LoadAggregator = Em.Object.create({
       (function (_request) {
         var fields = self.formatRequestData(_request);
         var hostName = (_request.context.get('content')) ? _request.context.get('content.hostName') : "";
-
-        App.ajax.send({
+        var xhr = App.ajax.send({
           name: _request.name,
           sender: _request.context,
           data: {
             fields: fields,
             hostName: hostName
           }
-        }).done(function (response) {
+        });
+
+        xhr.done(function (response) {
           console.time('==== runRequestsDone');
           _request.subRequests.forEach(function (subRequest) {
             subRequest.context._refreshGraph.call(subRequest.context, response);
           }, this);
           console.timeEnd('==== runRequestsDone');
         }).fail(function (jqXHR, textStatus, errorThrown) {
-          _request.subRequests.forEach(function (subRequest) {
-            subRequest.context.loadDataErrorCallback.call(subRequest.context, jqXHR, textStatus, errorThrown);
-          }, this);
+          if (!jqXHR.isForcedAbort) {
+            _request.subRequests.forEach(function (subRequest) {
+              subRequest.context.loadDataErrorCallback.call(subRequest.context, jqXHR, textStatus, errorThrown);
+            }, this);
+          }
+        }).always(function () {
+          _request.context.set('runningRequests', _request.context.get('runningRequests').reject(function (item) {
+            return item === xhr;
+          }));
         });
+        _request.context.get('runningRequests').push(xhr);
       })(bulks[id]);
     }
   },

http://git-wip-us.apache.org/repos/asf/ambari/blob/a91890a8/ambari-web/app/views/main/admin/stack_upgrade/versions_view.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/views/main/admin/stack_upgrade/versions_view.js b/ambari-web/app/views/main/admin/stack_upgrade/versions_view.js
index d535300..3649513 100644
--- a/ambari-web/app/views/main/admin/stack_upgrade/versions_view.js
+++ b/ambari-web/app/views/main/admin/stack_upgrade/versions_view.js
@@ -199,12 +199,8 @@ App.MainAdminStackVersionsView = Em.View.extend({
    * stop polling upgrade state
    */
   willDestroyElement: function () {
-    var runningCheckRequests = this.get('controller.runningCheckRequests');
     window.clearTimeout(this.get('updateTimer'));
-    runningCheckRequests.forEach(function (request) {
-      request.abort();
-    });
-    runningCheckRequests.clear();
+    App.ajax.abortRequests(this.get('controller.runningCheckRequests'));
   },
 
   /**

http://git-wip-us.apache.org/repos/asf/ambari/blob/a91890a8/ambari-web/test/mixins/common/widget_mixin_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/mixins/common/widget_mixin_test.js b/ambari-web/test/mixins/common/widget_mixin_test.js
index e32026a..c70150d 100644
--- a/ambari-web/test/mixins/common/widget_mixin_test.js
+++ b/ambari-web/test/mixins/common/widget_mixin_test.js
@@ -394,6 +394,7 @@ describe('App.WidgetMixin', function () {
       cases = [
         {
           graphView: null,
+          isForcedAbort: false,
           metricsLength: 1,
           showMessageCallCount: 0,
           isExportButtonHidden: false,
@@ -401,6 +402,7 @@ describe('App.WidgetMixin', function () {
         },
         {
           graphView: {},
+          isForcedAbort: false,
           metricsLength: 1,
           showMessageCallCount: 0,
           isExportButtonHidden: false,
@@ -409,6 +411,7 @@ describe('App.WidgetMixin', function () {
         {
           graphView: {},
           childViews: [],
+          isForcedAbort: false,
           metricsLength: 1,
           showMessageCallCount: 0,
           isExportButtonHidden: false,
@@ -417,6 +420,7 @@ describe('App.WidgetMixin', function () {
         {
           graphView: {},
           childViews: [Em.Object.create({})],
+          isForcedAbort: false,
           metricsLength: 1,
           showMessageCallCount: 0,
           isExportButtonHidden: false,
@@ -425,10 +429,20 @@ describe('App.WidgetMixin', function () {
         {
           graphView: {},
           childViews: [Em.Object.create({}), view],
+          isForcedAbort: false,
           metricsLength: 0,
           showMessageCallCount: 1,
           isExportButtonHidden: true,
           title: 'graph view is available'
+        },
+        {
+          graphView: {},
+          childViews: [Em.Object.create({}), view],
+          isForcedAbort: true,
+          metricsLength: 1,
+          showMessageCallCount: 0,
+          isExportButtonHidden: false,
+          title: 'request is aborted'
         }
       ],
       messageCases = [
@@ -471,7 +485,9 @@ describe('App.WidgetMixin', function () {
             graphView: item.graphView,
             childViews: item.childViews
           });
-          obj.getMetricsErrorCallback({});
+          obj.getMetricsErrorCallback({
+            isForcedAbort: item.isForcedAbort
+          });
         });
 
         it('metrics array', function () {

http://git-wip-us.apache.org/repos/asf/ambari/blob/a91890a8/ambari-web/test/utils/ajax/ajax_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/utils/ajax/ajax_test.js b/ambari-web/test/utils/ajax/ajax_test.js
index b0749df..747ccff 100644
--- a/ambari-web/test/utils/ajax/ajax_test.js
+++ b/ambari-web/test/utils/ajax/ajax_test.js
@@ -162,4 +162,36 @@ describe('App.ajax', function() {
       });
     });
   });
+  
+  describe('#abortRequests', function () {
+
+    var xhr = {
+        abort: Em.K
+      },
+      requests;
+
+    beforeEach(function () {
+      sinon.spy(xhr, 'abort');
+      xhr.isForcedAbort = false;
+      requests = [xhr, xhr];
+      App.ajax.abortRequests(requests);
+    });
+
+    afterEach(function () {
+      xhr.abort.restore();
+    });
+
+    it('should abort all requests', function () {
+      expect(xhr.abort.calledTwice).to.be.true;
+    });
+
+    it('should mark request as aborted', function () {
+      expect(xhr.isForcedAbort).to.be.true;
+    });
+
+    it('should clear requests array', function () {
+      expect(requests).to.have.length(0);
+    });
+    
+  });
 });

http://git-wip-us.apache.org/repos/asf/ambari/blob/a91890a8/ambari-web/test/views/common/chart/linear_time_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/views/common/chart/linear_time_test.js b/ambari-web/test/views/common/chart/linear_time_test.js
index 7d76520..c547249 100644
--- a/ambari-web/test/views/common/chart/linear_time_test.js
+++ b/ambari-web/test/views/common/chart/linear_time_test.js
@@ -543,7 +543,8 @@ describe('App.ChartLinearTimeView.LoadAggregator', function () {
       sinon.stub(App.ajax, 'send', function(){
         return {
           done: Em.K,
-          fail: Em.K
+          fail: Em.K,
+          always: Em.K
         }
       });
     });
@@ -552,7 +553,12 @@ describe('App.ChartLinearTimeView.LoadAggregator', function () {
       aggregator.formatRequestData.restore();
     });
     it("valid request is sent", function () {
-      var context = Em.Object.create({content: {hostName: 'host1'}});
+      var context = Em.Object.create({
+        content: {
+          hostName: 'host1'
+        },
+        runningRequests: []
+      });
       var requests = {
         'r1': {
           name: 'r1',