Repository: ambari
Updated Branches:
  refs/heads/branch-3.0-perf e63562095 -> 0045c04b4


AMBARI-22733. UI receives a topology event when turning on/off maintenance mode 
for the host. (mpapirkovskyy)


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

Branch: refs/heads/branch-3.0-perf
Commit: 086bad4bc74f85b3288d1bf03c3a8a3bfcc60de0
Parents: e635620
Author: Myroslav Papirkovskyi <[email protected]>
Authored: Thu Nov 2 15:48:59 2017 +0200
Committer: Myroslav Papirkovskyi <[email protected]>
Committed: Fri Jan 5 19:12:52 2018 +0200

----------------------------------------------------------------------
 .../server/agent/stomp/TopologyHolder.java      |  9 ++--
 .../server/agent/stomp/dto/TopologyCluster.java | 30 ++++++++------
 .../agent/stomp/dto/TopologyComponent.java      | 43 +++++++++++++++-----
 .../server/agent/stomp/dto/TopologyHost.java    | 13 ++++--
 4 files changed, 65 insertions(+), 30 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/086bad4b/ambari-server/src/main/java/org/apache/ambari/server/agent/stomp/TopologyHolder.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/agent/stomp/TopologyHolder.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/agent/stomp/TopologyHolder.java
index 55c0150..50ef15a 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/agent/stomp/TopologyHolder.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/agent/stomp/TopologyHolder.java
@@ -143,9 +143,12 @@ public class TopologyHolder extends 
AgentClusterDataHolder<TopologyUpdateEvent>
           getData().getClusters().remove(clusterId);
           changed = true;
         } else {
-          
getData().getClusters().get(clusterId).update(update.getClusters().get(clusterId).getTopologyComponents(),
-              update.getClusters().get(clusterId).getTopologyHosts(), 
eventType);
-          changed = true; // TODO check if really changed
+          if (getData().getClusters().get(clusterId).update(
+              update.getClusters().get(clusterId).getTopologyComponents(),
+              update.getClusters().get(clusterId).getTopologyHosts(),
+              eventType)) {
+            changed = true;
+          }
         }
       } else {
         if (eventType.equals(TopologyUpdateEvent.EventType.UPDATE)) {

http://git-wip-us.apache.org/repos/asf/ambari/blob/086bad4b/ambari-server/src/main/java/org/apache/ambari/server/agent/stomp/dto/TopologyCluster.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/agent/stomp/dto/TopologyCluster.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/agent/stomp/dto/TopologyCluster.java
index c17ec7f..4c6cb74 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/agent/stomp/dto/TopologyCluster.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/agent/stomp/dto/TopologyCluster.java
@@ -43,46 +43,52 @@ public class TopologyCluster {
     this.topologyHosts = topologyHosts;
   }
 
-  public void update(Set<TopologyComponent> componentsToUpdate, 
Set<TopologyHost> hostsToUpdate,
+  public boolean update(Set<TopologyComponent> componentsToUpdate, 
Set<TopologyHost> hostsToUpdate,
                      TopologyUpdateEvent.EventType eventType) {
+    boolean changed = false;
     for (TopologyComponent componentToUpdate : componentsToUpdate) {
-      boolean updated = false;
-      for (Iterator<TopologyComponent> iter = 
getTopologyComponents().iterator(); iter.hasNext() && !updated; ) {
+      boolean isPresent = false;
+      for (Iterator<TopologyComponent> iter = 
getTopologyComponents().iterator(); iter.hasNext() && !isPresent; ) {
         TopologyComponent existsComponent = iter.next();
         if (existsComponent.equals(componentToUpdate)) {
           if (eventType.equals(TopologyUpdateEvent.EventType.DELETE)) {
             if (SetUtils.isEqualSet(existsComponent.getHostIds(), 
componentToUpdate.getHostIds())) {
               iter.remove();
+              changed = true;
             } else {
-              existsComponent.removeComponent(componentToUpdate);
+              changed |= existsComponent.removeComponent(componentToUpdate);
             }
           } else {
-            existsComponent.updateComponent(componentToUpdate);
+            changed |= existsComponent.updateComponent(componentToUpdate);
           }
-          updated = true;
+          isPresent = true;
         }
       }
-      if (!updated && eventType.equals(TopologyUpdateEvent.EventType.UPDATE)) {
+      if (!isPresent && 
eventType.equals(TopologyUpdateEvent.EventType.UPDATE)) {
         getTopologyComponents().add(componentToUpdate);
+        changed = true;
       }
     }
     for (TopologyHost hostToUpdate : hostsToUpdate) {
-      boolean updated = false;
-      for (Iterator<TopologyHost> iter = getTopologyHosts().iterator(); 
iter.hasNext() && !updated; ) {
+      boolean isPresent = false;
+      for (Iterator<TopologyHost> iter = getTopologyHosts().iterator(); 
iter.hasNext() && !isPresent; ) {
         TopologyHost existsHost = iter.next();
         if (existsHost.equals(hostToUpdate)) {
           if (eventType.equals(TopologyUpdateEvent.EventType.DELETE)) {
             iter.remove();
+            changed = true;
           } else {
-            existsHost.updateHost(hostToUpdate);
+            changed |= existsHost.updateHost(hostToUpdate);
           }
-          updated = true;
+          isPresent = true;
         }
       }
-      if (!updated && eventType.equals(TopologyUpdateEvent.EventType.UPDATE)) {
+      if (!isPresent && 
eventType.equals(TopologyUpdateEvent.EventType.UPDATE)) {
         getTopologyHosts().add(hostToUpdate);
+        changed = true;
       }
     }
+    return changed;
   }
 
   public Set<TopologyComponent> getTopologyComponents() {

http://git-wip-us.apache.org/repos/asf/ambari/blob/086bad4b/ambari-server/src/main/java/org/apache/ambari/server/agent/stomp/dto/TopologyComponent.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/agent/stomp/dto/TopologyComponent.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/agent/stomp/dto/TopologyComponent.java
index d96180d..9708b56 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/agent/stomp/dto/TopologyComponent.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/agent/stomp/dto/TopologyComponent.java
@@ -19,6 +19,7 @@
 package org.apache.ambari.server.agent.stomp.dto;
 
 import java.util.HashSet;
+import java.util.Map;
 import java.util.Set;
 import java.util.TreeMap;
 
@@ -102,57 +103,77 @@ public class TopologyComponent {
     }
   }
 
-  public void updateComponent(TopologyComponent componentToUpdate) {
+  public boolean updateComponent(TopologyComponent componentToUpdate) {
+    boolean changed = false;
     //TODO will be a need to change to multi-instance usage
     if (componentToUpdate.getComponentName().equals(getComponentName())) {
-      if (StringUtils.isNotEmpty(componentToUpdate.getVersion())) {
+      if (StringUtils.isNotEmpty(componentToUpdate.getVersion()) && 
!componentToUpdate.getVersion().equals(getVersion())) {
         setVersion(componentToUpdate.getVersion());
+        changed = true;
       }
       if (CollectionUtils.isNotEmpty(componentToUpdate.getHostIds())) {
         if (hostIds == null) {
           hostIds = new HashSet<>();
         }
-        hostIds.addAll(componentToUpdate.getHostIds());
+        changed |= hostIds.addAll(componentToUpdate.getHostIds());
       }
       if (CollectionUtils.isNotEmpty(componentToUpdate.getHostNames())) {
         if (hostNames == null) {
           hostNames = new HashSet<>();
         }
-        hostNames.addAll(componentToUpdate.getHostNames());
+        changed |= hostNames.addAll(componentToUpdate.getHostNames());
       }
       if (CollectionUtils.isNotEmpty(componentToUpdate.getPublicHostNames())) {
         if (publicHostNames == null) {
           publicHostNames = new HashSet<>();
         }
-        publicHostNames.addAll(componentToUpdate.getPublicHostNames());
+        changed |= 
publicHostNames.addAll(componentToUpdate.getPublicHostNames());
       }
-      if (MapUtils.isNotEmpty(componentToUpdate.getComponentLevelParams())) {
-        
componentLevelParams.putAll(componentToUpdate.getComponentLevelParams());
-      }
-      if (MapUtils.isNotEmpty(componentToUpdate.getCommandParams())) {
-        commandParams.putAll(componentToUpdate.getCommandParams());
+      changed |= mergeParams(componentLevelParams, 
componentToUpdate.getComponentLevelParams());
+      changed |= mergeParams(commandParams, 
componentToUpdate.getCommandParams());
+    }
+    return changed;
+  }
+
+  private boolean mergeParams(TreeMap<String, String> currentParams, 
TreeMap<String, String> updateParams) {
+    boolean changed = false;
+    if (MapUtils.isNotEmpty(updateParams)) {
+      for (Map.Entry<String, String> updateParam : updateParams.entrySet()) {
+        String updateParamName = updateParam.getKey();
+        String updateParamValue = updateParam.getValue();
+        if (!currentParams.containsKey(updateParamName) ||
+            !StringUtils.equals(currentParams.get(updateParamName), 
updateParamValue)) {
+          currentParams.put(updateParamName, updateParamValue);
+          changed = true;
+        }
       }
     }
+    return changed;
   }
 
-  public void removeComponent(TopologyComponent componentToRemove) {
+  public boolean removeComponent(TopologyComponent componentToRemove) {
+    boolean changed = false;
     if (componentToRemove.getComponentName().equals(getComponentName())) {
       if (CollectionUtils.isNotEmpty(componentToRemove.getHostIds())) {
         if (hostIds != null) {
           hostIds.removeAll(componentToRemove.getHostIds());
+          changed = true;
         }
       }
       if (CollectionUtils.isNotEmpty(componentToRemove.getHostNames())) {
         if (hostNames != null) {
           hostNames.removeAll(componentToRemove.getHostNames());
+          changed = true;
         }
       }
       if (CollectionUtils.isNotEmpty(componentToRemove.getPublicHostNames())) {
         if (publicHostNames != null) {
           publicHostNames.removeAll(componentToRemove.getPublicHostNames());
+          changed = true;
         }
       }
     }
+    return changed;
   }
 
   public  TopologyComponent deepCopy() {

http://git-wip-us.apache.org/repos/asf/ambari/blob/086bad4b/ambari-server/src/main/java/org/apache/ambari/server/agent/stomp/dto/TopologyHost.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/agent/stomp/dto/TopologyHost.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/agent/stomp/dto/TopologyHost.java
index 9cdf944..0e9a418 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/agent/stomp/dto/TopologyHost.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/agent/stomp/dto/TopologyHost.java
@@ -42,18 +42,23 @@ public class TopologyHost {
     this.ipv4 = ipv4;
   }
 
-  public void updateHost(TopologyHost hostToUpdate) {
+  public boolean updateHost(TopologyHost hostToUpdate) {
+    boolean changed = false;
     if (hostToUpdate.getHostId().equals(getHostId())) {
-      if (StringUtils.isNotEmpty(hostToUpdate.getHostName())) {
+      if (StringUtils.isNotEmpty(hostToUpdate.getHostName()) && 
!hostToUpdate.getHostName().equals(getHostName())) {
         setHostName(hostToUpdate.getHostName());
+        changed = true;
       }
-      if (StringUtils.isNotEmpty(hostToUpdate.getRackName())) {
+      if (StringUtils.isNotEmpty(hostToUpdate.getRackName()) && 
!hostToUpdate.getRackName().equals(getRackName())) {
         setRackName(hostToUpdate.getRackName());
+        changed = true;
       }
-      if (StringUtils.isNotEmpty(hostToUpdate.getIpv4())) {
+      if (StringUtils.isNotEmpty(hostToUpdate.getIpv4()) && 
!hostToUpdate.getIpv4().equals(getIpv4())) {
         setIpv4(hostToUpdate.getIpv4());
+        changed = true;
       }
     }
+    return changed;
   }
 
   public TopologyHost deepCopy() {

Reply via email to