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

Jordan Zimmerman closed CURATOR-43.
-----------------------------------

    Resolution: Not A Problem

This cannot be supported. Each Curator recipe would have to filter the nodes it 
gets from getChildren. This would hurt performance and complicate the code. 
Further, it's unnecessary. 

I'll add a Tech Note on the wiki about this. Curator must "own" any paths that 
it's given.
                
> Acquire gets stuck in InterProcessMutex if there are sub-nodes in lock path
> ---------------------------------------------------------------------------
>
>                 Key: CURATOR-43
>                 URL: https://issues.apache.org/jira/browse/CURATOR-43
>             Project: Apache Curator
>          Issue Type: Bug
>          Components: Recipes
>    Affects Versions: 2.0.1-incubating
>            Reporter: Phil Mikhailov
>            Assignee: Jay Zarfoss
>
> If lock path has sub-node, this sub-node is also treated as try to acquire 
> this lock.
> I created small test method in TestInterProcessMutex that reproduces this 
> issue:
> @Test
> public void testWithSubNode() throws Exception {
>     final CuratorFramework client = 
> CuratorFrameworkFactory.newClient(server.getConnectString(), new 
> RetryOneTime(1));
>     try {
>         client.start();
>         final InterProcessMutex lock = new InterProcessMutex(client, 
> LOCK_PATH);
>         final InterProcessMutex lock0 = new InterProcessMutex(client, 
> LOCK_PATH + "/0");
>         boolean acquired0 = lock0.acquire(5, TimeUnit.SECONDS);
>         Assert.assertTrue(acquired0);
>         lock0.release();
>         boolean acquired = lock.acquire(5, TimeUnit.SECONDS);
>         Assert.assertTrue(acquired);
>         lock.release();
>     } finally {
>         client.close();
>     }
> }
> I also patched our curator build in LockInternals with this temporary patch 
> before you found better solution.
> static final String             PROTECTED_PREFIX = "_c_";
> public static List<String> getSortedChildren(CuratorFramework client, String 
> basePath, final String lockName, final LockInternalsSorter sorter) throws 
> Exception
> {
>     List<String> children = 
> Lists.newArrayList(Collections2.filter(client.getChildren().forPath(basePath),
>             new Predicate<String>()
>             {
>                 @Override
>                 public boolean apply(String s)
>                 {
>                     return s.startsWith(PROTECTED_PREFIX);
>                 }
>             }));
>     return getSortedChildren(lockName, sorter, children);
> }

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira

Reply via email to