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.

Reply via email to