From 0f3b22e8dafd67992bf01e1ba49f9e09637a7204 Mon Sep 17 00:00:00 2001 From: matst80 Date: Sun, 10 Nov 2024 21:02:17 +0100 Subject: [PATCH] implement ping --- synced-pool.go | 36 +++++++++++++++++++++++++++++++++--- tcp-client.go | 18 ++++++++++++------ 2 files changed, 45 insertions(+), 9 deletions(-) diff --git a/synced-pool.go b/synced-pool.go index 5fe5dde..cdbffde 100644 --- a/synced-pool.go +++ b/synced-pool.go @@ -358,6 +358,19 @@ func (p *SyncedPool) addRemoteHost(address string, remote *RemoteHost) error { return nil } +func (h *RemoteHost) Ping() error { + _, err := h.Call(Ping, Pong, nil) + + if err != nil { + h.MissedPings++ + log.Printf("Error pinging remote %s: %v\n, missed pings: %d", h.Host, err, h.MissedPings) + + } else { + h.MissedPings = 0 + } + return err +} + func (p *SyncedPool) AddRemote(host string) error { if host == "" || p.IsKnown(host) { return nil @@ -375,11 +388,28 @@ func (p *SyncedPool) AddRemote(host string) error { //pool := NewRemoteGrainPool(host) remote := RemoteHost{ - Client: client, - // Pool: pool, - Host: host, + Client: client, + MissedPings: 0, + Host: host, } + go func() { + for range time.Tick(time.Second * 2) { + var err error + err = remote.Ping() + if err != nil { + for err != nil { + time.Sleep(time.Millisecond * 200) + err = remote.Ping() + if remote.MissedPings > 3 { + log.Printf("Error pinging remote %s: %v\n, missed pings: %d", host, err, remote.MissedPings) + p.RemoveHost(&remote) + return + } + } + } + } + }() go func() { for range client.Errors { if client.ErrorCount > 3 { diff --git a/tcp-client.go b/tcp-client.go index de6cd2a..4ab01c6 100644 --- a/tcp-client.go +++ b/tcp-client.go @@ -48,10 +48,6 @@ func (m *TCPClient) Connect() error { if m.Conn == nil { connection, err := net.Dial("tcp", m.address) if err != nil { - - m.Errors <- err - m.ErrorCount++ - return err } m.ErrorCount = 0 @@ -60,6 +56,16 @@ func (m *TCPClient) Connect() error { return nil } +func (m *TCPClient) HandleConnectionError(err error) error { + if err != nil { + + m.Errors <- err + m.ErrorCount++ + + } + return err +} + func (m *TCPClient) Close() { m.Conn.Close() } @@ -75,10 +81,10 @@ func (m *TCPClient) SendPacket(messageType uint16, data []byte) error { DataLength: uint16(len(data)), }) if err != nil { - return err + return m.HandleConnectionError(err) } _, err = m.Conn.Write(data) - return err + return m.HandleConnectionError(err) } // func (m *TCPClient) SendPacketFn(messageType uint16, datafn func(w io.Writer) error) error {