I think my monkey-patch of jdbc/transaction didn't take. Doing user/sourcery on it shows your version, but doing a macroexpand-all shows the original.
My code calls via korma as kdb: => (clojure.walk/macroexpand-all '(kdb/transaction nil)) (if (clojure.java.jdbc/find-connection) (clojure.java.jdbc/transaction* (fn* [] nil)) (clojure.java.jdbc/with-connection* (korma.db/get-connection (clojure.core/deref korma.db/_default)) (fn* ([] (clojure.java.jdbc/transaction* (fn* [] nil)))))) I thought I could get it to take by doing a (require 'clojure.java.jdbc) and applying the patch before doing a require on korma, but that doesn't seem to help. (require 'clojure.java.jdbc) ; XXX monkey-patch jdbc to avoid head retention bug (in-ns 'clojure.java.jdbc) (defmacro transaction [& body] `(transaction* (^:once fn* [] ~@body))) (ns <blahblah> (:require [korma.db as kdb])) .. and restart the repl, but macroexpand-all still gives me the result above. On Wednesday, September 11, 2013 1:45:41 PM UTC-7, Christophe Grand wrote: > > I don't get the same results: > > $ LEIN_JVM_OPTS=-Xmx20M lein repl > nREPL server started on port 61221 on host 127.0.0.1 > REPL-y 0.2.1 > Clojure 1.5.1 > Docs: (doc function-name-here) > (find-doc "part-of-name-here") > Source: (source function-name-here) > Javadoc: (javadoc java-object-or-class-here) > Exit: Control+D or (exit) or (quit) > > user=> (defn f [g] (g)) > #'user/f > user=> (defn t1 [n c] (f (fn [] (dorun (map identity c))))) > #'user/t1 > user=> (t1 0 (range 1000000)) > > OutOfMemoryError GC overhead limit exceeded java.lang.Long.valueOf > (Long.java:577) > user=> (defn t2 [n c] (f (fn [] (doseq [x c] (identity x))))) > #'user/t2 > user=> (defn t1 [n c] (f (^:once fn* [] (dorun (map identity c))))) > #'user/t1 > user=> (t1 0 (range 1000000)) > nil > user=> (t2 0 (range 1000000)) > > OutOfMemoryError GC overhead limit exceeded > clojure.lang.ChunkBuffer.chunk (ChunkBuffer.java:29) > > BUT this is because the previous OOM left the JVM in a dirty state: try to > reorder your expressions: > > $ LEIN_JVM_OPTS=-Xmx20M lein repl > nREPL server started on port 61245 on host 127.0.0.1 > REPL-y 0.2.1 > Clojure 1.5.1 > Docs: (doc function-name-here) > (find-doc "part-of-name-here") > Source: (source function-name-here) > Javadoc: (javadoc java-object-or-class-here) > Exit: Control+D or (exit) or (quit) > > user=> (defn f [g] (g)) > #'user/f > user=> (defn t2 [n c] (f (fn [] (doseq [x c] (identity x))))) > #'user/t2 > user=> (t2 0 (range 1000000)) > nil > > ^^this last one failed in the previous run. > > I'm not quite sure about why the doseq version works -- I would have to > research a bit. My gut feeling is that doseq is based on loop and loops are > lifted into ^:once fn* by the compiler in some cases. > https://github.com/clojure/clojure/blob/master/src/jvm/clojure/lang/Compiler.java#L5951 > > > > On Wed, Sep 11, 2013 at 8:20 PM, Brian Craft <craft...@gmail.com<javascript:> > > wrote: > >> Correct, I forgot to paste that part. ;) >> >> >> On Wednesday, September 11, 2013 10:57:09 AM UTC-7, Sean Corfield wrote: >> >>> Just to confirm, (t2 0 (range 1000000)) -- using doseq instead of >>> dorun -- does NOT run out of memory, correct? >>> >>> On Wed, Sep 11, 2013 at 8:59 AM, Brian Craft <craft...@gmail.com> >>> wrote: >>> > This appears to have no effect on the problem. I tested with >>> > jdbc/transaction, and with Sean's simple example: >>> > >>> > user=> (defn f [g] (g)) >>> > #'user/f >>> > user=> (defn t1 [n c] (f (fn [] (dorun (map identity c))))) >>> > #'user/t1 >>> > user=> (t1 0 (range 1000000)) >>> > java.lang.OutOfMemoryError: Java heap space (NO_SOURCE_FILE:0) >>> > user=> (defn t2 [n c] (f (fn [] (doseq [x c] (identity x))))) >>> > #'user/t2 >>> > user=> (defn t1 [n c] (f (^:once fn* [] (dorun (map identity c))))) >>> > #'user/t1 >>> > user=> (t1 0 (range 1000000)) >>> > java.lang.OutOfMemoryError: Java heap space (NO_SOURCE_FILE:0) >>> > >>> > >>> > >>> > On Wednesday, September 11, 2013 7:39:48 AM UTC-7, Christophe Grand >>> wrote: >>> >> >>> >> ^:once on fn* (not fn, the fn macro doesn't propagate metadata) >>> instructs >>> >> the commielr to clear closed-overs ASAP. It follows that you can't >>> call such >>> >> a function twice because it forgets its closed-overs. >>> >> >>> >> >>> >> On Wed, Sep 11, 2013 at 4:36 PM, Brian Craft <craft...@gmail.com> >>> wrote: >>> >>> >>> >>> ugh. Can't find documentation for this. What does it do? >>> >>> >>> >>> On Wednesday, September 11, 2013 2:22:56 AM UTC-7, Christophe Grand >>> >>> wrote: >>> >>>> >>> >>>> >>> >>>> On Wed, Sep 11, 2013 at 6:00 AM, Brian Craft <craft...@gmail.com> >>> wrote: >>> >>>>> >>> >>>>> (defmacro transaction >>> >>>>> [& body] >>> >>>>> `(transaction* (fn [] ~@body))) >>> >>>>> >>> >>>>> I'm not sure how to avoid that. The anonymous function created >>> here >>> >>>>> doesn't take parameters. >>> >>>> >>> >>>> >>> >>>> The fix for this is: >>> >>>> (defmacro transaction >>> >>>> [& body] >>> >>>> `(transaction* (^:once fn* [] ~@body))) >>> >>>> >>> >>>> It should be the default for all one-shot fns. >>> >>>> >>> >>>> Christophe >>> >>>> >>> >>>> -- >>> >>>> On Clojure http://clj-me.cgrand.net/ >>> >>>> Clojure Programming http://clojurebook.com >>> >>>> Training, Consulting & Contracting http://lambdanext.eu/ >>> >> >>> >> >>> >> >>> >> >>> >> -- >>> >> On Clojure http://clj-me.cgrand.net/ >>> >> Clojure Programming http://clojurebook.com >>> >> Training, Consulting & Contracting http://lambdanext.eu/ >>> > >>> > -- >>> > -- >>> > You received this message because you are subscribed to the Google >>> > Groups "Clojure" group. >>> > To post to this group, send email to clo...@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+u...@**googlegroups.com >>> > For more options, visit this group at >>> > http://groups.google.com/**group/clojure?hl=en<http://groups.google.com/group/clojure?hl=en> >>> > >>> > --- >>> > You received this message because you are subscribed to the Google >>> Groups >>> > "Clojure" group. >>> > To unsubscribe from this group and stop receiving emails from it, send >>> an >>> > email to clojure+u...@**googlegroups.com. >>> > For more options, visit >>> > https://groups.google.com/**groups/opt_out<https://groups.google.com/groups/opt_out>. >>> > >>> >>> >>> >>> >>> -- >>> Sean A Corfield -- (904) 302-SEAN >>> An Architect's View -- http://corfield.org/ >>> World Singles, LLC. -- http://worldsingles.com/ >>> >>> "Perfection is the enemy of the good." >>> -- Gustave Flaubert, French realist novelist (1821-1880) >>> >> -- >> -- >> You received this message because you are subscribed to the Google >> Groups "Clojure" group. >> To post to this group, send email to clo...@googlegroups.com<javascript:> >> Note that posts from new members are moderated - please be patient with >> your first post. >> To unsubscribe from this group, send email to >> clojure+u...@googlegroups.com <javascript:> >> 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 unsubscribe from this group and stop receiving emails from it, send an >> email to clojure+u...@googlegroups.com <javascript:>. >> For more options, visit https://groups.google.com/groups/opt_out. >> > > > > -- > On Clojure http://clj-me.cgrand.net/ > Clojure Programming http://clojurebook.com > Training, Consulting & Contracting http://lambdanext.eu/ > -- -- 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 unsubscribe from this group and stop receiving emails from it, send an email to clojure+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/groups/opt_out.