From fd47fcb830bd7e9aa421c45eca5ff2b6df2ac4c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BD=AD=E5=8B=87=E5=8D=87=20pengys?= <8082209@qq.com> Date: Thu, 22 Nov 2018 22:28:36 +0800 Subject: [PATCH] Remote clients selector error: / by zero (#1949) * Fixed the bug of hash selector error cause of remote clients not build. #1948 * Fixed a style check error. --- .../remote/client/RemoteClientManager.java | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/remote/client/RemoteClientManager.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/remote/client/RemoteClientManager.java index 7d78be0bf9..2510a11881 100644 --- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/remote/client/RemoteClientManager.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/remote/client/RemoteClientManager.java @@ -83,6 +83,7 @@ public class RemoteClientManager implements Service { } List instanceList = clusterNodesQuery.queryRemoteNodes(); + instanceList = distinct(instanceList); Collections.sort(instanceList); if (logger.isDebugEnabled()) { @@ -90,13 +91,50 @@ public class RemoteClientManager implements Service { } if (!compare(instanceList)) { + if (logger.isDebugEnabled()) { + logger.debug("ReBuilding remote clients."); + } reBuildRemoteClients(instanceList); } + + printRemoteClientList(); } catch (Throwable t) { logger.error(t.getMessage(), t); } } + /** + * Print the client list into log for confirm how many clients built. + */ + private void printRemoteClientList() { + if (logger.isDebugEnabled()) { + StringBuilder addresses = new StringBuilder(); + getRemoteClient().forEach(client -> addresses.append(client.getAddress().toString()).append(",")); + logger.debug("Remote client list: {}", addresses); + } + } + + /** + * Because of OAP server register by the UUID which one-to-one mapping with process number. + * The register information not delete immediately after process shutdown because of there + * is always happened network fault, not really process shutdown. So, cluster module must + * wait a few seconds to confirm it. Then there are more than one register information in + * the cluster. + * + * @param instanceList the instances query from cluster module. + * @return distinct remote instances + */ + private List distinct(List instanceList) { + Set
addresses = new HashSet<>(); + List newInstanceList = new ArrayList<>(); + instanceList.forEach(instance -> { + if (addresses.add(instance.getAddress())) { + newInstanceList.add(instance); + } + }); + return newInstanceList; + } + public List getRemoteClient() { return usingClients; } -- GitLab