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/01 16:41:49 UTC
[12/39] ambari git commit: AMBARI-14829 Memory leak on Alerts page.
(ababiichuk)
AMBARI-14829 Memory leak on Alerts page. (ababiichuk)
Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/f10d41cc
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/f10d41cc
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/f10d41cc
Branch: refs/heads/branch-dev-patch-upgrade
Commit: f10d41ccbc935cdad2627f51a7b3ddba38190abf
Parents: d057581
Author: ababiichuk <ab...@hortonworks.com>
Authored: Thu Jan 28 16:01:19 2016 +0200
Committer: ababiichuk <ab...@hortonworks.com>
Committed: Thu Jan 28 16:01:19 2016 +0200
----------------------------------------------------------------------
.../main/alert_definitions_controller.js | 41 ++++++++++++
.../mappers/alert_definition_summary_mapper.js | 8 ++-
.../app/models/alerts/alert_definition.js | 1 +
ambari-web/app/templates/main/alerts.hbs | 32 ++--------
.../alert_definition/alert_definition_state.hbs | 31 ++++++++++
.../alert_definition_summary.hbs | 28 +++++++++
ambari-web/app/utils/ember_reopen.js | 14 +++++
ambari-web/app/views.js | 2 +
ambari-web/app/views/common/sort_view.js | 19 +++++-
.../app/views/main/alert_definitions_view.js | 23 +------
.../alert_definition/alert_definition_state.js | 34 ++++++++++
.../alert_definition_summary.js | 65 ++++++++++++++++++++
12 files changed, 245 insertions(+), 53 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ambari/blob/f10d41cc/ambari-web/app/controllers/main/alert_definitions_controller.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/controllers/main/alert_definitions_controller.js b/ambari-web/app/controllers/main/alert_definitions_controller.js
index 58eecf5..0cfff21 100644
--- a/ambari-web/app/controllers/main/alert_definitions_controller.js
+++ b/ambari-web/app/controllers/main/alert_definitions_controller.js
@@ -28,6 +28,8 @@ App.MainAlertDefinitionsController = Em.ArrayController.extend({
*/
showFilterConditionsFirstLoad: false,
+ contentUpdater: null,
+
/**
* List of all <code>App.AlertDefinition</code>
* @type {App.AlertDefinition[]}
@@ -35,6 +37,45 @@ App.MainAlertDefinitionsController = Em.ArrayController.extend({
content: App.AlertDefinition.find(),
/**
+ * Generates key for alert summary that represents current state
+ */
+ getSummaryCache: function () {
+ var res = '';
+ this.get('content').forEach(function(o) {
+ var summary = o.get('summary');
+ o.get('order').forEach(function (state) {
+ res += summary[state] ? summary[state].count + summary[state].maintenanceCount : 0;
+ });
+ });
+
+ return res;
+ },
+
+ generateCacheByKey: function(key) {
+ if (key === 'summary') {
+ return this.getSummaryCache();
+ }
+
+ return this.get('content').mapProperty(key).join('');
+ },
+
+ contentWasChanged: function(key) {
+ var updatedCache = this.generateCacheByKey(key);
+ if (this.get('cache.' + key) !== updatedCache) {
+ this.set('cache.' + key, updatedCache);
+ this.propertyDidChange('contentUpdater');
+ }
+ },
+
+ cache: {
+ 'label': '',
+ 'summary': '',
+ 'serviceName': '',
+ 'lastTriggered': '',
+ 'enabled': ''
+ },
+
+ /**
* Enable/disable alertDefinition confirmation popup
* @param {object} event
* @method toggleState
http://git-wip-us.apache.org/repos/asf/ambari/blob/f10d41cc/ambari-web/app/mappers/alert_definition_summary_mapper.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/mappers/alert_definition_summary_mapper.js b/ambari-web/app/mappers/alert_definition_summary_mapper.js
index 3977518..69f1b16 100644
--- a/ambari-web/app/mappers/alert_definition_summary_mapper.js
+++ b/ambari-web/app/mappers/alert_definition_summary_mapper.js
@@ -56,6 +56,9 @@ App.alertDefinitionSummaryMapper = App.QuickDataMapper.create({
alertDefinitions.forEach(function (d) {
var id = d.get('id');
+ if ((alertDefinitionsMap[id].get('stateManager.currentState.name') !== 'saved')) {
+ alertDefinitionsMap[id].get('stateManager').transitionTo('saved');
+ }
alertDefinitionsMap[id].setProperties(summaryMap[id]);
if (!alertDefinitionsMap[id].get('enabled')) {
// clear summary for disabled alert definitions
@@ -89,7 +92,10 @@ App.alertDefinitionSummaryMapper = App.QuickDataMapper.create({
});
}
});
-
+ if (!$.mocho) {
+ //for some reasons this causing error in unit test
+ App.store.commit();
+ }
console.timeEnd('App.alertDefinitionSummaryMapper execution time');
}
http://git-wip-us.apache.org/repos/asf/ambari/blob/f10d41cc/ambari-web/app/models/alerts/alert_definition.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/models/alerts/alert_definition.js b/ambari-web/app/models/alerts/alert_definition.js
index b33cc91..3f59e86 100644
--- a/ambari-web/app/models/alerts/alert_definition.js
+++ b/ambari-web/app/models/alerts/alert_definition.js
@@ -345,3 +345,4 @@ App.AlertDefinition.FIXTURES = [];
App.AlertReportDefinition.FIXTURES = [];
App.AlertMetricsSourceDefinition.FIXTURES = [];
App.AlertMetricsUriDefinition.FIXTURES = [];
+App.AlertDefinitionParameter.FIXTURES = [];
http://git-wip-us.apache.org/repos/asf/ambari/blob/f10d41cc/ambari-web/app/templates/main/alerts.hbs
----------------------------------------------------------------------
diff --git a/ambari-web/app/templates/main/alerts.hbs b/ambari-web/app/templates/main/alerts.hbs
index 40bac06..8a27056 100644
--- a/ambari-web/app/templates/main/alerts.hbs
+++ b/ambari-web/app/templates/main/alerts.hbs
@@ -57,39 +57,15 @@
<span {{bindAttr title="alertDefinition.type"}} {{bindAttr class=":type-icon alertDefinition.typeIconClass"}}></span>
<a href="#" {{action "gotoAlertDetails" alertDefinition}}>{{alertDefinition.label}}</a>
</td>
- <td class="alert-status">{{{alertDefinition.status}}}</td>
+ <td class="alert-status">
+ {{view App.AlertDefinitionSummary contentBinding="alertDefinition"}}
+ </td>
<td class="alert-service">{{alertDefinition.serviceDisplayName}}</td>
<td class="alert-time">
<time class="timeago" {{bindAttr data-original-title="alertDefinition.lastTriggeredFormatted"}}>{{alertDefinition.lastTriggeredAgoFormatted}}</time>
</td>
<td class="last toggle-state-button alert-state">
- {{#if alertDefinition.enabled not=true}}
- {{#isAuthorized "CLUSTER.TOGGLE_ALERTS"}}
- <a href="#" {{action "toggleState" alertDefinition target="controller"}} {{bindAttr class="alertDefinition.enabled:alert-definition-enable:alert-definition-disable"}}>
- <span class="enable-disable-button" {{bindAttr data-original-title="view.enabledTooltip"}}>
- {{view.enabledDisplay}}
- </span>
- </a>
- {{/isAuthorized}}
- {{#isNotAuthorized "CLUSTER.TOGGLE_ALERTS"}}
- <span {{bindAttr class="alertDefinition.enabled:alert-definition-enable:alert-definition-disable"}}>
- {{view.enabledDisplay}}
- </span>
- {{/isNotAuthorized}}
- {{else}}
- {{#isAuthorized "CLUSTER.TOGGLE_ALERTS"}}
- <a href="#" {{action "toggleState" alertDefinition target="controller"}} {{bindAttr class="alertDefinition.enabled:alert-definition-enable:alert-definition-disable"}}>
- <span class="enable-disable-button" {{bindAttr data-original-title="view.disabledTooltip"}}>
- {{view.disabledDisplay}}
- </span>
- </a>
- {{/isAuthorized}}
- {{#isNotAuthorized "CLUSTER.TOGGLE_ALERTS"}}
- <span {{bindAttr class="alertDefinition.enabled:alert-definition-enable:alert-definition-disable"}}>
- {{view.disabledDisplay}}
- </span>
- {{/isNotAuthorized}}
- {{/if}}
+ {{view App.AlertDefinitionState contentBinding="alertDefinition"}}
</td>
</tr>
{{/each}}
http://git-wip-us.apache.org/repos/asf/ambari/blob/f10d41cc/ambari-web/app/templates/main/alerts/alert_definition/alert_definition_state.hbs
----------------------------------------------------------------------
diff --git a/ambari-web/app/templates/main/alerts/alert_definition/alert_definition_state.hbs b/ambari-web/app/templates/main/alerts/alert_definition/alert_definition_state.hbs
new file mode 100644
index 0000000..ebc5c04
--- /dev/null
+++ b/ambari-web/app/templates/main/alerts/alert_definition/alert_definition_state.hbs
@@ -0,0 +1,31 @@
+{{!
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+}}
+
+{{#isAuthorized "CLUSTER.TOGGLE_ALERTS"}}
+ <a href="#" {{action "toggleState" view.content target="controller"}}
+ {{bindAttr class="view.content.enabled:alert-definition-enable:alert-definition-disable"}}>
+ <span class="enable-disable-button" {{bindAttr data-original-title="view.tooltipText"}}>
+ {{view.labelText}}
+ </span>
+ </a>
+{{/isAuthorized}}
+{{#isNotAuthorized "CLUSTER.TOGGLE_ALERTS"}}
+ <span {{bindAttr class="view.content.enabled:alert-definition-enable:alert-definition-disable"}}>
+ {{view.labelText}}
+ </span>
+{{/isNotAuthorized}}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ambari/blob/f10d41cc/ambari-web/app/templates/main/alerts/alert_definition/alert_definition_summary.hbs
----------------------------------------------------------------------
diff --git a/ambari-web/app/templates/main/alerts/alert_definition/alert_definition_summary.hbs b/ambari-web/app/templates/main/alerts/alert_definition/alert_definition_summary.hbs
new file mode 100644
index 0000000..930d440
--- /dev/null
+++ b/ambari-web/app/templates/main/alerts/alert_definition/alert_definition_summary.hbs
@@ -0,0 +1,28 @@
+{{!
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+}}
+
+{{#if view.hostCount}}
+ {{#each state in view.states}}
+ <span {{bindAttr class=":alert-state-single-host :label state.stateClass"}}>
+ {{#if state.isMaintenance}}<span class="icon-medkit"></span>{{/if}}
+ {{state.shortStateWithCounter}}
+ </span>
+ {{/each}}
+{{else}}
+ <span class="alert-state-single-host label alert-state-PENDING">NONE</span>
+{{/if}}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ambari/blob/f10d41cc/ambari-web/app/utils/ember_reopen.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/utils/ember_reopen.js b/ambari-web/app/utils/ember_reopen.js
index 0eefb97..512b3da 100644
--- a/ambari-web/app/utils/ember_reopen.js
+++ b/ambari-web/app/utils/ember_reopen.js
@@ -224,6 +224,20 @@ Em.View.reopen({
}
});
+Ember._HandlebarsBoundView.reopen({
+ /**
+ * overwritten set method of Ember._HandlebarsBoundView to avoid uncaught errors
+ * when trying to set property of destroyed view
+ */
+ render: function(buffer){
+ if(!this.get('isDestroyed') && !this.get('isDestroying')){
+ this._super(buffer);
+ } else {
+ console.debug('Calling set on destroyed view');
+ }
+ }
+});
+
Ember.TextArea.reopen({
attributeBindings: ['readonly']
});
http://git-wip-us.apache.org/repos/asf/ambari/blob/f10d41cc/ambari-web/app/views.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/views.js b/ambari-web/app/views.js
index 78b79b4..d3c7fdc 100644
--- a/ambari-web/app/views.js
+++ b/ambari-web/app/views.js
@@ -95,6 +95,8 @@ require('views/login');
require('views/main');
require('views/main/menu');
require('views/main/alert_definitions_view');
+require('views/main/alerts/alert_definition/alert_definition_summary');
+require('views/main/alerts/alert_definition/alert_definition_state');
require('views/main/alerts/definition_details_view');
require('views/main/alerts/alert_definitions_actions_view');
require('views/main/alerts/definition_configs_view');
http://git-wip-us.apache.org/repos/asf/ambari/blob/f10d41cc/ambari-web/app/views/common/sort_view.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/views/common/sort_view.js b/ambari-web/app/views/common/sort_view.js
index 08471dd..011ddfc 100644
--- a/ambari-web/app/views/common/sort_view.js
+++ b/ambari-web/app/views/common/sort_view.js
@@ -119,7 +119,7 @@ var wrapperView = Em.View.extend({
}
}, this);
}
- }.observes('content.length'),
+ }.observes('controller.contentUpdater'),
/**
* reset all sorts fields
@@ -186,11 +186,24 @@ var wrapperView = Em.View.extend({
},
/**
+ * method that runs <code>contentWasChanged<code>
+ *
+ * @method onContentChangeOnce
+ */
+ onContentChangeOnce: function() {
+ var keys = arguments[1].match(/[a-zA-Z]+$/),
+ key = keys.length ? keys[0] : null;
+ if (key) {
+ Em.run.once(this.get('controller'), 'contentWasChanged', key);
+ }
+ },
+
+ /**
* Add observer for key to call <code>onContentChange</code>
* @param key
*/
addSortingObserver: function (key) {
- this.addObserver('content.@each.' + key, this, 'onContentChange');
+ this.addObserver('controller.content.@each.' + key, this, 'onContentChangeOnce');
},
/**
@@ -198,7 +211,7 @@ var wrapperView = Em.View.extend({
* @param key
*/
removeSortingObserver: function (key) {
- this.removeObserver('content.@each.' + key, this, 'onContentChange');
+ this.removeObserver('controller.content.@each.' + key, this, 'onContentChangeOnce');
},
willDestroyElement: function () {
http://git-wip-us.apache.org/repos/asf/ambari/blob/f10d41cc/ambari-web/app/views/main/alert_definitions_view.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/views/main/alert_definitions_view.js b/ambari-web/app/views/main/alert_definitions_view.js
index 8056347..b65b8cf 100644
--- a/ambari-web/app/views/main/alert_definitions_view.js
+++ b/ambari-web/app/views/main/alert_definitions_view.js
@@ -52,6 +52,7 @@ App.MainAlertDefinitionsView = App.TableView.extend({
},
willDestroyElement: function () {
+ $(".timeago").tooltip('destroy');
this.removeObserver('pageContent.length', this, 'tooltipsUpdater');
},
@@ -78,26 +79,6 @@ App.MainAlertDefinitionsView = App.TableView.extend({
colPropAssoc: ['', 'label', 'summary', 'serviceName', 'type', 'lastTriggered', 'enabled', 'groups'],
- /**
- * @type {string}
- */
- enabledTooltip: Em.I18n.t('alerts.table.state.enabled.tooltip'),
-
- /**
- * @type {string}
- */
- disabledTooltip: Em.I18n.t('alerts.table.state.disabled.tooltip'),
-
- /**
- * @type {string}
- */
- enabledDisplay: Em.I18n.t('alerts.table.state.enabled'),
-
- /**
- * @type {string}
- */
- disabledDisplay: Em.I18n.t('alerts.table.state.disabled'),
-
sortView: sort.wrapperView.extend({
didInsertElement: function () {
this._super();
@@ -500,7 +481,7 @@ App.MainAlertDefinitionsView = App.TableView.extend({
*/
tooltipsUpdater: function () {
Em.run.next(this, function () {
- App.tooltip($(".enable-disable-button, .timeago"));
+ App.tooltip($(".timeago"));
});
},
http://git-wip-us.apache.org/repos/asf/ambari/blob/f10d41cc/ambari-web/app/views/main/alerts/alert_definition/alert_definition_state.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/views/main/alerts/alert_definition/alert_definition_state.js b/ambari-web/app/views/main/alerts/alert_definition/alert_definition_state.js
new file mode 100644
index 0000000..e3d60a6
--- /dev/null
+++ b/ambari-web/app/views/main/alerts/alert_definition/alert_definition_state.js
@@ -0,0 +1,34 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+var App = require('app');
+
+App.AlertDefinitionState = Em.View.extend({
+
+ templateName: require('templates/main/alerts/alert_definition/alert_definition_state'),
+
+ labelText: Em.computed.ifThenElse('content.enabled', Em.I18n.t('alerts.table.state.enabled'), Em.I18n.t('alerts.table.state.disabled')),
+
+ tooltipText: Em.computed.ifThenElse('content.enabled', Em.I18n.t('alerts.table.state.enabled.tooltip'), Em.I18n.t('alerts.table.state.disabled.tooltip')),
+
+ didInsertElement: function () {
+ App.tooltip(this.$(".enable-disable-button"));
+ },
+ willDestroyElement:function () {
+ this.$(".enable-disable-button").tooltip('destroy');
+ }
+});
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ambari/blob/f10d41cc/ambari-web/app/views/main/alerts/alert_definition/alert_definition_summary.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/views/main/alerts/alert_definition/alert_definition_summary.js b/ambari-web/app/views/main/alerts/alert_definition/alert_definition_summary.js
new file mode 100644
index 0000000..ecf262c
--- /dev/null
+++ b/ambari-web/app/views/main/alerts/alert_definition/alert_definition_summary.js
@@ -0,0 +1,65 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+var App = require('app');
+
+App.AlertDefinitionSummary = Em.View.extend({
+
+ templateName: require('templates/main/alerts/alert_definition/alert_definition_summary'),
+
+ didInsertElement: function() {
+ this.stateObserver();
+ },
+
+ hostCount: 0,
+ states: [],
+
+ stateObserver: function () {
+ var order = this.get('content.order'),
+ summary = this.get('content.summary'),
+ shortState = this.get('content.shortState');
+
+ var hostCnt = 0;
+ order.forEach(function (state) {
+ hostCnt += summary[state] ? summary[state].count + summary[state].maintenanceCount : 0;
+ });
+ var states = [];
+ if (hostCnt) {
+ order.forEach(function (state) {
+ if (summary[state]) {
+ if (summary[state].count) {
+ states.push({
+ 'shortStateWithCounter': shortState[state] + (summary[state].count > 1 ? ' (' + summary[state].count + ')' : ''),
+ 'isMaintenance': false,
+ 'stateClass': 'alert-state-' + state
+ });
+ }
+ if (summary[state].maintenanceCount) {
+ states.push({
+ 'shortStateWithCounter': shortState[state] + (summary[state].maintenanceCount > 1 ? ' (' + summary[state].maintenanceCount + ')' : ''),
+ 'isMaintenance': true,
+ 'stateClass': 'alert-state-PENDING'
+ });
+ }
+ }
+ }, this);
+ }
+ this.set('hostCount', hostCnt);
+ this.set('states', states);
+ }.observes('content.summary')
+
+});
\ No newline at end of file