Stack overflow in compojure web project
        Posted  
        
            by Anders Rune Jensen
        on Stack Overflow
        
        See other posts from Stack Overflow
        
            or by Anders Rune Jensen
        
        
        
        Published on 2010-04-30T22:39:13Z
        Indexed on 
            2010/05/03
            9:28 UTC
        
        
        Read the original article
        Hit count: 795
        
Hi
I've been playing around with clojure and have been using it to build a simple little audio player. The strange thing is that sometimes, maybe one out of twenty, when contacting the server I will get the following error:
2010-04-20 15:33:20.963::WARN:  Error for /control
java.lang.StackOverflowError
    at clojure.lang.RT.seq(RT.java:440)
    at clojure.core$seq__4245.invoke(core.clj:105)
    at clojure.core$filter__5084$fn__5086.invoke(core.clj:1794)
    at clojure.lang.LazySeq.sval(LazySeq.java:42)
    at clojure.lang.LazySeq.seq(LazySeq.java:56)
    at clojure.lang.RT.seq(RT.java:440)
    at clojure.core$seq__4245.invoke(core.clj:105)
    at clojure.core$filter__5084$fn__5086.invoke(core.clj:1794)
    at clojure.lang.LazySeq.sval(LazySeq.java:42)
    at clojure.lang.LazySeq.seq(LazySeq.java:56)
    at clojure.lang.RT.seq(RT.java:440)
    at clojure.core$seq__4245.invoke(core.clj:105)
    at clojure.core$filter__5084$fn__5086.invoke(core.clj:1794)
    at clojure.lang.LazySeq.sval(LazySeq.java:42)
    at clojure.lang.LazySeq.seq(LazySeq.java:56)
    at clojure.lang.RT.seq(RT.java:440)
    at clojure.core$seq__4245.invoke(core.clj:105)
    at clojure.core$filter__5084$fn__5086.invoke(core.clj:1794)
    at clojure.lang.LazySeq.sval(LazySeq.java:42)
    at clojure.lang.LazySeq.seq(LazySeq.java:56)
    at clojure.lang.RT.seq(RT.java:440)
        ...
If I do it right after again it always works. So it appears to be related to timing or something. The code in question is:
(defn add-track [t]
  (common/ref-add tracks t))
(defn add-collection [coll]
  (doseq [track coll] (add-track track)))
and
(defn ref-add [ref value]
  (dosync (ref-set ref (conj @ref value))))
where coll is extracted from this function:
(defn tracks-by-album [album]
  (sort sort-tracks (filter #(= (:album %) album) @tracks)))
which uses:
(defn get-album-from-track [track]
  (seq/find-first #(= (:album track) (:name %)) @albums))
(defn sort-tracks [track1 track2]
  (cond (= (:album track1) (:album track2))
    (cond (and (:album-track track1) (:album-track track2))
      (< (:album-track track1) (:album-track track2))
      :else 0)
    :else
     (> (:year (get-album-from-track track1)) (:year (get-album-from-track track2)))))
it gets called more or less directly from the request I get in:
(when-handle-command cmd params (audio/tracks-by-album decoded-name))
(defn when-handle-command [cmd params data]
  (println (str "handling command:" cmd))
    ....)
I never get the handling command in my log, so it must die when it does the tracks-by-album.
so it does appear to be the tracks-by-album function from the stack trace. I just don't see why it sometimes works and sometimes doesn't. I say that it's tracks-by-album because it's the only function (including it's children) that does filter, as can be seen in the trace.
All the source code is available at: http://code.google.com/p/mucomp/. It's my little hobby project to learn clojure and so far it's quite buggy (this is just one bug :)) so I havn't really liked to tell too many people about it yet :)
© Stack Overflow or respective owner