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

From: Robert Brown <[email-masked]>
Date: Mon, 28 Dec 2015 13:18:47 -0500

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.

On Sun, Dec 27, 2015 at 3:41 PM, Lars Ingebrigtsen <[email-masked]> wrote:
> Robert Brown <[email-masked]> writes:
>
>> I use ERC to connect to IRC servers.  ERC's automatic reconnection
>> feature does not appear to work when the IRC server initiates the
>> disconnection.  I have erc-server-reconnect-attempts set to t.
>>
>> Here is a recent example:
>>
>> *** netjoin: *.net *.split, 20 were split                               [10:15]
>> ==> ERROR from irc.freenode.net: Closing Link: nat/google/x-onzfdymblldcwdch
>>     (Ping timeout: 272 seconds)                                         [10:47]
>> *** irc.freenode.net closed
>>
>> Connection failed!  Not re-establishing connection.
>>
>> *** ERC terminated: finished
>
> Can you load an uncompiled erc source and then edebug through this to
> see what it is that says that we don't want to connect?
>
> (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))))
>
> My guess would be erc-server-error-occurred, and in that case I wonder
> what triggered that variable to become set.
>
> --
> (domestic pets only, the antidote for overdose, milk.)
>    bloggy blog: http://lars.ingebrigtsen.no