You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@curator.apache.org by "Cameron McKenzie (JIRA)" <ji...@apache.org> on 2015/09/01 01:19:45 UTC

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

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

Cameron McKenzie resolved CURATOR-228.
--------------------------------------
       Resolution: Fixed
    Fix Version/s: 2.9.0

This will fix the hard loop that occurred if the ephemeral node could not be created under the parent node due to a NOAUTH error. A future enhancement may be to periodically retry to create the ephemeral node, currently an error will be logged.

> 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.7.0, 2.7.1, 2.8.0
>         Environment: windows linux mac ....
>            Reporter: coder_czp
>            Assignee: Cameron McKenzie
>             Fix For: 2.9.0
>
>
> 当用异步的方式创建带有多层目录的临时节点时,如果客户端没有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)