You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@storm.apache.org by Anirudh Jayakumar <ja...@gmail.com> on 2016/01/31 17:57:42 UTC

zookeeper util methods

Hi,

Could someone help me understand the difference between the below zk method
invocations?

a. (.. zk (getData) (watched) (forPath path))
b. (.. zk (getData) (forPath path))))

I want to understand the significance of "watched" method here.

Thanks,
Anirudh

Re: zookeeper util methods

Posted by Anirudh Jayakumar <aj...@illinois.edu>.
Hi Erik,

Thanks a lot for the detailed reply. The links were really helpful.

Thanks,
Anirudh

On Sun, Jan 31, 2016 at 4:07 PM, Erik Weathers <
eweathers@groupon.com.invalid> wrote:

> hey Anirudh,
>
> To decipher this code we need to first realize that the the `zk` in that
> code refers to CuratorFramework:
>
>    -
>
> https://github.com/apache/storm/blob/v0.10.0/storm-core/src/clj/backtype/storm/zookeeper.clj#L125
>
> Next we need to figure out the funny (.. ) syntax.  I happen to have tribal
> knowledge that this syntax is part of Clojure's java interop stuff, as
> documented here:
>
> http://clojure.org/reference/java_interop
> ------------------------------------------------
> *Clojure's docs on java interop:*
>
> (.. instance-expr member+)
> (.. Classname-symbol member+)
>
> member ⇒ fieldName-symbol or (instanceMethodName-symbol args*)
>
> Macro. Expands into a member access (.) of the first member on the first
> argument, followed by the next member on the result, etc. For instance:
>
> (.. System (getProperties) (get "os.name"))
>
> expands to:
>
> (. (. System (getProperties)) (get "os.name"))
>
> but is easier to write, read, and understand. See also the -> macro which
> can be used similarly:
>
> (→ (System/getProperties) (.get "os.name"))
> ------------------------------------------------
>
> Hence:
>
>    - (.. zk (getData) (forPath path))
>
> Expands to:
>
>    - (. (. zk (getData)) (forPath path))
>
> Which is basically (in Java syntax):
>
>    - zk.getData().forPath(path)
>
> And the other line:
>
>    -  (.. zk (getData) (watched) (forPath path))
>
> Basically means:
>
>    - zk.getData().watched().forPath(path)
>
> Here are those docs for these Apache Curator methods:
>
>    -
>
> https://curator.apache.org/apidocs/org/apache/curator/framework/CuratorFramework.html#getData--
>    -
>
> https://curator.apache.org/apidocs/org/apache/curator/framework/api/Watchable.html#watched--
>    -
>
> https://curator.apache.org/apidocs/org/apache/curator/framework/api/Pathable.html#forPath-java.lang.String-
>
> So when you call "watched" you are setting a "watcher" for the obtained
> data.  As for what the "watcher" *is*, it seems that it comes from the
> cluster.clj's wrapper code having created the CuratorFramework instance:
>
>    -
>
> https://github.com/apache/storm/blob/v0.10.0/storm-core/src/clj/backtype/storm/cluster.clj#L59-L70
>    -
>
> https://github.com/apache/storm/blob/v0.10.0/storm-core/src/clj/backtype/storm/zookeeper.clj#L48-L80
>    -
>
> https://github.com/apache/storm/blob/v0.10.0/storm-core/src/clj/backtype/storm/cluster.clj#L112-L114
>
> Note that there are callbacks registered via that initialization code, so
> the callbacks are invoked when a watch fires.
>
> - Erik
>
>
> On Sun, Jan 31, 2016 at 8:57 AM, Anirudh Jayakumar <
> jayakumar.anirudh@gmail.com> wrote:
>
> > Hi,
> >
> > Could someone help me understand the difference between the below zk
> method
> > invocations?
> >
> > a. (.. zk (getData) (watched) (forPath path))
> > b. (.. zk (getData) (forPath path))))
> >
> > I want to understand the significance of "watched" method here.
> >
> > Thanks,
> > Anirudh
> >
>

Re: zookeeper util methods

Posted by Erik Weathers <ew...@groupon.com.INVALID>.
hey Anirudh,

To decipher this code we need to first realize that the the `zk` in that
code refers to CuratorFramework:

   -
   https://github.com/apache/storm/blob/v0.10.0/storm-core/src/clj/backtype/storm/zookeeper.clj#L125

Next we need to figure out the funny (.. ) syntax.  I happen to have tribal
knowledge that this syntax is part of Clojure's java interop stuff, as
documented here:

http://clojure.org/reference/java_interop
------------------------------------------------
*Clojure's docs on java interop:*

(.. instance-expr member+)
(.. Classname-symbol member+)

member ⇒ fieldName-symbol or (instanceMethodName-symbol args*)

Macro. Expands into a member access (.) of the first member on the first
argument, followed by the next member on the result, etc. For instance:

(.. System (getProperties) (get "os.name"))

expands to:

(. (. System (getProperties)) (get "os.name"))

but is easier to write, read, and understand. See also the -> macro which
can be used similarly:

(→ (System/getProperties) (.get "os.name"))
------------------------------------------------

Hence:

   - (.. zk (getData) (forPath path))

Expands to:

   - (. (. zk (getData)) (forPath path))

Which is basically (in Java syntax):

   - zk.getData().forPath(path)

And the other line:

   -  (.. zk (getData) (watched) (forPath path))

Basically means:

   - zk.getData().watched().forPath(path)

Here are those docs for these Apache Curator methods:

   -
   https://curator.apache.org/apidocs/org/apache/curator/framework/CuratorFramework.html#getData--
   -
   https://curator.apache.org/apidocs/org/apache/curator/framework/api/Watchable.html#watched--
   -
   https://curator.apache.org/apidocs/org/apache/curator/framework/api/Pathable.html#forPath-java.lang.String-

So when you call "watched" you are setting a "watcher" for the obtained
data.  As for what the "watcher" *is*, it seems that it comes from the
cluster.clj's wrapper code having created the CuratorFramework instance:

   -
   https://github.com/apache/storm/blob/v0.10.0/storm-core/src/clj/backtype/storm/cluster.clj#L59-L70
   -
   https://github.com/apache/storm/blob/v0.10.0/storm-core/src/clj/backtype/storm/zookeeper.clj#L48-L80
   -
   https://github.com/apache/storm/blob/v0.10.0/storm-core/src/clj/backtype/storm/cluster.clj#L112-L114

Note that there are callbacks registered via that initialization code, so
the callbacks are invoked when a watch fires.

- Erik


On Sun, Jan 31, 2016 at 8:57 AM, Anirudh Jayakumar <
jayakumar.anirudh@gmail.com> wrote:

> Hi,
>
> Could someone help me understand the difference between the below zk method
> invocations?
>
> a. (.. zk (getData) (watched) (forPath path))
> b. (.. zk (getData) (forPath path))))
>
> I want to understand the significance of "watched" method here.
>
> Thanks,
> Anirudh
>