From be1cd9302e79987cf6f56049c84bb94668aed252 Mon Sep 17 00:00:00 2001 From: Spencer Gibb Date: Mon, 19 Mar 2018 11:52:50 -0400 Subject: [PATCH] Returns empty list when zookeeper throws NoNodeException. This will allow apps that use DiscoveryClient to continue to function as services register. This is a common occurrence in testing situations. Fixes https://github.com/spring-cloud/spring-cloud-netflix/issues/2269 --- .../discovery/ZookeeperDiscoveryClient.java | 9 +++++++++ .../discovery/ZookeeperDiscoveryClientTests.java | 14 ++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/spring-cloud-zookeeper-discovery/src/main/java/org/springframework/cloud/zookeeper/discovery/ZookeeperDiscoveryClient.java b/spring-cloud-zookeeper-discovery/src/main/java/org/springframework/cloud/zookeeper/discovery/ZookeeperDiscoveryClient.java index e004906a..c093cb77 100644 --- a/spring-cloud-zookeeper-discovery/src/main/java/org/springframework/cloud/zookeeper/discovery/ZookeeperDiscoveryClient.java +++ b/spring-cloud-zookeeper-discovery/src/main/java/org/springframework/cloud/zookeeper/discovery/ZookeeperDiscoveryClient.java @@ -25,6 +25,8 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.curator.x.discovery.ServiceDiscovery; import org.apache.curator.x.discovery.ServiceInstance; +import org.apache.zookeeper.KeeperException; + import org.springframework.cloud.client.discovery.DiscoveryClient; import org.springframework.cloud.zookeeper.discovery.dependency.ZookeeperDependencies; import org.springframework.util.ReflectionUtils; @@ -106,6 +108,13 @@ public class ZookeeperDiscoveryClient implements DiscoveryClient { } services = new ArrayList<>(names); } + catch (KeeperException.NoNodeException e) { + if (log.isDebugEnabled()) { + log.debug("Error getting services from zookeeper. Possibly, no service has registered.", e); + } + // this means that nothing has registered as a service yes + return Collections.emptyList(); + } catch (Exception e) { rethrowRuntimeException(e); } diff --git a/spring-cloud-zookeeper-discovery/src/test/java/org/springframework/cloud/zookeeper/discovery/ZookeeperDiscoveryClientTests.java b/spring-cloud-zookeeper-discovery/src/test/java/org/springframework/cloud/zookeeper/discovery/ZookeeperDiscoveryClientTests.java index 68b34dda..f604779e 100644 --- a/spring-cloud-zookeeper-discovery/src/test/java/org/springframework/cloud/zookeeper/discovery/ZookeeperDiscoveryClientTests.java +++ b/spring-cloud-zookeeper-discovery/src/test/java/org/springframework/cloud/zookeeper/discovery/ZookeeperDiscoveryClientTests.java @@ -3,10 +3,12 @@ package org.springframework.cloud.zookeeper.discovery; import java.util.List; import org.apache.curator.x.discovery.ServiceDiscovery; +import org.apache.zookeeper.KeeperException.NoNodeException; import org.junit.Test; import static org.assertj.core.api.BDDAssertions.then; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; /** * @author Marcin Grzejszczak @@ -22,4 +24,16 @@ public class ZookeeperDiscoveryClientTests { // then: then(services).isEmpty(); } + + @Test + public void shouldReturnEmptyWhenNoNodeException() throws Exception { + // given: + ServiceDiscovery serviceDiscovery = mock(ServiceDiscovery.class); + when(serviceDiscovery.queryForNames()).thenThrow(new NoNodeException()); + ZookeeperDiscoveryClient discoveryClient = new ZookeeperDiscoveryClient(serviceDiscovery, null); + // when: + List services = discoveryClient.getServices(); + // then: + then(services).isEmpty(); + } }