...

Source file src/github.com/redis/go-redis/v9/internal/pool/conn_check.go

Documentation: github.com/redis/go-redis/v9/internal/pool

     1  //go:build linux || darwin || dragonfly || freebsd || netbsd || openbsd || solaris || illumos
     2  
     3  package pool
     4  
     5  import (
     6  	"errors"
     7  	"io"
     8  	"net"
     9  	"syscall"
    10  	"time"
    11  )
    12  
    13  var errUnexpectedRead = errors.New("unexpected read from socket")
    14  
    15  func connCheck(conn net.Conn) error {
    16  	// Reset previous timeout.
    17  	_ = conn.SetDeadline(time.Time{})
    18  
    19  	sysConn, ok := conn.(syscall.Conn)
    20  	if !ok {
    21  		return nil
    22  	}
    23  	rawConn, err := sysConn.SyscallConn()
    24  	if err != nil {
    25  		return err
    26  	}
    27  
    28  	var sysErr error
    29  
    30  	if err := rawConn.Read(func(fd uintptr) bool {
    31  		var buf [1]byte
    32  		n, err := syscall.Read(int(fd), buf[:])
    33  		switch {
    34  		case n == 0 && err == nil:
    35  			sysErr = io.EOF
    36  		case n > 0:
    37  			sysErr = errUnexpectedRead
    38  		case err == syscall.EAGAIN || err == syscall.EWOULDBLOCK:
    39  			sysErr = nil
    40  		default:
    41  			sysErr = err
    42  		}
    43  		return true
    44  	}); err != nil {
    45  		return err
    46  	}
    47  
    48  	return sysErr
    49  }
    50  

View as plain text