reuseport.go 1.29 KB
Newer Older
1 2 3 4 5 6
package tcp

import (
	"os"
	"strings"

7
	"github.com/libp2p/go-reuseport"
8 9 10 11
)

// envReuseport is the env variable name used to turn off reuse port.
// It default to true.
12 13
const envReuseport = "LIBP2P_TCP_REUSEPORT"
const deprecatedEnvReuseport = "IPFS_REUSEPORT"
14 15 16 17 18 19 20 21

// envReuseportVal stores the value of envReuseport. defaults to true.
var envReuseportVal = true

func init() {
	v := strings.ToLower(os.Getenv(envReuseport))
	if v == "false" || v == "f" || v == "0" {
		envReuseportVal = false
22 23 24 25 26 27 28 29 30
		log.Infof("REUSEPORT disabled (LIBP2P_TCP_REUSEPORT=%s)", v)
	}
	v, exist := os.LookupEnv(deprecatedEnvReuseport)
	if exist {
		log.Warning("IPFS_REUSEPORT is deprecated, use LIBP2P_TCP_REUSEPORT instead")
		if v == "false" || v == "f" || v == "0" {
			envReuseportVal = false
			log.Infof("REUSEPORT disabled (IPFS_REUSEPORT=%s)", v)
		}
31 32 33 34 35 36 37
	}
}

// reuseportIsAvailable returns whether reuseport is available to be used. This
// is here because we want to be able to turn reuseport on and off selectively.
// For now we use an ENV variable, as this handles our pressing need:
//
38
//   LIBP2P_TCP_REUSEPORT=false ipfs daemon
39 40 41 42 43 44
//
// If this becomes a sought after feature, we could add this to the config.
// In the end, reuseport is a stop-gap.
func ReuseportIsAvailable() bool {
	return envReuseportVal && reuseport.Available()
}