Actually I guess that would be zookeeper.removeWatch( rootPath, tempWatcher ) !!
On Thu, Jun 11, 2009 at 10:14 AM, Satish Bhatti <cthd2...@gmail.com> wrote: > That's right Ben. Basically, I would like to use it something like this: > public boolean waitForChildrenChanged( String rootPath, > long timeout ) > { > BooleanLock blChildrenChanged = new BooleanLock(); > > Watcher tempWatcher = > new Watcher() > { > public void process( WatchedEvent event ) > { > logger.debug( "waitForAnyEntry(): Got state event: " + > ZooKeeperUtils.watchedEventToString( event ) ); > blChildrenChanged.setValue( true ); > } > }; > > zookeeper.getChildren( rootPath, watcher, > > new AsyncCallback.ChildrenCallback() > { > public void processResult( int rc, String path, Object ctx, > List<String> children ) > { > logger.debug( "waitForChildrenChanged(): > AsyncCallback.ChildrenCallback(): " + rc + ", " + path + ", " + ctx + ", " + > children ); > } > }, null ); > > blChildrenChanged.waitUntilTrue( timeout ); > > zookeeper.removeWatch( tempWatcher ); > > return blChildrenChanged.isTrue(); > } > > The only piece missing from the API is the zookeeper.removeWatch( > tempWatcher ); > > Satish > > > On Thu, Jun 11, 2009 at 7:09 AM, Benjamin Reed <br...@yahoo-inc.com>wrote: > >> just to clarify i believe you are talking about callbacks on the watch >> object you are passing in the asynchronous call rather than the asynchronous >> completion callback. (Henry is making the same assumption.) when you say you >> are getting the callback 10 times, i believe your are talking about 10 >> different watch objects getting called back once each. right? >> >> it turns out that the zookeeper client does know what you are watching, >> and the zookeeper server will only register one watch. the thing that is >> missing is the clearWatches call that Henry refers to. the thing that >> complicates things a bit, perhaps not for you, is the scenario where we have >> different modules sharing the same zookeeper handle. if different modules >> are interested in watching the same object, you don't want one module to >> simply clear a the watches for a path because one module may mess up the >> other. >> >> we have talked about adding this ability to clear watches for a while. i >> think the auto-watch reregistration patch made the issue slightly more >> pressing since it means that watches can survive for the entire lifetime of >> a session not just for the duration of a connection to a specific server. >> i've created ZOOKEEPER-442 to track this issue. >> >> ben >> >> >> Henry Robinson wrote: >> >>> Hi Satish - >>> >>> As you've found out, you can set multiple identical watches per znode - >>> the >>> zookeeper client will not detect identical watches in case you really >>> meant >>> to call them several times. There's no way currently, as far as I know, >>> to >>> clear the watches once they've been set. So your options are either to >>> avoid >>> repeatedly setting them by detecting whether getChildren is a repeat >>> call, >>> or by dealing with multiple invocations on the callback path and not >>> doing >>> anything once you've established you're no longer interested. >>> >>> It might well make sense to add a clearWatches(path) call to the API, >>> which >>> would be useful particularly for clients where callbacks are expensive >>> and >>> require a context switch (which I think is true for all clients right >>> now!). >>> >>> Henry >>> >>> On Wed, Jun 10, 2009 at 8:05 PM, Satish Bhatti <cthd2...@gmail.com> >>> wrote: >>> >>> >>> >>>> I am using the asynchronous (callback) version of >>>> zookeeper.getChildren(). >>>> That call returns immediately, I then wait for a certain time interval >>>> for >>>> nodes to appear, and if not I exit the method that made the >>>> zookeeper.getChildren() >>>> call. Later on, a node gets added under that node and I see in my >>>> logfile >>>> that the Watcher.process() callback that I set above gets called. Now >>>> if I >>>> make 10 failed attempts to get a node using the above technique, and at >>>> some >>>> later time a node does get added, I see in the logfile that the >>>> Watcher.process() ends up being called 10 times! Of course by this time >>>> I >>>> have totally lost interest in those callbacks. Question: Is there a >>>> way >>>> to >>>> remove that asynchronous callback? i.e. If I make a asynchronous >>>> zookeeper.getChildren() >>>> call, wait time t, give up, at that point can I remove the async >>>> callback? >>>> Satish >>>> >>>> >>>> >>> >> >