Out of interest, why is #'init-stm a separate step to #'connect I tried looking at the docstrings for each fn but they were both nil :-(
Sam --- http://sam.aaron.name On 1 Dec 2011, at 17:21, David Edgar Liebke wrote: > Did you initialize the STM? > > (init-stm client) > > You only need to do it the first time, to set up the necessary zookeeper > nodes, it's described in the main tutorial but not the snippet on the top of > the avout site. > > David > > On Dec 1, 2011, at 12:15 PM, Sam Aaron wrote: > >> Hi David, >> >> thanks for looking into this so promptly. Sadly 0.5.1 just throws a >> different exception: >> >> user=> (def client (connect "127.0.0.1")) >> >> >> #'user/client >> >> >> user=> (def r0 (zk-ref client "/r0" 0)) >> >> >> java.lang.RuntimeException: >> org.apache.zookeeper.KeeperException$NoNodeException: KeeperErrorCode = >> NoNode for /stm/history/t- >> >> run-in-transaction exception: #<RuntimeException >> java.lang.RuntimeException: >> org.apache.zookeeper.KeeperException$NoNodeException: KeeperErrorCode = >> NoNode for /stm/history/t-> nil >> at clojure.lang.Util.runtimeException(Util.java:165) >> >> >> at clojure.lang.Reflector.invokeInstanceMethod(Reflector.java:35) >> >> >> at avout.transaction$run_in_transaction.invoke(transaction.clj:356) >> >> >> at avout.core$zk_ref.doInvoke(core.clj:51) >> >> >> at clojure.lang.RestFn.invoke(RestFn.java:445) >> >> >> at clojure.lang.AFn.applyToHelper(AFn.java:167) >> >> >> at clojure.lang.RestFn.applyTo(RestFn.java:132) >> >> >> at clojure.lang.Compiler$InvokeExpr.eval(Compiler.java:3337) >> >> >> at clojure.lang.Compiler$DefExpr.eval(Compiler.java:375) >> >> >> at clojure.lang.Compiler.eval(Compiler.java:6470) >> >> >> at clojure.lang.Compiler.eval(Compiler.java:6431) >> >> >> at clojure.core$eval.invoke(core.clj:2795) >> >> >> at clojure.main$repl$read_eval_print__5967.invoke(main.clj:244) >> >> >> at clojure.main$repl$fn__5972.invoke(main.clj:265) >> >> >> at clojure.main$repl.doInvoke(main.clj:265) >> >> >> at clojure.lang.RestFn.invoke(RestFn.java:512) >> >> >> at user$eval27$acc__3869__auto____30$fn__32.invoke(NO_SOURCE_FILE:1) >> >> >> at clojure.lang.AFn.run(AFn.java:24) >> >> >> at java.lang.Thread.run(Thread.java#'user/r0 >> >> >> user=> :680) >> >> >> Caused by: org.apache.zookeeper.KeeperException$NoNodeException: >> KeeperErrorCode = NoNode for /stm/history/t- >> >> at >> org.apache.zookeeper.KeeperException.create(KeeperException.java:102) >> >> >> at >> org.apache.zookeeper.KeeperException.create(KeeperException.java:42) >> >> >> at org.apache.zookeeper.ZooKeeper.create(ZooKeeper.java:637) >> >> >> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) >> >> >> at >> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) >> >> >> at >> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) >> >> >> at java.lang.reflect.Method.invoke(Method.java:597) >> >> >> at clojure.lang.Reflector.invokeMatchingMethod(Reflector.java:92) >> >> >> at clojure.lang.Reflector.invokeInstanceMethod(Reflector.java:30) >> >> >> at zookeeper$create.doInvoke(zookeeper.clj:158) >> >> >> at clojure.lang.RestFn.invoke(RestFn.java:521) >> >> >> at avout.transaction$next_point.invoke(transaction.clj:62) >> >> >> at avout.transaction$reincarnate_txn.invoke(transaction.clj:233) >> >> >> at avout.transaction$stop$fn__1104.invoke(transaction.clj:243) >> >> >> at avout.transaction$stop.invoke(transaction.clj:238) >> >> >> at >> avout.transaction.LockingTransaction$fn__1117.invoke(transaction.clj:323) >> >> >> at >> avout.transaction.LockingTransaction.runInTransaction(transaction.clj:303) >> >> >> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) >> >> >> at >> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) >> >> >> at >> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) >> >> >> at java.lang.reflect.Method.invoke(Method.java:597) >> >> >> at clojure.lang.Reflector.invokeMatchingMethod(Reflector.java:92) >> >> >> at clojure.lang.Reflector.invokeInstanceMethod(Reflector.java:30) >> >> >> ... 17 more >> >> >> also, trying to avoid setting the value on creation of the ref doesn't work >> either: >> >> >> >> >> user=> (def r1 (zk-ref client "/r1")) >> >> >> #'user/r1 >> >> >> user=> (dosync!! client (ref-set!! r1 0)) >> >> >> java.lang.RuntimeException: >> org.apache.zookeeper.KeeperException$NoNodeException: KeeperErrorCode = >> NoNode for /stm/history/t- >> >> run-in-transaction exception: #<RuntimeException >> java.lang.RuntimeException: >> org.apache.zookeeper.KeeperException$NoNodeException: KeeperErrorCode = >> NoNode for /stm/history/t-> nil >> nil >> >> >> at clojure.lang.Util.runtimeException(Util.java:165) >> >> >> at clojure.lang.Reflector.invokeInstanceMethod(Reflector.java:35) >> >> >> at avout.transaction$run_in_transaction.invoke(transaction.clj:356) >> >> >> at user$eval1426.invoke(NO_SOURCE_FILE:49) >> >> >> at clojure.lang.Compiler.eval(Compiler.java:6465) >> >> >> at clojure.lang.Compiler.eval(Compiler.java:6431) >> >> >> at clojure.core$eval.invoke(core.clj:2795) >> >> >> at clojure.main$repl$read_eval_print__5967.invoke(main.clj:244) >> >> >> at clojure.main$repl$fn__5972.invoke(main.clj:265) >> >> >> at clojure.main$repl.doInvoke(main.clj:265) >> >> >> at clojure.lang.RestFn.invoke(RestFn.java:512) >> >> >> at user$eval27$acc__3869__auto____30$fn__32.invoke(NO_SOURCE_FILE:1) >> >> >> at clojure.lang.AFn.run(AFn.java:24) >> >> >> at java.lang.Thread.run(Thread.java:680) >> >> >> Caused by: org.apache.zookeeper.KeeperException$NoNodeException: >> KeeperErrorCode = NoNode for /stm/history/t- >> >> at >> org.apache.zookeeper.KeeperException.create(KeeperException.java:102) >> >> >> at >> org.apache.zookeeper.KeeperException.create(KeeperException.java:42) >> >> >> atuser=> org.apache.zookeeper.ZooKeeper.create(ZooKeeper.java:637) >> >> >> at sun.reflect.GeneratedMethodAccessor3.invoke(Unknown Source) >> >> >> at >> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) >> >> >> at java.lang.reflect.Method.invoke(Method.java:597) >> >> >> at clojure.lang.Reflector.invokeMatchingMethod(Reflector.java:92) >> >> >> at clojure.lang.Reflector.invokeInstanceMethod(Reflector.java:30) >> >> >> at zookeeper$create.doInvoke(zookeeper.clj:158) >> >> >> at clojure.lang.RestFn.invoke(RestFn.java:521) >> >> >> at avout.transaction$next_point.invoke(transaction.clj:62) >> >> >> at avout.transaction$reincarnate_txn.invoke(transaction.clj:233) >> >> >> at avout.transaction$stop$fn__1104.invoke(transaction.clj:243) >> >> >> at avout.transaction$stop.invoke(transaction.clj:238) >> >> >> at >> avout.transaction.LockingTransaction$fn__1117.invoke(transaction.clj:323) >> >> >> at >> avout.transaction.LockingTransaction.runInTransaction(transaction.clj:303) >> >> >> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) >> >> >> at >> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) >> >> >> at >> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) >> >> >> at java.lang.reflect.Method.invoke(Method.java:597) >> >> >> at clojure.lang.Reflector.invokeMatchingMethod(Reflector.java:92) >> >> >> at clojure.lang.Reflector.invokeInstanceMethod(Reflector.java:30) >> >> >> ... 12 more >> >> Sam >> >> --- >> http://sam.aaron.name >> >> On 1 Dec 2011, at 17:04, David Edgar Liebke wrote: >> >>> Thanks Sam and Edmund, >>> >>> The stack traces were helpful, I think I understand what the immediate >>> problem is. It appears that the transaction ID in these cases is not >>> getting set, and then Avout is trying to write data to the ZooKeeper node >>> /stm/history/ instead of /stm/history/txid. >>> >>> Since I can't replicate the problem with my setup, I can't be certain of >>> the cause, but I've added a patch to make the STM more robust in the face >>> of a nil transaction ID, and have updated Avout to version 0.5.1. >>> >>> Can you guys give the version 0.5.1 a try and see if makes a difference? >>> >>> If you still see the problem, another diagnostic would be to create a ref >>> without an initial value, and see if that succeeds, then try setting the >>> value. >>> >>> (def r1 (zk-ref client "/r1")) >>> (dosync!! client (ref-set!! r1 0)) >>> >>> Thanks again, >>> David >>> >>> >>> >>> On Dec 1, 2011, at 11:20 AM, Sam Aaron wrote: >>> >>>> Hi David, >>>> >>>> I nuked all my zookeeper deps in my lib and ~/.m2 dirs, but similar to >>>> Edmund experience it doesn't fix anything. My stacktrace is also identical: >>>> >>>> ∴ /Users/sam/tmp/avv >>>> >>>> λ lein deps >>>> >>>> Downloading: zookeeper-clj/zookeeper-clj/0.9.0/zookeeper-clj-0.9.0.pom >>>> from repository clojars at http://clojars.org/repo/ >>>> Transferring 2K from clojars >>>> >>>> Downloading: zookeeper-clj/zookeeper-clj/0.9.0/zookeeper-clj-0.9.0.jar >>>> from repository clojars at http://clojars.org/repo/ >>>> Transferring 9K from clojars >>>> >>>> Copying 8 files to /Users/sam/tmp/avv/lib >>>> >>>> Copying 5 files to /Users/sam/tmp/avv/lib/dev >>>> >>>> >>>> ∴ /Users/sam/tmp/avv >>>> >>>> λ lein repl >>>> >>>> Listening for transport dt_socket at address: 52602 >>>> >>>> REPL started; server listening on localhost port 33063 >>>> >>>> user=> (use 'avout.core) >>>> >>>> log4j:WARN No appenders could be found for logger >>>> (org.apache.zookeeper.ZooKeeper). >>>> >>>> log4j:WARN Please initialize the log4j system properly. >>>> >>>> log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for >>>> more info. >>>> nil >>>> >>>> user=> (def client (connect "127.0.0.1")) >>>> >>>> #'user/client >>>> >>>> user=> (def r0 (zk-ref client "/r0" 0)) >>>> >>>> java.lang.IllegalArgumentException: Path must not end with / character >>>> >>>> run-in-transaction exception: #<IllegalArgumentException >>>> java.lang.IllegalArgumentException: Path must not end with / character> >>>> nil >>>> at >>>> org.apache.zookeeper.common.PathUtils.validatePath(PathUtils.java:58) >>>> >>>> at org.apache.zookeeper.ZooKeeper.setData(ZooKeeper.java:1025) >>>> >>>> at zookeeper$set_data.doInvoke(zookeeper.clj:394) >>>> >>>> at clojure.lang.RestFn.invoke(RestFn.java:470) >>>> >>>> at avout.transaction$update_txn_state.invoke(transaction.clj:82) >>>> >>>> at avout.transaction$stop$fn__1104.invoke(transaction.clj:239) >>>> >>>> at avout.transaction$stop.invoke(transaction.clj:238) >>>> >>>> at >>>> avout.transaction.LockingTransaction$fn__1117.invoke(transaction.clj:321) >>>> >>>> at >>>> avout.transaction.LockingTransaction.runInTransaction(transaction.clj:301) >>>> >>>> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) >>>> >>>> at >>>> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) >>>> >>>> at >>>> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) >>>> >>>> at java.lang.reflect.Method.invoke(Method.java:597) >>>> >>>> at clojure.lang.Reflector.invokeMatchingMethod(Reflector.java:92) >>>> >>>> at >>>> clojure.lang.Reflector.invokeInstanceMethod(Reflector.java:30#'user/r0 >>>> >>>> user=> ) >>>> >>>> at avout.transaction$run_in_transaction.invoke(transaction.clj:354) >>>> >>>> at avout.core$zk_ref.doInvoke(core.clj:51) >>>> >>>> at clojure.lang.RestFn.invoke(RestFn.java:445) >>>> >>>> at clojure.lang.AFn.applyToHelper(AFn.java:167) >>>> >>>> at clojure.lang.RestFn.applyTo(RestFn.java:132) >>>> >>>> at clojure.lang.Compiler$InvokeExpr.eval(Compiler.java:3337) >>>> >>>> at clojure.lang.Compiler$DefExpr.eval(Compiler.java:375) >>>> >>>> at clojure.lang.Compiler.eval(Compiler.java:6470) >>>> >>>> at clojure.lang.Compiler.eval(Compiler.java:6431) >>>> >>>> at clojure.core$eval.invoke(core.clj:2795) >>>> >>>> at clojure.main$repl$read_eval_print__5967.invoke(main.clj:244) >>>> >>>> at clojure.main$repl$fn__5972.invoke(main.clj:265) >>>> >>>> at clojure.main$repl.doInvoke(main.clj:265) >>>> >>>> at clojure.lang.RestFn.invoke(RestFn.java:512) >>>> >>>> at user$eval27$acc__3869__auto____30$fn__32.invoke(NO_SOURCE_FILE:1) >>>> >>>> at clojure.lang.AFn.run(AFn.java:24) >>>> >>>> at java.lang.Thread.run(Thread.java:680) >>>> >>>> >>>> Sam >>>> >>>> --- >>>> http://sam.aaron.name >>>> >>>> On 1 Dec 2011, at 15:39, David Edgar Liebke wrote: >>>> >>>>> Hi Sam, >>>>> >>>>>> run-in-transaction exception: #<IllegalArgumentException >>>>>> java.lang.IllegalArgumentException: Path must not end with / character> >>>>>> nil >>>>> >>>>> Very interesting, I wouldn't expect that particular exception unless you >>>>> named the zk-ref "/r0/" instead of "/r0", which you apparently didn't. >>>>> >>>>> And even when I do call it "/r0/" I get the "Path must not end with / >>>>> character" exception at a different point in the code, which is probably >>>>> the result of a patch I added to zookeeper-clj yesterday. >>>>> >>>>> Can you try deleting the zookeeper-clj jar file from your dependencies, >>>>> blowing about your ~/.m2/repository/zookeeper-clj directory, reloading >>>>> your deps, and trying again? >>>>> >>>>> David >>>>> >>>>> >>>>> On Dec 1, 2011, at 10:04 AM, Sam Aaron wrote: >>>>> >>>>>> Hi David, >>>>>> >>>>>> I'm super excited by Avout. It seems *better* than magic in that it not >>>>>> only appears to make complicated things possible, but also in a >>>>>> conceptually transparent way. Crazy cool. >>>>>> >>>>>> I'm about to look into this in detail, but I thought I'd just post an >>>>>> issue I'm having with the basic example just on the off-chance that I'm >>>>>> doing something obviously wrong. >>>>>> >>>>>> I have zookeeper 3.3.3 installed running on port 2181 with a valid >>>>>> dataDir path with the appropriate permissions. I'm got avout 0.5.0 and >>>>>> in a REPL session I do the following: >>>>>> >>>>>> ; SLIME 2009-10-15 >>>>>> >>>>>> user> (use 'avout.core) >>>>>> >>>>>> nil >>>>>> >>>>>> user> (def client (connect "127.0.0.1")) >>>>>> >>>>>> #'user/client >>>>>> >>>>>> user> (def r0 (zk-ref client "/r0" 0)) >>>>>> >>>>>> run-in-transaction exception: #<IllegalArgumentException >>>>>> java.lang.IllegalArgumentException: Path must not end with / character> >>>>>> nil >>>>>> #'user/r0 >>>>>> >>>>>> user> r0 >>>>>> >>>>>> #<DistributedReference@761b2f32: nil> >>>>>> >>>>>> user> @r0 >>>>>> >>>>>> nil >>>>>> >>>>>> >>>>>> Sam >>>>>> >>>>>> --- >>>>>> http://sam.aaron.name >>>>>> >>>>>> >>>>>> On 29 Nov 2011, at 17:38, liebke wrote: >>>>>> >>>>>>> Today we are releasing Avout, which brings Clojure's in-memory model >>>>>>> of state to distributed application development by providing a >>>>>>> distributed implementation of Clojure's Multiversion Concurrency >>>>>>> Control (MVCC) STM along with distributable, durable, and extendable >>>>>>> versions of Clojure's Atom and Ref concurrency primitives. >>>>>>> >>>>>>> Here's the post announcing the project: >>>>>>> http://clojure.com/blog/2011/11/29/avout.html >>>>>>> >>>>>>> And here's the project's website: http://avout.io >>>>>>> >>>>>>> >>>>>>> David >>>>>>> >>>>>>> -- >>>>>>> You received this message because you are subscribed to the Google >>>>>>> Groups "Clojure" group. >>>>>>> To post to this group, send email to clojure@googlegroups.com >>>>>>> Note that posts from new members are moderated - please be patient with >>>>>>> your first post. >>>>>>> To unsubscribe from this group, send email to >>>>>>> clojure+unsubscr...@googlegroups.com >>>>>>> For more options, visit this group at >>>>>>> http://groups.google.com/group/clojure?hl=en >>>>>> >>>>>> -- >>>>>> You received this message because you are subscribed to the Google >>>>>> Groups "Clojure" group. >>>>>> To post to this group, send email to clojure@googlegroups.com >>>>>> Note that posts from new members are moderated - please be patient with >>>>>> your first post. >>>>>> To unsubscribe from this group, send email to >>>>>> clojure+unsubscr...@googlegroups.com >>>>>> For more options, visit this group at >>>>>> http://groups.google.com/group/clojure?hl=en >>>>> >>>>> -- >>>>> You received this message because you are subscribed to the Google >>>>> Groups "Clojure" group. >>>>> To post to this group, send email to clojure@googlegroups.com >>>>> Note that posts from new members are moderated - please be patient with >>>>> your first post. >>>>> To unsubscribe from this group, send email to >>>>> clojure+unsubscr...@googlegroups.com >>>>> For more options, visit this group at >>>>> http://groups.google.com/group/clojure?hl=en >>>> >>>> -- >>>> You received this message because you are subscribed to the Google >>>> Groups "Clojure" group. >>>> To post to this group, send email to clojure@googlegroups.com >>>> Note that posts from new members are moderated - please be patient with >>>> your first post. >>>> To unsubscribe from this group, send email to >>>> clojure+unsubscr...@googlegroups.com >>>> For more options, visit this group at >>>> http://groups.google.com/group/clojure?hl=en >>> >>> -- >>> You received this message because you are subscribed to the Google >>> Groups "Clojure" group. >>> To post to this group, send email to clojure@googlegroups.com >>> Note that posts from new members are moderated - please be patient with >>> your first post. >>> To unsubscribe from this group, send email to >>> clojure+unsubscr...@googlegroups.com >>> For more options, visit this group at >>> http://groups.google.com/group/clojure?hl=en >> >> -- >> You received this message because you are subscribed to the Google >> Groups "Clojure" group. >> To post to this group, send email to clojure@googlegroups.com >> Note that posts from new members are moderated - please be patient with your >> first post. >> To unsubscribe from this group, send email to >> clojure+unsubscr...@googlegroups.com >> For more options, visit this group at >> http://groups.google.com/group/clojure?hl=en > > -- > You received this message because you are subscribed to the Google > Groups "Clojure" group. > To post to this group, send email to clojure@googlegroups.com > Note that posts from new members are moderated - please be patient with your > first post. > To unsubscribe from this group, send email to > clojure+unsubscr...@googlegroups.com > For more options, visit this group at > http://groups.google.com/group/clojure?hl=en -- You received this message because you are subscribed to the Google Groups "Clojure" group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en