[
https://issues.apache.org/jira/browse/CURATOR-228?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14637979#comment-14637979
]
Cameron McKenzie commented on CURATOR-228:
------------------------------------------
[~randgalt] [[email protected]] [~dragonsinth]
Guys, I can reproduce this, just thinking about a fix.
The simple solution is to just log a warning indicating that the node cannot be
created. Because the node creation is handled in the background there's no real
way of communicating back to the client that the node hasn't been created
without adding some sort of listener.
The alternative is to try and make the handling a bit smarter so that if we get
the NOAUTH error that we place a watch on the parent node and if the parent
node changes that we attempt to recreate the ephemeral node.
I think that the simple solution is probably sufficient. I don't think that the
more complex solution really adds much as I would presume that it's unlikely
that the permissions on the parent node are going to change.
Thoughts?
> 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
>
> 当用异步的方式创建带有多层目录的临时节点时,如果客户端没有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);
> }
> }
> 如果需要更多细节,请给我发邮件: [email protected]
> If you need more details, please email me:[email protected]
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)