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() {
