Welcome! Please see the About page for a little more info on how this works.

0 votes
in core.async by
When a large number of channels is added to a mix simultaneously, this error is thrown:

{{java.lang.AssertionError: Assert failed: No more than 1024 pending puts are allowed on a single channel. Consider using a windowed buffer.}}

We can reproduce the issue with the following in a REPL:


user> (require '[clojure.core.async :as a])
nil
user> (defn mixtest []
  (let [out (a/chan 1024)
        mix (a/mix out)]
    (dotimes [i 2048]
      (let [chan (a/chan)]
        (a/admix mix chan)
        (a/put! chan i)))))

(mixtest)
#'user/mixtestAssertionError Assert failed: No more than 1024 pending puts are allowed on a single channel. Consider using a windowed buffer.
(< (.size puts) impl/MAX-QUEUE-SIZE)  clojure.core.async.impl.channels.ManyToManyChannel (channels.clj:150)
user>

This is a consequence of the use of an unbuffered channel in the mix implementation. Since the channel's function is just to update the mix's internal data structure, using a windowed buffered channel appears to clear up this issue. Patch 0001-Change-channel-to-sliding-buffer.patch contains the proposed solution.

2 Answers

0 votes
by

Comment made by: angusiguess

Update patch to include cljs fix as well.

0 votes
by
Reference: https://clojure.atlassian.net/browse/ASYNC-145 (reported by angusiguess)
...