[
https://issues.apache.org/jira/browse/CURATOR-344?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15448922#comment-15448922
]
ASF GitHub Bot commented on CURATOR-344:
----------------------------------------
Github user gtully commented on the issue:
https://github.com/apache/curator/pull/161
thanks for the feedback.
I fixed up the unit test to make it more deterministic.
Changed the watcher to do an update and notification in the background.
That sorts my use case however the update events should only fire on valid
change events.
Added additional unit test to track change events between disconnect and
reconnect and made the matching change to restrict the callback to valid change
events.
I think it is better on both counts.
> SharedValue watcher should limit work to valid data change events
> ------------------------------------------------------------------
>
> Key: CURATOR-344
> URL: https://issues.apache.org/jira/browse/CURATOR-344
> Project: Apache Curator
> Issue Type: Bug
> Components: Recipes
> Affects Versions: 3.2.0
> Reporter: Gary Tully
>
> With a RetryNTimes retry policy and a disconnect. The event thread can get
> blocked on retries from the SharedValue watcher readValue, blocking other
> listeners from getting the SUSPENDED event till retry completes.
> Seems the watcher should limit work and notifications to valid change events
> and ignore a disconnect. The ConnectionStateListener already handles those.
> Sample thread stack that blocks other listeners:
> {code}main-EventThread" daemon prio=10 tid=0x00007f95d009f000 nid=0x3429
> waiting on condition [0x00007f959d6d5000]
> java.lang.Thread.State: TIMED_WAITING (sleeping)
> at java.lang.Thread.sleep(Native Method)
> at java.lang.Thread.sleep(Thread.java:340)
> at java.util.concurrent.TimeUnit.sleep(TimeUnit.java:360)
> at org.apache.curator.RetryLoop$1.sleepFor(RetryLoop.java:74)
> at
> org.apache.curator.retry.SleepingRetry.allowRetry(SleepingRetry.java:46)
> at org.apache.curator.retry.RetryNTimes.allowRetry(RetryNTimes.java:24)
> at org.apache.curator.RetryLoop.takeException(RetryLoop.java:188)
> at org.apache.curator.RetryLoop.callWithRetry(RetryLoop.java:112)
> at
> org.apache.curator.framework.imps.GetDataBuilderImpl.pathInForeground(GetDataBuilderImpl.java:287)
> at
> org.apache.curator.framework.imps.GetDataBuilderImpl.forPath(GetDataBuilderImpl.java:279)
> at
> org.apache.curator.framework.imps.GetDataBuilderImpl.forPath(GetDataBuilderImpl.java:41)
> at
> org.apache.curator.framework.recipes.shared.SharedValue.readValue(SharedValue.java:192)
> - locked <0x000000074326fb50> (a
> org.apache.curator.framework.recipes.shared.SharedValue)
> at
> org.apache.curator.framework.recipes.shared.SharedValue.access$100(SharedValue.java:42)
> at
> org.apache.curator.framework.recipes.shared.SharedValue$1.process(SharedValue.java:58)
> at
> org.apache.curator.framework.imps.NamespaceWatcher.process(NamespaceWatcher.java:67)
> at
> org.apache.zookeeper.ClientCnxn$EventThread.processEvent(ClientCnxn.java:530)
> at
> org.apache.zookeeper.ClientCnxn$EventThread.run(ClientCnxn.java:505){code}
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)