Subject: bug#18527: 24.3; ERC does not reconnect when server disconnects me

From: Lars Ingebrigtsen <[email-masked]>
Date: Mon, 28 Dec 2015 19:23:38 +0100

Robert Brown <[email-masked]> writes:

> Thanks for getting back to me about this issue.  It's been several
> months since I reported the reconnection problem.  I have been
> able to work around it by setting erc-server-error-occurred to nil
> in a disconnect hook:
>
> (add-hook 'erc-disconnected-hook
>           #'(lambda (nick host-name reason)
>               ;; Re-establish the connection even if the server closed it.
>               (setq erc-server-error-occurred nil)))
>
> So yes, when the root cause of the disconnection is a server error,
> erc-server-error-occurred is set to true and the reconnect logic
> in erc-server-reconnect-p is bypassed ... so reconnection does not
> happen.
>
> In the example I sent you, I believe the server closed the connection
> and erc-server-error-occurred was set to true because of a ping
> timeout.
>
> I would prefer that erc-server-reconnect-p not check
> erc-server-error-occurred so that reconnection can happen even
> if the cause of the disconnect was a server error.

I think that sounds reasonable, but there may be reasons for that logic.
I've Cc'd the erc mailing list to see whether they have any comments...

This is the function that determines whether to reconnect, and the
suggestion is to remove the line about erc-server-error-occurred:

(defsubst erc-server-reconnect-p (event)
  "Return non-nil if ERC should attempt to reconnect automatically.
EVENT is the message received from the closed connection process."
  (or erc-server-reconnecting
      (and erc-server-auto-reconnect
           (not erc-server-banned)
           (not erc-server-error-occurred)
           ;; make sure we don't infinitely try to reconnect, unless the
           ;; user wants that
           (or (eq erc-server-reconnect-attempts t)
               (and (integerp erc-server-reconnect-attempts)
                    (< erc-server-reconnect-count
                       erc-server-reconnect-attempts)))
           (or erc-server-timed-out
               (not (string-match "^deleted" event)))
           ;; open-network-stream-nowait error for connection refused
           (if (string-match "^failed with code 111" event) 'nonblocking t))))

-- 
(domestic pets only, the antidote for overdose, milk.)
   bloggy blog: http://lars.ingebrigtsen.no