소스 검색

AMBARI-3973 Reduce influence of host-components quantity on service metrics mapper. (atkach)

atkach 11 년 전
부모
커밋
e3d19b6abd

+ 0 - 1
ambari-web/app/controllers/wizard/step3_controller.js

@@ -424,7 +424,6 @@ App.WizardStep3Controller = Em.Controller.extend({
       // REGISTERING - bootstrap is done but has not registered; transition to REGISTERED if host found in polling API result
       // REGISTERED - bootstrap and registration is done; leave it alone
       // FAILED - either bootstrap or registration failed; leave it alone
-      console.log(_host.name + ' bootStatus=' + _host.get('bootStatus'));
       switch (_host.get('bootStatus')) {
         case 'DONE':
           _host.set('bootStatus', 'REGISTERING');

+ 2 - 4
ambari-web/app/mappers/hosts_mapper.js

@@ -136,12 +136,10 @@ App.hostsMapper = App.QuickDataMapper.create({
             if (host && !hostIds[host.get('hostName')]) {
               // Delete old ones as new ones will be
               // loaded by loadMany().
-              host.deleteRecord();
-              App.store.commit();
-              host.get('stateManager').transitionTo('loading');
+              this.deleteRecord(host);
               delete cacheData[host.get('id')];
             }
-          });
+          }, this);
         }
       }
       if (!isModelLoaded) {

+ 11 - 0
ambari-web/app/mappers/server_data_mapper.js

@@ -124,6 +124,17 @@ App.QuickDataMapper = App.ServerDataMapper.extend({
     return current;
   },
 
+  /**
+   * properly delete record from model
+   * @param item
+   */
+  deleteRecord: function (item) {
+    item.deleteRecord();
+    App.store.commit();
+    item.get('stateManager').transitionTo('loading');
+    console.log('Record with id:' + item.get('id') + ' was deleted from model');
+  },
+
   calculateState: function (json) {
 //    var stateEqual = (json.desired_status != json.work_status);
 //    if (stateEqual) {

+ 45 - 1
ambari-web/app/mappers/service_metrics_mapper.js

@@ -17,6 +17,8 @@
 
 var App = require('app');
 var misc = require('utils/misc');
+var stringUtils = require('utils/string_utils');
+var previousResponse = [];
 
 App.serviceMetricsMapper = App.QuickDataMapper.create({
 
@@ -227,7 +229,24 @@ App.serviceMetricsMapper = App.QuickDataMapper.create({
       result = misc.sortByOrder(App.Service.servicesSortOrder, result);
 
       //load services to model
-      App.store.loadMany(this.get('model'), result);
+      if (previousResponse.length !== result.length) {
+        App.store.loadMany(this.get('model'), result);
+      } else {
+        result.forEach(function (serviceJson) {
+          var fields = ['work_status', 'rand', 'alerts', 'quick_links', 'host_components'];
+          var service = this.get('model').find(serviceJson.id);
+          var modifiedData = this.getDiscrepancies(serviceJson, previousResponse.findProperty('id', serviceJson.id), fields);
+          if (modifiedData.isLoadNeeded) {
+            App.store.load(this.get('model'), serviceJson);
+          } else {
+            for (var property in modifiedData) {
+              service.set(stringUtils.underScoreToCamelCase(property), modifiedData[property]);
+            }
+          }
+        }, this)
+      }
+
+      previousResponse = result;
 
       var servicesMap = {};
       //calculate service statuses according to their host-components
@@ -240,6 +259,31 @@ App.serviceMetricsMapper = App.QuickDataMapper.create({
     }
     console.timeEnd('App.serviceMetricsMapper execution time');
   },
+  /**
+   * check mutable fields whether they have been changed and if positive
+   * return host object only with properties, that contains new value
+   * @param current
+   * @param previous
+   * @param fields
+   * @return {*}
+   */
+  getDiscrepancies: function (current, previous, fields) {
+    var result = {};
+    if (previous) {
+      fields.forEach(function (field) {
+        if (Array.isArray(current[field])) {
+          if (JSON.stringify(current[field]) !== JSON.stringify(previous[field])) {
+            result[field] = current[field];
+            result.isLoadNeeded = true;
+          }
+        } else {
+          if (current[field] != previous[field]) result[field] = current[field];
+        }
+      });
+      return result;
+    }
+    return current;
+  },
 
   /**
    * fill serviceMap with aggregated data of hostComponents for each service

+ 1 - 3
ambari-web/app/mappers/status_mapper.js

@@ -95,9 +95,7 @@ App.statusMapper = App.QuickDataMapper.create({
               hostComponent.set('workStatus', status);
             }
           } else {
-            hostComponent.deleteRecord();
-            App.store.commit();
-            hostComponent.get('stateManager').transitionTo('loading');
+            this.deleteRecord(hostComponent);
           }
         }
       }, this);