diff options
Diffstat (limited to 'vendor/github.com/google/gops/agent')
-rw-r--r-- | vendor/github.com/google/gops/agent/agent.go | 15 | ||||
-rw-r--r-- | vendor/github.com/google/gops/agent/sockopt_unix.go | 36 | ||||
-rw-r--r-- | vendor/github.com/google/gops/agent/sockopt_unsupported.go | 13 |
3 files changed, 62 insertions, 2 deletions
diff --git a/vendor/github.com/google/gops/agent/agent.go b/vendor/github.com/google/gops/agent/agent.go index 59a03cf5..441814c9 100644 --- a/vendor/github.com/google/gops/agent/agent.go +++ b/vendor/github.com/google/gops/agent/agent.go @@ -8,6 +8,7 @@ package agent import ( "bufio" + "context" "encoding/binary" "fmt" "io" @@ -55,6 +56,13 @@ type Options struct { // can call Close before shutting down. // Optional. ShutdownCleanup bool + + // ReuseSocketAddrAndPort determines whether the SO_REUSEADDR and + // SO_REUSEADDR socket options should be set on the listening socket of + // the agent. This option is only effective on unix-like OSes and if + // Addr is set to a fixed host:port. + // Optional. + ReuseSocketAddrAndPort bool } // Listen starts the gops agent on a host process. Once agent started, users @@ -96,11 +104,14 @@ func Listen(opts Options) error { if addr == "" { addr = defaultAddr } - ln, err := net.Listen("tcp", addr) + var lc net.ListenConfig + if opts.ReuseSocketAddrAndPort { + lc.Control = setsockoptReuseAddrAndPort + } + listener, err = lc.Listen(context.Background(), "tcp", addr) if err != nil { return err } - listener = ln port := listener.Addr().(*net.TCPAddr).Port portfile = fmt.Sprintf("%s/%d", gopsdir, os.Getpid()) err = ioutil.WriteFile(portfile, []byte(strconv.Itoa(port)), os.ModePerm) diff --git a/vendor/github.com/google/gops/agent/sockopt_unix.go b/vendor/github.com/google/gops/agent/sockopt_unix.go new file mode 100644 index 00000000..7edaf209 --- /dev/null +++ b/vendor/github.com/google/gops/agent/sockopt_unix.go @@ -0,0 +1,36 @@ +// Copyright 2020 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build !js,!plan9,!windows + +package agent + +import ( + "syscall" + + "golang.org/x/sys/unix" +) + +// setsockoptReuseAddrAndPort sets the SO_REUSEADDR and SO_REUSEPORT socket +// options on c's underlying socket in order to increase the chance to re-bind() +// to the same address and port upon agent restart. +func setsockoptReuseAddrAndPort(network, address string, c syscall.RawConn) error { + var soerr error + if err := c.Control(func(su uintptr) { + sock := int(su) + // Allow reuse of recently-used addresses. This socket option is + // set by default on listeners in Go's net package, see + // net.setDefaultSockopts. + soerr = unix.SetsockoptInt(sock, unix.SOL_SOCKET, unix.SO_REUSEADDR, 1) + if soerr != nil { + return + } + // Allow reuse of recently-used ports. This gives the agent a + // better chance to re-bind upon restarts. + soerr = unix.SetsockoptInt(sock, unix.SOL_SOCKET, unix.SO_REUSEPORT, 1) + }); err != nil { + return err + } + return soerr +} diff --git a/vendor/github.com/google/gops/agent/sockopt_unsupported.go b/vendor/github.com/google/gops/agent/sockopt_unsupported.go new file mode 100644 index 00000000..df3223bd --- /dev/null +++ b/vendor/github.com/google/gops/agent/sockopt_unsupported.go @@ -0,0 +1,13 @@ +// Copyright 2020 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build js,wasm plan9 windows + +package agent + +import "syscall" + +func setsockoptReuseAddrAndPort(network, address string, c syscall.RawConn) error { + return nil +} |