Fix msg delivery timeouts

This commit is contained in:
Zoltán Papp
2024-06-26 16:22:26 +02:00
parent f0eb004582
commit c0efce6556
7 changed files with 40 additions and 36 deletions
+25 -16
View File
@@ -250,13 +250,6 @@ func (c *Client) connect() error {
}
func (c *Client) handShake() error {
defer func() {
err := c.relayConn.SetReadDeadline(time.Time{})
if err != nil {
log.Errorf("failed to reset read deadline: %s", err)
}
}()
msg, err := messages.MarshalHelloMsg(c.hashedID)
if err != nil {
log.Errorf("failed to marshal hello message: %s", err)
@@ -267,15 +260,8 @@ func (c *Client) handShake() error {
log.Errorf("failed to send hello message: %s", err)
return err
}
err = c.relayConn.SetReadDeadline(time.Now().Add(serverResponseTimeout))
if err != nil {
log.Errorf("failed to set read deadline: %s", err)
return err
}
buf := make([]byte, 1500) // todo: optimise buffer size
n, err := c.relayConn.Read(buf)
buf := make([]byte, messages.MaxHandshakeSize)
n, err := c.readWithTimeout(buf)
if err != nil {
log.Errorf("failed to read hello response: %s", err)
return err
@@ -391,6 +377,29 @@ func (c *Client) closeAllConns() {
c.conns = make(map[string]*connContainer)
}
func (c *Client) readWithTimeout(buf []byte) (int, error) {
ctx, cancel := context.WithTimeout(c.parentCtx, serverResponseTimeout)
defer cancel()
readDone := make(chan struct{})
var (
n int
err error
)
go func() {
n, err = c.relayConn.Read(buf)
close(readDone)
}()
select {
case <-ctx.Done():
return 0, fmt.Errorf("read operation timed out")
case <-readDone:
return n, err
}
}
// todo check by reference too, the id is not enought because the id come from the outer conn
func (c *Client) closeConn(id string) error {
c.mu.Lock()
@@ -51,27 +51,14 @@ func (c *Conn) LocalAddr() net.Addr {
}
func (c *Conn) SetReadDeadline(t time.Time) error {
// todo: implement me
return nil
}
func (c *Conn) SetWriteDeadline(t time.Time) error {
// todo: implement me
return nil
}
func (c *Conn) SetDeadline(t time.Time) error {
// todo: implement me
errR := c.SetReadDeadline(t)
errW := c.SetWriteDeadline(t)
if errR != nil {
return errR
}
if errW != nil {
return errW
}
return nil
}
-1
View File
@@ -194,7 +194,6 @@ func (m *Manager) isForeignServer(address string) (bool, error) {
if err != nil {
return false, fmt.Errorf("relay client not connected")
}
log.Debugf("check if foreign server: %s != %s", rAddr.String(), address)
return rAddr.String() != address, nil
}