...

Source file src/google.golang.org/api/transport/grpc/dial_socketopt.go

Documentation: google.golang.org/api/transport/grpc

     1  // Copyright 2019 Google LLC.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  //go:build go1.11 && linux
     6  // +build go1.11,linux
     7  
     8  package grpc
     9  
    10  import (
    11  	"context"
    12  	"net"
    13  	"syscall"
    14  
    15  	"google.golang.org/grpc"
    16  )
    17  
    18  const (
    19  	// defaultTCPUserTimeout is the default TCP_USER_TIMEOUT socket option. By
    20  	// default is 20 seconds.
    21  	tcpUserTimeoutMilliseconds = 20000
    22  
    23  	// Copied from golang.org/x/sys/unix.TCP_USER_TIMEOUT.
    24  	tcpUserTimeoutOp = 0x12
    25  )
    26  
    27  func init() {
    28  	// timeoutDialerOption is a grpc.DialOption that contains dialer with
    29  	// socket option TCP_USER_TIMEOUT. This dialer requires go versions 1.11+.
    30  	timeoutDialerOption = grpc.WithContextDialer(dialTCPUserTimeout)
    31  }
    32  
    33  func dialTCPUserTimeout(ctx context.Context, addr string) (net.Conn, error) {
    34  	control := func(network, address string, c syscall.RawConn) error {
    35  		var syscallErr error
    36  		controlErr := c.Control(func(fd uintptr) {
    37  			syscallErr = syscall.SetsockoptInt(
    38  				int(fd), syscall.IPPROTO_TCP, tcpUserTimeoutOp, tcpUserTimeoutMilliseconds)
    39  		})
    40  		if syscallErr != nil {
    41  			return syscallErr
    42  		}
    43  		if controlErr != nil {
    44  			return controlErr
    45  		}
    46  		return nil
    47  	}
    48  	d := &net.Dialer{
    49  		Control: control,
    50  	}
    51  	return d.DialContext(ctx, "tcp", addr)
    52  }
    53  

View as plain text