From 957bdad7836f009da1358000d4fc7e9c7af91726 Mon Sep 17 00:00:00 2001 From: Paul Lorenz Date: Mon, 29 Jan 2024 12:51:17 -0500 Subject: [PATCH] Ensure reconnecting channel is marked as connected before calling reconnect callback. Fixes #125 --- reconnecting_dialer.go | 50 +++++++++++++++++++++++------------------- 1 file changed, 28 insertions(+), 22 deletions(-) diff --git a/reconnecting_dialer.go b/reconnecting_dialer.go index e4eaa04..24ef929 100644 --- a/reconnecting_dialer.go +++ b/reconnecting_dialer.go @@ -99,35 +99,41 @@ func (dialer *reconnectingDialer) Reconnect(impl *reconnectingImpl) error { dialer.reconnectLock.Lock() defer dialer.reconnectLock.Unlock() - impl.reconnecting.Store(true) - defer impl.reconnecting.Store(false) - - if err := impl.pingInstance(); err != nil { + if err := impl.pingInstance(); err == nil { + return nil + } else { log.Errorf("unable to ping (%s)", err) - for i := 0; true; i++ { - peer, err := dialer.endpoint.Dial("reconnecting", dialer.identity, impl.timeout, dialer.tcfg) - if err == nil { - impl.peer = peer - if err := dialer.sendHello(impl); err == nil { - if dialer.reconnectHandler != nil { - dialer.reconnectHandler() - } - return nil - } else { - if version, ok := GetRetryVersion(err); ok { - impl.setProtocolVersion(version) - } - log.Errorf("hello attempt [#%d] failed (%s)", i+1, err) - time.Sleep(5 * time.Second) - } + } + impl.reconnecting.Store(true) + defer func() { + impl.reconnecting.Store(false) + if dialer.reconnectHandler != nil { + dialer.reconnectHandler() + } + }() + + attempt := 0 + for { + attempt++ + peer, err := dialer.endpoint.Dial("reconnecting", dialer.identity, impl.timeout, dialer.tcfg) + if err == nil { + impl.peer = peer + if err := dialer.sendHello(impl); err == nil { + return nil } else { - log.Errorf("reconnection attempt [#%d] failed (%s)", i+1, err) + if version, ok := GetRetryVersion(err); ok { + impl.setProtocolVersion(version) + } + log.Errorf("hello attempt [#%d] failed (%s)", attempt, err) time.Sleep(5 * time.Second) } + + } else { + log.Errorf("reconnection attempt [#%d] failed (%s)", attempt, err) + time.Sleep(5 * time.Second) } } - return nil } func (dialer *reconnectingDialer) sendHello(impl *reconnectingImpl) error {