Improve zookeeper client reconnect logic. UI: Flot widget - Fixed incorrect individual tooltip content.

This commit is contained in:
Igor Kulikov 2019-03-27 13:38:06 +02:00
parent 5206a0e4e9
commit c4be98576a
3 changed files with 37 additions and 14 deletions

View File

@ -52,6 +52,8 @@ import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy; import javax.annotation.PreDestroy;
import java.util.List; import java.util.List;
import java.util.NoSuchElementException; import java.util.NoSuchElementException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import static org.apache.curator.framework.recipes.cache.PathChildrenCacheEvent.Type.CHILD_REMOVED; import static org.apache.curator.framework.recipes.cache.PathChildrenCacheEvent.Type.CHILD_REMOVED;
@ -96,11 +98,13 @@ public class ZkDiscoveryService implements DiscoveryService, PathChildrenCacheLi
@Lazy @Lazy
private ClusterRoutingService routingService; private ClusterRoutingService routingService;
private ExecutorService reconnectExecutorService;
private CuratorFramework client; private CuratorFramework client;
private PathChildrenCache cache; private PathChildrenCache cache;
private String nodePath; private String nodePath;
private volatile boolean stopped = false; private volatile boolean stopped = true;
@PostConstruct @PostConstruct
public void init() { public void init() {
@ -110,9 +114,15 @@ public class ZkDiscoveryService implements DiscoveryService, PathChildrenCacheLi
Assert.notNull(zkConnectionTimeout, MiscUtils.missingProperty("zk.connection_timeout_ms")); Assert.notNull(zkConnectionTimeout, MiscUtils.missingProperty("zk.connection_timeout_ms"));
Assert.notNull(zkSessionTimeout, MiscUtils.missingProperty("zk.session_timeout_ms")); Assert.notNull(zkSessionTimeout, MiscUtils.missingProperty("zk.session_timeout_ms"));
reconnectExecutorService = Executors.newSingleThreadExecutor();
log.info("Initializing discovery service using ZK connect string: {}", zkUrl); log.info("Initializing discovery service using ZK connect string: {}", zkUrl);
zkNodesDir = zkDir + "/nodes"; zkNodesDir = zkDir + "/nodes";
initZkClient();
}
private void initZkClient() {
try { try {
client = CuratorFrameworkFactory.newClient(zkUrl, zkSessionTimeout, zkConnectionTimeout, new RetryForever(zkRetryInterval)); client = CuratorFrameworkFactory.newClient(zkUrl, zkSessionTimeout, zkConnectionTimeout, new RetryForever(zkRetryInterval));
client.start(); client.start();
@ -120,6 +130,8 @@ public class ZkDiscoveryService implements DiscoveryService, PathChildrenCacheLi
cache = new PathChildrenCache(client, zkNodesDir, true); cache = new PathChildrenCache(client, zkNodesDir, true);
cache.getListenable().addListener(this); cache.getListenable().addListener(this);
cache.start(); cache.start();
stopped = false;
log.info("ZK client connected");
} catch (Exception e) { } catch (Exception e) {
log.error("Failed to connect to ZK: {}", e.getMessage(), e); log.error("Failed to connect to ZK: {}", e.getMessage(), e);
CloseableUtils.closeQuietly(cache); CloseableUtils.closeQuietly(cache);
@ -128,12 +140,20 @@ public class ZkDiscoveryService implements DiscoveryService, PathChildrenCacheLi
} }
} }
@PreDestroy private void destroyZkClient() {
public void destroy() {
stopped = true; stopped = true;
try {
unpublishCurrentServer(); unpublishCurrentServer();
} catch (Exception e) {}
CloseableUtils.closeQuietly(cache); CloseableUtils.closeQuietly(cache);
CloseableUtils.closeQuietly(client); CloseableUtils.closeQuietly(client);
log.info("ZK client disconnected");
}
@PreDestroy
public void destroy() {
destroyZkClient();
reconnectExecutorService.shutdownNow();
log.info("Stopped discovery service"); log.info("Stopped discovery service");
} }
@ -180,20 +200,21 @@ public class ZkDiscoveryService implements DiscoveryService, PathChildrenCacheLi
return (client, newState) -> { return (client, newState) -> {
log.info("[{}:{}] ZK state changed: {}", self.getHost(), self.getPort(), newState); log.info("[{}:{}] ZK state changed: {}", self.getHost(), self.getPort(), newState);
if (newState == ConnectionState.LOST) { if (newState == ConnectionState.LOST) {
reconnect(); reconnectExecutorService.submit(this::reconnect);
} }
}; };
} }
private boolean reconnectInProgress = false; private volatile boolean reconnectInProgress = false;
private synchronized void reconnect() { private synchronized void reconnect() {
if (!reconnectInProgress) { if (!reconnectInProgress) {
reconnectInProgress = true; reconnectInProgress = true;
try { try {
client.blockUntilConnected(); destroyZkClient();
initZkClient();
publishCurrentServer(); publishCurrentServer();
} catch (InterruptedException e) { } catch (Exception e) {
log.error("Failed to reconnect to ZK: {}", e.getMessage(), e); log.error("Failed to reconnect to ZK: {}", e.getMessage(), e);
} finally { } finally {
reconnectInProgress = false; reconnectInProgress = false;

View File

@ -50,7 +50,7 @@
<commons-validator.version>1.5.0</commons-validator.version> <commons-validator.version>1.5.0</commons-validator.version>
<commons-io.version>2.5</commons-io.version> <commons-io.version>2.5</commons-io.version>
<commons-csv.version>1.4</commons-csv.version> <commons-csv.version>1.4</commons-csv.version>
<jackson.version>2.9.7</jackson.version> <jackson.version>2.9.8</jackson.version>
<json-schema-validator.version>2.2.6</json-schema-validator.version> <json-schema-validator.version>2.2.6</json-schema-validator.version>
<scala.version>2.11</scala.version> <scala.version>2.11</scala.version>
<akka.version>2.4.2</akka.version> <akka.version>2.4.2</akka.version>
@ -59,7 +59,7 @@
<velocity.version>1.7</velocity.version> <velocity.version>1.7</velocity.version>
<velocity-tools.version>2.0</velocity-tools.version> <velocity-tools.version>2.0</velocity-tools.version>
<mail.version>1.4.3</mail.version> <mail.version>1.4.3</mail.version>
<curator.version>4.0.1</curator.version> <curator.version>4.2.0</curator.version>
<protobuf.version>3.6.1</protobuf.version> <protobuf.version>3.6.1</protobuf.version>
<grpc.version>1.16.1</grpc.version> <grpc.version>1.16.1</grpc.version>
<lombok.version>1.16.18</lombok.version> <lombok.version>1.16.18</lombok.version>

View File

@ -137,9 +137,11 @@ export default class TbFlot {
}); });
content += dateDiv.prop('outerHTML'); content += dateDiv.prop('outerHTML');
if (tbFlot.ctx.tooltipIndividual) { if (tbFlot.ctx.tooltipIndividual) {
var seriesHoverInfo = hoverInfo.seriesHover[seriesIndex]; var found = hoverInfo.seriesHover.filter((seriesHover) => {
if (seriesHoverInfo) { return seriesHover.index === seriesIndex;
content += seriesInfoDivFromInfo(seriesHoverInfo, seriesIndex); });
if (found && found.length) {
content += seriesInfoDivFromInfo(found[0], seriesIndex);
} }
} else { } else {
var seriesDiv = $('<div></div>'); var seriesDiv = $('<div></div>');
@ -161,7 +163,7 @@ export default class TbFlot {
if (i == hoverInfo.seriesHover.length) { if (i == hoverInfo.seriesHover.length) {
break; break;
} }
seriesHoverInfo = hoverInfo.seriesHover[i]; var seriesHoverInfo = hoverInfo.seriesHover[i];
columnContent += seriesInfoDivFromInfo(seriesHoverInfo, seriesIndex); columnContent += seriesInfoDivFromInfo(seriesHoverInfo, seriesIndex);
} }
columnDiv.html(columnContent); columnDiv.html(columnContent);