Browse Source

AMBARI-3693 [perf] Hosts UI should not load host_components unless editing a host. (atkach)

atkach 11 years ago
parent
commit
747f5897ec

+ 6 - 3
ambari-web/app/controllers/global/cluster_controller.js

@@ -268,13 +268,14 @@ App.ClusterController = Em.Controller.extend({
       return false;
       return false;
     }
     }
     var testUrl = App.get('isHadoop2Stack') ? '/data/dashboard/HDP2/services.json':'/data/dashboard/services.json';
     var testUrl = App.get('isHadoop2Stack') ? '/data/dashboard/HDP2/services.json':'/data/dashboard/services.json';
-    //desired_state property is eliminated since calculateState function is commented out, it become useless
-    var servicesUrl = this.getUrl(testUrl, '/services?fields=ServiceInfo,components/host_components/HostRoles/state');
+    var servicesUrl = '/services?fields=ServiceInfo,components/host_components/HostRoles/state';
     if (App.Service.find('HBASE')) {
     if (App.Service.find('HBASE')) {
       // HBase installed. We need the haStatus field as it has
       // HBase installed. We need the haStatus field as it has
       // moved to another field.
       // moved to another field.
       servicesUrl += ',components/host_components/metrics/hbase/master/IsActiveMaster';
       servicesUrl += ',components/host_components/metrics/hbase/master/IsActiveMaster';
     }
     }
+    //desired_state property is eliminated since calculateState function is commented out, it become useless
+    servicesUrl = this.getUrl(testUrl, servicesUrl);
 
 
     App.HttpClient.get(servicesUrl, App.statusMapper, {
     App.HttpClient.get(servicesUrl, App.statusMapper, {
       complete: callback
       complete: callback
@@ -318,7 +319,9 @@ App.ClusterController = Em.Controller.extend({
       return;
       return;
     }
     }
     var clusterUrl = this.getUrl('/data/clusters/cluster.json', '?fields=Clusters');
     var clusterUrl = this.getUrl('/data/clusters/cluster.json', '?fields=Clusters');
-    var hostsRealUrl = '/hosts?fields=Hosts/host_name,Hosts/public_host_name,Hosts/cpu_count,Hosts/total_mem,Hosts/host_status,Hosts/last_heartbeat_time,Hosts/os_arch,Hosts/os_type,Hosts/ip,host_components,metrics/disk,metrics/load/load_one';
+    var hostsRealUrl = '/hosts?fields=Hosts/host_name,Hosts/public_host_name,Hosts/cpu_count,Hosts/total_mem,' +
+      'Hosts/host_status,Hosts/last_heartbeat_time,Hosts/os_arch,Hosts/os_type,Hosts/ip,host_components,' +
+      'metrics/disk,metrics/load/load_one,metrics/cpu/cpu_system,metrics/cpu/cpu_user,metrics/memory/mem_total,metrics/memory/mem_free';
     var usersUrl = App.testMode ? '/data/users/users.json' : App.apiPrefix + '/users/?fields=*';
     var usersUrl = App.testMode ? '/data/users/users.json' : App.apiPrefix + '/users/?fields=*';
     var racksUrl = "/data/racks/racks.json";
     var racksUrl = "/data/racks/racks.json";
     var dataSetUrl = "/data/mirroring/all_datasets.json";
     var dataSetUrl = "/data/mirroring/all_datasets.json";

+ 15 - 6
ambari-web/app/controllers/global/update_controller.js

@@ -37,7 +37,7 @@ App.UpdateController = Em.Controller.extend({
    */
    */
   updateAll:function(){
   updateAll:function(){
     if(this.get('isWorking')) {
     if(this.get('isWorking')) {
-      App.updater.run(this, 'updateHost', 'isWorking');
+      App.updater.run(this, 'updateHostConditionally', 'isWorking');
       App.updater.run(this, 'updateServiceMetric', 'isWorking');
       App.updater.run(this, 'updateServiceMetric', 'isWorking');
       App.updater.run(this, 'graphsUpdate', 'isWorking');
       App.updater.run(this, 'graphsUpdate', 'isWorking');
       if (App.supports.hostOverrides) {
       if (App.supports.hostOverrides) {
@@ -45,13 +45,22 @@ App.UpdateController = Em.Controller.extend({
       }
       }
     }
     }
   }.observes('isWorking'),
   }.observes('isWorking'),
+  updateHostConditionally: function (callback) {
+    var location = App.router.get('location.lastSetURL');
+    if (/\/main\/hosts.*/.test(location)) {
+      this.updateHost(callback);
+    } else {
+      callback();
+    }
+  },
 
 
   updateHost:function(callback) {
   updateHost:function(callback) {
-    var testUrl =  App.get('isHadoop2Stack') ? '/data/hosts/HDP2/hosts.json':'/data/hosts/hosts.json';
-      var hostsUrl = this.getUrl(testUrl, '/hosts?fields=Hosts/host_name,Hosts/host_status,Hosts/last_heartbeat_time,host_components,metrics/disk,metrics/load/load_one');
-      App.HttpClient.get(hostsUrl, App.hostsMapper, {
-        complete: callback
-      });
+    var testUrl = App.get('isHadoop2Stack') ? '/data/hosts/HDP2/hosts.json' : '/data/hosts/hosts.json';
+    var hostsUrl = this.getUrl(testUrl, '/hosts?fields=Hosts/host_name,Hosts/last_heartbeat_time,' +
+      'metrics/disk,metrics/load/load_one,metrics/cpu/cpu_system,metrics/cpu/cpu_user,metrics/memory/mem_total,metrics/memory/mem_free');
+    App.HttpClient.get(hostsUrl, App.hostsMapper, {
+      complete: callback
+    });
   },
   },
   graphs: [],
   graphs: [],
   graphsUpdate: function (callback) {
   graphsUpdate: function (callback) {

+ 58 - 61
ambari-web/app/mappers/hosts_mapper.js

@@ -16,7 +16,6 @@
  */
  */
 
 
 var App = require('app');
 var App = require('app');
-var cacheData = {};
 
 
 App.hostsMapper = App.QuickDataMapper.create({
 App.hostsMapper = App.QuickDataMapper.create({
 
 
@@ -41,84 +40,82 @@ App.hostsMapper = App.QuickDataMapper.create({
     load_one: 'metrics.load.load_one',
     load_one: 'metrics.load.load_one',
     load_five: 'metrics.load.load_five',
     load_five: 'metrics.load.load_five',
     load_fifteen: 'metrics.load.load_fifteen',
     load_fifteen: 'metrics.load.load_fifteen',
-    cpu_usage: 'cpu_usage',
-    memory_usage: 'memory_usage',
+    cpu_system: 'metrics.cpu.cpu_system',
+    cpu_user: 'metrics.cpu.cpu_user',
+    mem_total: 'metrics.memory.mem_total',
+    mem_free: 'metrics.memory.mem_free',
     last_heart_beat_time: "Hosts.last_heartbeat_time",
     last_heart_beat_time: "Hosts.last_heartbeat_time",
     os_arch: 'Hosts.os_arch',
     os_arch: 'Hosts.os_arch',
     os_type: 'Hosts.os_type',
     os_type: 'Hosts.os_type',
-    ip: 'Hosts.ip',
-    disk_usage: 'disk_usage'
+    ip: 'Hosts.ip'
   },
   },
   map: function (json) {
   map: function (json) {
+    console.time('App.hostsMapper execution time');
     if (json.items) {
     if (json.items) {
-      var result = this.parse(json.items);
+      var result = [];
+      var hostIds = {};
+      var cacheData = App.cache['Hosts'];
+
+      json.items.forEach(function (item) {
+        //receive host_components when added hosts
+        item.host_components = item.host_components || [];
+        item.host_components.forEach(function (host_component) {
+          host_component.id = host_component.HostRoles.component_name + "_" + host_component.HostRoles.host_name;
+        }, this);
+
+        hostIds[item.Hosts.host_name] = true;
+        result.push(this.parseIt(item, this.config));
+      }, this);
+      result = this.sortByPublicHostName(result);
+
       var clientHosts = App.Host.find();
       var clientHosts = App.Host.find();
-      if (clientHosts != null && clientHosts.get('length') < result.length) {
-        result.forEach(function (host) {
-          cacheData[host.id] = host;
-        });
-      } else if (clientHosts != null && clientHosts.get('length') > result.length) {
-        var hostsToDelete = [];
-        clientHosts.forEach(function (host) {
-          if (host !== null && result.filterProperty('host_name',host.get('hostName')).length === 0) {
-            // Delete old ones as new ones will be
-            // loaded by loadMany().
-            hostsToDelete.push(host);
-            delete cacheData[host.get('hostName')];
-          }
-        });
-        hostsToDelete.forEach(function (host) {
-          host.deleteRecord();
-          host.get('stateManager').transitionTo('loading');
-        });
+
+      if (clientHosts) {
+        // hosts were added
+        if (clientHosts.get('length') < result.length) {
+          result.forEach(function (host) {
+            cacheData[host.id] = {
+              ip: host.ip,
+              os_arch: host.os_arch,
+              os_type: host.os_type,
+              public_host_name: host.public_host_name,
+              memory: host.memory,
+              cpu: host.cpu,
+              host_components: host.host_components
+            };
+          });
+        }
+        // hosts were deleted
+        if (clientHosts.get('length') > result.length) {
+          clientHosts.forEach(function (host) {
+            if (host && !hostIds[host.get('hostName')]) {
+              // Delete old ones as new ones will be
+              // loaded by loadMany().
+              host.deleteRecord();
+              host.get('stateManager').transitionTo('loading');
+              delete cacheData[host.get('id')];
+            }
+          });
+        }
       }
       }
       //restore properties from cache instead request them from server
       //restore properties from cache instead request them from server
       result.forEach(function (host) {
       result.forEach(function (host) {
         var cacheHost = cacheData[host.id];
         var cacheHost = cacheData[host.id];
         if (cacheHost) {
         if (cacheHost) {
-          host.ip ? cacheHost.ip = host.ip : host.ip = cacheHost.ip;
-          host.os_arch ? cacheHost.os_arch = host.os_arch : host.os_arch = cacheHost.os_arch;
-          host.os_type ?  cacheHost.os_type = host.os_type : host.os_type = cacheHost.os_type;
-          host.public_host_name ? cacheHost.public_host_name = host.public_host_name : host.public_host_name = cacheHost.public_host_name;
-          host.memory ? cacheHost.memory = host.memory : host.memory = cacheHost.memory;
-          host.cpu ? cacheHost.cpu = host.cpu : host.cpu = cacheHost.cpu;
+          host.ip = cacheHost.ip;
+          host.os_arch = cacheHost.os_arch;
+          host.os_type = cacheHost.os_type;
+          host.public_host_name = cacheHost.public_host_name;
+          host.memory = cacheHost.memory;
+          host.cpu = cacheHost.cpu;
+          host.host_components = cacheHost.host_components;
         }
         }
       });
       });
       App.store.loadMany(this.get('model'), result);
       App.store.loadMany(this.get('model'), result);
     }
     }
+    console.timeEnd('App.hostsMapper execution time');
   },
   },
 
 
-  parse: function(items) {
-    var result = [];
-    items.forEach(function (item) {
-
-      // Disk Usage
-      if (item.metrics && item.metrics.disk && item.metrics.disk.disk_total && item.metrics.disk.disk_free) {
-        var diskUsed = item.metrics.disk.disk_total - item.metrics.disk.disk_free;
-        var diskUsedPercent = (100 * diskUsed) / item.metrics.disk.disk_total;
-        item.disk_usage = diskUsedPercent.toFixed(1);
-      }
-      // CPU Usage
-      if (item.metrics && item.metrics.cpu && item.metrics.cpu.cpu_system && item.metrics.cpu.cpu_user) {
-        var cpuUsedPercent = item.metrics.cpu.cpu_system + item.metrics.cpu.cpu_user;
-        item.cpu_usage = cpuUsedPercent.toFixed(1);
-      }
-      // Memory Usage
-      if (item.metrics && item.metrics.memory && item.metrics.memory.mem_free && item.metrics.memory.mem_total) {
-        var memUsed = item.metrics.memory.mem_total - item.metrics.memory.mem_free;
-        var memUsedPercent = (100 * memUsed) / item.metrics.memory.mem_total;
-        item.memory_usage = memUsedPercent.toFixed(1);
-      }
-
-      item.host_components.forEach(function (host_component) {
-        host_component.id = host_component.HostRoles.component_name + "_" + host_component.HostRoles.host_name;
-      }, this);
-      result.push(this.parseIt(item, this.config));
-
-    }, this);
-    result = this.sortByPublicHostName(result);
-    return result;
-  },
   /**
   /**
    * Default data sorting by public_host_name field
    * Default data sorting by public_host_name field
    * @param data
    * @param data

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

@@ -18,6 +18,11 @@
 
 
 var App = require('app');
 var App = require('app');
 
 
+//initialize common cache container for mappers
+App.cache = {
+  'Hosts': {}
+};
+
 App.ServerDataMapper = Em.Object.extend({
 App.ServerDataMapper = Em.Object.extend({
   jsonKey: false,
   jsonKey: false,
   map: function (json) {
   map: function (json) {

+ 18 - 2
ambari-web/app/models/host.js

@@ -33,14 +33,30 @@ App.Host = DS.Model.extend({
   ip: DS.attr('string'),
   ip: DS.attr('string'),
   rack: DS.attr('string'),
   rack: DS.attr('string'),
   healthStatus: DS.attr('string'),
   healthStatus: DS.attr('string'),
-  cpuUsage: DS.attr('number'),
-  memoryUsage: DS.attr('number'),
   lastHeartBeatTime: DS.attr('number'),
   lastHeartBeatTime: DS.attr('number'),
   osType: DS.attr("string"),
   osType: DS.attr("string"),
   diskInfo: DS.attr('object'),
   diskInfo: DS.attr('object'),
   loadOne:DS.attr('number'),
   loadOne:DS.attr('number'),
   loadFive:DS.attr('number'),
   loadFive:DS.attr('number'),
   loadFifteen:DS.attr('number'),
   loadFifteen:DS.attr('number'),
+  memTotal:DS.attr('number'),
+  memFree:DS.attr('number'),
+  cpuSystem:DS.attr('number'),
+  cpuUser:DS.attr('number'),
+
+  cpuUsage: function () {
+    if (this.get('cpuSystem') && this.get('cpu_user')) {
+      return (this.get('cpuSystem') + this.get('cpu_user')).toFixed(1);
+    }
+  }.property('cpuSystem', 'cpuUser'),
+
+  memoryUsage: function () {
+    if (this.get('memFree') && this.get('memTotal')) {
+      var memUsed = this.get('memTotal') - this.get('memFree');
+      var memUsedPercent = (100 * memUsed) / this.get('memTotal');
+      return memUsedPercent.toFixed(1);
+    }
+  }.property('memTotal', 'memFree'),
 
 
   criticalAlertsCount: function () {
   criticalAlertsCount: function () {
     return App.router.get('clusterController.alerts').filterProperty('hostName', this.get('hostName')).filterProperty('isOk', false).filterProperty('ignoredForHosts', false).length;
     return App.router.get('clusterController.alerts').filterProperty('hostName', this.get('hostName')).filterProperty('isOk', false).filterProperty('ignoredForHosts', false).length;

+ 3 - 1
ambari-web/app/routes/add_host_routes.js

@@ -297,7 +297,9 @@ module.exports = Em.Route.extend({
     back: Em.Router.transitionTo('step5'),
     back: Em.Router.transitionTo('step5'),
     complete: function (router, context) {
     complete: function (router, context) {
       var addHostController = router.get('addHostController');
       var addHostController = router.get('addHostController');
-      var hostsUrl = '/hosts?fields=Hosts/host_name,Hosts/public_host_name,Hosts/cpu_count,Hosts/total_mem,Hosts/host_status,Hosts/last_heartbeat_time,Hosts/os_arch,Hosts/os_type,Hosts/ip,host_components,metrics/disk,metrics/load/load_one';
+      var hostsUrl = '/hosts?fields=Hosts/host_name,Hosts/public_host_name,Hosts/cpu_count,Hosts/total_mem,' +
+        'Hosts/host_status,Hosts/last_heartbeat_time,Hosts/os_arch,Hosts/os_type,Hosts/ip,host_components,' +
+        'metrics/disk,metrics/load/load_one,metrics/cpu/cpu_system,metrics/cpu/cpu_user,metrics/memory/mem_total,metrics/memory/mem_free';
       router.get('clusterController').requestHosts(hostsUrl, function () {
       router.get('clusterController').requestHosts(hostsUrl, function () {
         console.log('Request for hosts, with immutable parameters')
         console.log('Request for hosts, with immutable parameters')
       });
       });