From 5609ef2996fd0bf729c0a8f9d06de38aa3f71111 Mon Sep 17 00:00:00 2001 From: peng-yongsheng <8082209@qq.com> Date: Wed, 27 Sep 2017 18:02:25 +0800 Subject: [PATCH] fixed #469 because of remove the collection item action inside of collection for each action. --- .../cluster/zookeeper/ClusterZKDataMonitor.java | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/apm-collector/apm-collector-cluster/src/main/java/org/skywalking/apm/collector/cluster/zookeeper/ClusterZKDataMonitor.java b/apm-collector/apm-collector-cluster/src/main/java/org/skywalking/apm/collector/cluster/zookeeper/ClusterZKDataMonitor.java index b594823254..c209852e0c 100644 --- a/apm-collector/apm-collector-cluster/src/main/java/org/skywalking/apm/collector/cluster/zookeeper/ClusterZKDataMonitor.java +++ b/apm-collector/apm-collector-cluster/src/main/java/org/skywalking/apm/collector/cluster/zookeeper/ClusterZKDataMonitor.java @@ -1,11 +1,11 @@ package org.skywalking.apm.collector.cluster.zookeeper; +import java.util.HashSet; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Set; -import java.util.HashSet; import org.apache.zookeeper.CreateMode; import org.apache.zookeeper.WatchedEvent; import org.apache.zookeeper.Watcher; @@ -42,14 +42,14 @@ public class ClusterZKDataMonitor implements DataMonitor, Watcher { registrations = new LinkedHashMap<>(); } - @Override public void process(WatchedEvent event) { + @Override public synchronized void process(WatchedEvent event) { logger.info("changed path {}, event type: {}", event.getPath(), event.getType().name()); if (listeners.containsKey(event.getPath())) { List paths; try { paths = client.getChildren(event.getPath(), true); ClusterDataListener listener = listeners.get(event.getPath()); - Set remoteNodes = new HashSet(); + Set remoteNodes = new HashSet<>(); Set notifiedNodes = listener.getAddresses(); if (CollectionUtils.isNotEmpty(paths)) { for (String serverPath : paths) { @@ -65,9 +65,12 @@ public class ClusterZKDataMonitor implements DataMonitor, Watcher { } } } - for (String address : notifiedNodes) { + + String[] notifiedNodeArray = notifiedNodes.toArray(new String[notifiedNodes.size()]); + for (int i = notifiedNodeArray.length - 1; i >= 0; i--) { + String address = notifiedNodeArray[i]; if (remoteNodes.isEmpty() || !remoteNodes.contains(address)) { - logger.info("path children has been changed, path and data: {}", event.getPath() + "/" + address); + logger.info("path children has been remove, path and data: {}", event.getPath() + "/" + address); listener.removeAddress(address); listener.serverQuitNotify(address); } -- GitLab