[ 
https://issues.apache.org/jira/browse/CURATOR-728?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Kezhu Wang resolved CURATOR-728.
--------------------------------
    Fix Version/s: 5.8.0
       Resolution: Fixed

master: 476268a68d307b6fa989a5314eacd9345bedfc58

> ServiceCache fails to start if base path is read-only
> -----------------------------------------------------
>
>                 Key: CURATOR-728
>                 URL: https://issues.apache.org/jira/browse/CURATOR-728
>             Project: Apache Curator
>          Issue Type: Bug
>          Components: Client
>    Affects Versions: 5.7.1
>            Reporter: Matthias Kiefer
>            Assignee: Kezhu Wang
>            Priority: Major
>             Fix For: 5.8.0
>
>
> Up from Curator 5.7.1 calling start() on a ServiceCacheImpl instance fails 
> with a NoAuthException if the base path of the ServiceDiscovery is read-only 
> (e.g. world:anyone:r).
> The reason for this problem is the following commit: 
> [https://github.com/apache/curator/commit/9fe79d81a8c5f2484bc29087024b5d65c8fba37f]
> Before, there has been an if-condition, checking with zookeeper.exists(...) 
> if the  path exists or not. Only if the path was not existing, 
> zookeeper.create() was called. Now, zookeeper.create() is always called and 
> the NoAuthException is not catched, resulting in the following stack trace:
> {code:java}
> Exception in thread "main" 
> org.apache.zookeeper.KeeperException$NoAuthException: KeeperErrorCode = 
> NoAuth for /test/service
>       at org.apache.zookeeper.KeeperException.create(KeeperException.java:119)
>       at org.apache.zookeeper.KeeperException.create(KeeperException.java:53)
>       at org.apache.zookeeper.ZooKeeper.create(ZooKeeper.java:1347)
>       at org.apache.curator.utils.ZKPaths.mkdirs(ZKPaths.java:331)
>       at 
> org.apache.curator.framework.imps.ExistsBuilderImpl$2.call(ExistsBuilderImpl.java:218)
>       at 
> org.apache.curator.framework.imps.ExistsBuilderImpl$2.call(ExistsBuilderImpl.java:214)
>       at org.apache.curator.RetryLoop.callWithRetry(RetryLoop.java:88)
>       at 
> org.apache.curator.framework.imps.ExistsBuilderImpl.pathInForeground(ExistsBuilderImpl.java:214)
>       at 
> org.apache.curator.framework.imps.ExistsBuilderImpl.forPath(ExistsBuilderImpl.java:202)
>       at 
> org.apache.curator.framework.imps.ExistsBuilderImpl.forPath(ExistsBuilderImpl.java:35)
>       at 
> org.apache.curator.framework.imps.CuratorFrameworkImpl.createContainers(CuratorFrameworkImpl.java:302)
>       at 
> org.apache.curator.framework.EnsureContainers.internalEnsure(EnsureContainers.java:63)
>       at 
> org.apache.curator.framework.EnsureContainers.ensure(EnsureContainers.java:50)
>       at 
> org.apache.curator.x.discovery.details.ServiceCacheImpl.startImmediate(ServiceCacheImpl.java:110)
>       at 
> org.apache.curator.x.discovery.details.ServiceCacheImpl.start(ServiceCacheImpl.java:103)
> {code}
>  
> Steps to reproduce:
> In Zookeeper create the node /test/service where /test serves as base path 
> for the service discovery.
> {code:java}
> create /test
> create /service
> setAcl /test world:anyone:r {code}
> Use the following java code to reproduce the issue:
> {code:java}
> import java.util.Map;
> import org.apache.curator.framework.CuratorFramework;
> import org.apache.curator.framework.CuratorFrameworkFactory;
> import org.apache.curator.retry.ExponentialBackoffRetry;
> import org.apache.curator.x.discovery.ServiceCache;
> import org.apache.curator.x.discovery.ServiceDiscovery;
> import org.apache.curator.x.discovery.ServiceDiscoveryBuilder;
> class Scratch {
>     public static void main(String[] args) throws Exception {
>         CuratorFramework curatorFramework = CuratorFrameworkFactory.builder()
>                 .connectString("localhost:2181")
>                 .retryPolicy(new ExponentialBackoffRetry(1000, 3))
>                 .build();
>         curatorFramework.start();
>         ServiceDiscovery<Map> discovery = 
> ServiceDiscoveryBuilder.builder(Map.class)
>                 .basePath("/test")
>                 .client(curatorFramework)
>                 .build();
>         discovery.start();
>         ServiceCache<Map> serviceCache = 
> discovery.serviceCacheBuilder().name("service").build();
>         serviceCache.start();
>         serviceCache.close();
>         discovery.close();
>         curatorFramework.close();
>     }
> } {code}
> The code will fail on serviceCache.start() with the exception shown above.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to