From b61f590dcb4da2da2ea37504be29f3aa4bf30ae3 Mon Sep 17 00:00:00 2001 From: zhangsan Date: Tue, 19 Sep 2017 18:30:54 +0800 Subject: [PATCH] The commit code in ClusterZKDataMonitor's 'process' method,fixed the collector online/offline bug. By 'client.getChildren\(event.getPath\(\), true\);', collector can't get the deleted node. In fact,ClusterZKDataMonitor listening zookeeper 'onNodeChanged' event by use 'if \(listeners.containsKey\(event.getPath\(\)\)\)'. --- .../zookeeper/ClusterZKDataMonitor.java | 24 +++++++++++++------ 1 file changed, 17 insertions(+), 7 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 7162adf97..b59482325 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 @@ -4,6 +4,8 @@ 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; @@ -46,22 +48,30 @@ public class ClusterZKDataMonitor implements DataMonitor, Watcher { List paths; try { paths = client.getChildren(event.getPath(), true); + ClusterDataListener listener = listeners.get(event.getPath()); + Set remoteNodes = new HashSet(); + Set notifiedNodes = listener.getAddresses(); if (CollectionUtils.isNotEmpty(paths)) { for (String serverPath : paths) { Stat stat = new Stat(); byte[] data = client.getData(event.getPath() + "/" + serverPath, true, stat); String dataStr = new String(data); - if (stat.getCzxid() == stat.getMzxid()) { + String addressValue = serverPath + dataStr; + remoteNodes.add(addressValue); + if (!notifiedNodes.contains(addressValue)) { logger.info("path children has been created, path: {}, data: {}", event.getPath() + "/" + serverPath, dataStr); - listeners.get(event.getPath()).addAddress(serverPath + dataStr); - listeners.get(event.getPath()).serverJoinNotify(serverPath + dataStr); - } else { - logger.info("path children has been changed, path: {}, data: {}", event.getPath() + "/" + serverPath, dataStr); - listeners.get(event.getPath()).removeAddress(serverPath + dataStr); - listeners.get(event.getPath()).serverQuitNotify(serverPath + dataStr); + listener.addAddress(addressValue); + listener.serverJoinNotify(addressValue); } } } + for (String address : notifiedNodes) { + if (remoteNodes.isEmpty() || !remoteNodes.contains(address)) { + logger.info("path children has been changed, path and data: {}", event.getPath() + "/" + address); + listener.removeAddress(address); + listener.serverQuitNotify(address); + } + } } catch (ZookeeperClientException e) { logger.error(e.getMessage(), e); }