You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@curator.apache.org by "coder_czp (JIRA)" <ji...@apache.org> on 2015/06/30 04:40:04 UTC

[jira] [Created] (CURATOR-228) A serious death cycle error(一个严重的死循环错误)

coder_czp created CURATOR-228:
---------------------------------

             Summary: A serious death cycle error(一个严重的死循环错误)
                 Key: CURATOR-228
                 URL: https://issues.apache.org/jira/browse/CURATOR-228
             Project: Apache Curator
          Issue Type: Bug
          Components: Framework
    Affects Versions: 2.8.0, 2.7.1, 2.7.0
         Environment: windows linux mac ....
            Reporter: coder_czp


当用异步的方式创建带有多层目录的临时节点时,如果客户端没有zookeeper的写入权限,curator 就会陷入死循环,客户端会一直向服务器提交写入报文,但是永远不会成功。出错的代码逻辑如下:
When used asynchronous way to create a temporary node multi directory, if the client does not have the zookeeper write permissions, the curator will get into a cycle of death, the client will has been submitted to the server write message, but never succeed. Error code logic is as follows:

1  PersistentEphemeralNode sessionNode = new PersistentEphemeralNode(curatorClient, Mode.EPHEMERAL,"/a/b/c", "test");
   sessionNode.start();
     CreateBuilderImpl:
       forPath(xx)-->pathInBackground(xx)-->
		    CuratorFrameworkImpl:processBackgroundOperation(operationAndData, null);
				                    --->performBackgroundOperation(xx)
				OperationAndData:callPerformBackgroundOperation(xx)-->
                         CreateBuilderImpl:performBackgroundOperation(xx)->backgroundCreateParentsThenNode(xx)
                                             -->queueOperation(xx){backgroundOperations.offer(operationAndData);} 
                               
  //这个循环会触发1,导致循环无法退出
  //This cycle will trigger 1, causing the loop to exit.  
  //CuratorFrameworkImpl
 2 private void backgroundOperationsLoop()
    {
        while ( !Thread.currentThread().isInterrupted() )
        {
            OperationAndData<?> operationAndData;
            try
            {
                operationAndData = backgroundOperations.take();
                if ( debugListener != null )
                {
                    debugListener.listen(operationAndData);
                }
            }
            catch ( InterruptedException e )
            {
                Thread.currentThread().interrupt();
                break;
            }

            performBackgroundOperation(operationAndData);
        }
    }	
 如果需要更多细节,请给我发邮件: coder_czp@126.com	
 If you need more details, please email me:coder_czp@126.com



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