Girard-Reydet created CURATOR-180:
-------------------------------------

             Summary: Rare occurences of NoNodeException in 
InterPRocessSemaphoreMurex.acquire
                 Key: CURATOR-180
                 URL: https://issues.apache.org/jira/browse/CURATOR-180
             Project: Apache Curator
          Issue Type: Bug
          Components: Recipes
    Affects Versions: 2.4.1
         Environment: Curator 3.4.1
ZooKeeper 3.4.6 + patch ZOOKEEPER-922
Sun JDK 1.7.0_51-b13
SunOS 5.10 Generic_147441-01 i86pc i386
            Reporter: Girard-Reydet


On some occasions, acquiring a semaphore will raise a NoNode exception (see 
stack below). I don't have statistics, but overs 3 weeks with about 20 test 
jobs/day, I observed it only twice.

If I refer to the code, the parent nodes (here {{/locks/-licence}}) should be 
created if it does not exist:

{code}
    private InternalAcquireResult 
internalAcquire1Lease(ImmutableList.Builder<Lease> builder, long startMs, 
boolean hasWait, long waitMs) throws Exception
    {
        // ... skipping to the problematic lines
        try
        {
            PathAndBytesable<String> createBuilder = 
client.create().creatingParentsIfNeeded().withProtection().withMode(CreateMode.EPHEMERAL_SEQUENTIAL);
            String path = (nodeData != null) ? 
createBuilder.forPath(ZKPaths.makePath(leasesPath, LEASE_BASE_NAME), nodeData) 
: createBuilder.forPath(ZKPaths.makePath(leasesPath, LEASE_BASE_NAME));
{code}

Here is the observed stack:
{code}
org.apache.zookeeper.KeeperException$NoNodeException: KeeperErrorCode = NoNode 
for /locks/-license/leases
        at org.apache.zookeeper.KeeperException.create(KeeperException.java:111)
        at org.apache.zookeeper.KeeperException.create(KeeperException.java:51)
        at org.apache.zookeeper.ZooKeeper.getChildren(ZooKeeper.java:1590)
        at 
org.apache.curator.framework.imps.GetChildrenBuilderImpl$3.call(GetChildrenBuilderImpl.java:214)
        at 
org.apache.curator.framework.imps.GetChildrenBuilderImpl$3.call(GetChildrenBuilderImpl.java:203)
        at org.apache.curator.RetryLoop.callWithRetry(RetryLoop.java:107)
        at 
org.apache.curator.framework.imps.GetChildrenBuilderImpl.pathInForeground(GetChildrenBuilderImpl.java:199)
        at 
org.apache.curator.framework.imps.GetChildrenBuilderImpl.forPath(GetChildrenBuilderImpl.java:191)
        at 
org.apache.curator.framework.imps.GetChildrenBuilderImpl.forPath(GetChildrenBuilderImpl.java:38)
        at 
org.apache.curator.framework.recipes.locks.InterProcessSemaphoreV2.internalAcquire1Lease(InterProcessSemaphoreV2.java:358)
        at 
org.apache.curator.framework.recipes.locks.InterProcessSemaphoreV2.acquire(InterProcessSemaphoreV2.java:281)
        at 
org.apache.curator.framework.recipes.locks.InterProcessSemaphoreV2.acquire(InterProcessSemaphoreV2.java:206)
        at 
org.apache.curator.framework.recipes.locks.InterProcessSemaphoreMutex.acquire(InterProcessSemaphoreMutex.java:46)
        at 
registry.backend.zk.ZooKeeperNodesManager$ZooKeeperRegistryLock.acquire(ZooKeeperNodesManager.java:223)
        ... 11 more
{code}

Note that I can have several processes concurrently trying to grab the lock at 
the same time. It is also possible that they concurrently try to grab it while 
the parent path does not yet exist.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to