From 68365effb8faa2b07a0d7f72351b6b39a22cb528 Mon Sep 17 00:00:00 2001 From: Michael Abashian Date: Thu, 2 Jun 2016 16:15:38 -0400 Subject: [PATCH 1/2] Remove event socket listeners when the scope that created them is destroyed. This should fix #2121 where an existing jobs standard out was erroneously being updated after a new job launch. --- .../src/job-detail/job-detail.controller.js | 5 ++++ awx/ui/client/src/shared/Socket.js | 10 +++++++- .../log/standard-out-log.controller.js | 25 +++++++++++++------ 3 files changed, 31 insertions(+), 9 deletions(-) diff --git a/awx/ui/client/src/job-detail/job-detail.controller.js b/awx/ui/client/src/job-detail/job-detail.controller.js index 39ab297054..d304dc3e35 100644 --- a/awx/ui/client/src/job-detail/job-detail.controller.js +++ b/awx/ui/client/src/job-detail/job-detail.controller.js @@ -207,6 +207,11 @@ export default } UpdateDOM({ scope: scope }); }); + // Unbind $rootScope socket event binding(s) so that they don't get triggered + // in another instance of this controller + scope.$on('$destroy', function() { + $rootScope.event_socket.removeAllListeners("job_events-" + job_id); + }); } openSocket(); diff --git a/awx/ui/client/src/shared/Socket.js b/awx/ui/client/src/shared/Socket.js index bf725c5321..36de48f539 100644 --- a/awx/ui/client/src/shared/Socket.js +++ b/awx/ui/client/src/shared/Socket.js @@ -211,7 +211,15 @@ angular.module('SocketIO', ['Utilities']) }, getUrl: function() { return url; - } + }, + removeAllListeners: function (eventName) { + var self = this; + if(self){ + if(self.socket){ + self.socket.removeAllListeners(eventName); + } + } + }, }; }; }]); diff --git a/awx/ui/client/src/standard-out/log/standard-out-log.controller.js b/awx/ui/client/src/standard-out/log/standard-out-log.controller.js index 8973a515aa..be424f04a1 100644 --- a/awx/ui/client/src/standard-out/log/standard-out-log.controller.js +++ b/awx/ui/client/src/standard-out/log/standard-out-log.controller.js @@ -21,13 +21,18 @@ export default ['$log', '$rootScope', '$scope', '$state', '$stateParams', 'Proce // Open up a socket for events depending on the type of job function openSockets() { if ($state.current.name === 'jobDetail') { - $log.debug("socket watching on job_events-" + job_id); - $rootScope.event_socket.on("job_events-" + job_id, function() { - $log.debug("socket fired on job_events-" + job_id); - if (api_complete) { - event_queue++; - } - }); + $log.debug("socket watching on job_events-" + job_id); + $rootScope.event_socket.on("job_events-" + job_id, function() { + $log.debug("socket fired on job_events-" + job_id); + if (api_complete) { + event_queue++; + } + }); + // Unbind $rootScope socket event binding(s) so that they don't get triggered + // in another instance of this controller + $scope.$on('$destroy', function() { + $rootScope.event_socket.removeAllListeners("job_events-" + job_id); + }); } if ($state.current.name === 'adHocJobStdout') { $log.debug("socket watching on ad_hoc_command_events-" + job_id); @@ -37,8 +42,12 @@ export default ['$log', '$rootScope', '$scope', '$state', '$stateParams', 'Proce event_queue++; } }); + // Unbind $rootScope socket event binding(s) so that they don't get triggered + // in another instance of this controller + $scope.$on('$destroy', function() { + $rootScope.event_socket.removeAllListeners("ad_hoc_command_events-" + job_id); + }); } - // TODO: do we need to add socket listeners for scmUpdateStdout, inventorySyncStdout, managementJobStdout? } openSockets(); From b7b853055c03ed71abb595201b264e1a37284993 Mon Sep 17 00:00:00 2001 From: Michael Abashian Date: Fri, 3 Jun 2016 11:11:59 -0400 Subject: [PATCH 2/2] Need to remove listeners from $rootScope.adhoc_event_socket --- .../client/src/standard-out/log/standard-out-log.controller.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/awx/ui/client/src/standard-out/log/standard-out-log.controller.js b/awx/ui/client/src/standard-out/log/standard-out-log.controller.js index be424f04a1..32b55de80c 100644 --- a/awx/ui/client/src/standard-out/log/standard-out-log.controller.js +++ b/awx/ui/client/src/standard-out/log/standard-out-log.controller.js @@ -45,7 +45,7 @@ export default ['$log', '$rootScope', '$scope', '$state', '$stateParams', 'Proce // Unbind $rootScope socket event binding(s) so that they don't get triggered // in another instance of this controller $scope.$on('$destroy', function() { - $rootScope.event_socket.removeAllListeners("ad_hoc_command_events-" + job_id); + $rootScope.adhoc_event_socket.removeAllListeners("ad_hoc_command_events-" + job_id); }); } }