[
https://issues.apache.org/jira/browse/CURATOR-228?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14638253#comment-14638253
]
ASF GitHub Bot commented on CURATOR-228:
----------------------------------------
Github user cammckenzie commented on a diff in the pull request:
https://github.com/apache/curator/pull/93#discussion_r35292748
--- Diff:
curator-recipes/src/main/java/org/apache/curator/framework/recipes/nodes/PersistentEphemeralNode.java
---
@@ -233,8 +236,15 @@ else if ( event.getResultCode() ==
KeeperException.Code.OK.intValue() )
{
path = event.getName();
}
+ else if ( event.getResultCode() ==
KeeperException.Code.NOAUTH.intValue() )
+ {
+ log.warn("Client does not have authorisation to write
ephemeral node at path {}", path);
--- End diff --
Possibly, we probably need to do an audit. I had a look at the
InterProcessMutex and I think that it's ok because the node creation happens in
the foreground. The PersistentEphemeralNode is problematic because it's all
done in the background.
> 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)