       ; the conv-actor update?
       (try
         (log/info "Preparing to re-queue votes for failed conversation update for" zid-str)
+        ;; XXX Should we check if the queue got close due to error or manager close, and log?
         (async/go (async/>! queue [:votes votes]))
         (catch Exception qe
           (log/error "Unable to re-queue votes after conversation update failed for" zid-str)

                (flatten))))))


(defn new-conv-actor [init-fn & opts]
  "Create a new conv actor which responds to snd. Messages should look like [<t> [...]], where <t> is either :votes or
  :moderation, depending on what kind of batch is being sent/processed. Implements deref for state retrieval."
  (let [msgbox (chan Long/MAX_VALUE) ; we want this to be as big as possible, since backpressure doesn't really work
        conv (atom (init-fn)) ; keep track of conv state in atom so it can be dereffed
        ca (ConvActor. msgbox conv)
        err-handler (build-update-error-handler msgbox ca)]
    ; Initialize the go loop which watches the mailbox, and runs updates all all pending messages when they
    ; arrive
    (go-loop []
      (try
        (let [first-msg (<! msgbox) ; do this so we park efficiently
              msgs      (take-all! msgbox)
              msgs      (concat [first-msg] msgs)
              {votes :votes mods :moderation}
                        (split-batches msgs)]
          (when mods
            (swap! conv conv/mod-update mods))
          (swap! conv update-fn (or votes []) err-handler))
        (catch Exception e
          (log/error "Excpetion not handler by err-handler:" e)
          (.printStackTrace e)))
      (recur))
    ca))



        :group-votes})))


(defn handle-profile-data
  "For now, just log profile data. Eventually want to send to influxDB and graphite."
  [conv-man conv & {:keys [recompute n-votes finish-time] :as extra-data}]
  (if-let [prof-atom (:profile-data conv)]
    (let [prof @prof-atom
          tot (apply + (map second prof))
