From 2a7bffc63e6c50c663a13cc73efa0078081bff6e Mon Sep 17 00:00:00 2001 From: James Blair Date: Fri, 18 Aug 2023 12:05:19 +1200 Subject: [PATCH 1/2] Backport export reuse-port and reuse-address so that they cabn be configured via config file. Co-authored-by: Shawn Gerrard Signed-off-by: James Blair --- client/pkg/transport/sockopt.go | 4 ++-- server/embed/config.go | 7 +++++-- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/client/pkg/transport/sockopt.go b/client/pkg/transport/sockopt.go index 38548ddd713..fe028c61323 100644 --- a/client/pkg/transport/sockopt.go +++ b/client/pkg/transport/sockopt.go @@ -21,12 +21,12 @@ type SocketOpts struct { // in which case lock on data file could result in unexpected // condition. User should take caution to protect against lock race. // [1] https://man7.org/linux/man-pages/man7/socket.7.html - ReusePort bool + ReusePort bool `json:"reuse-port"` // ReuseAddress enables a socket option SO_REUSEADDR which allows // binding to an address in `TIME_WAIT` state. Useful to improve MTTR // in cases where etcd slow to restart due to excessive `TIME_WAIT`. // [1] https://man7.org/linux/man-pages/man7/socket.7.html - ReuseAddress bool + ReuseAddress bool `json:"reuse-address"` } func getControls(sopts *SocketOpts) Controls { diff --git a/server/embed/config.go b/server/embed/config.go index ec4da2fbd91..8394b2ae1c5 100644 --- a/server/embed/config.go +++ b/server/embed/config.go @@ -264,7 +264,7 @@ type Config struct { GRPCKeepAliveTimeout time.Duration `json:"grpc-keepalive-timeout"` // SocketOpts are socket options passed to listener config. - SocketOpts transport.SocketOpts + SocketOpts transport.SocketOpts `json:"socket-options"` // PreVote is true to enable Raft Pre-Vote. // If enabled, Raft runs an additional election phase @@ -470,7 +470,10 @@ func NewConfig() *Config { GRPCKeepAliveInterval: DefaultGRPCKeepAliveInterval, GRPCKeepAliveTimeout: DefaultGRPCKeepAliveTimeout, - SocketOpts: transport.SocketOpts{}, + SocketOpts: transport.SocketOpts{ + ReusePort: false, + ReuseAddress: false, + }, TickMs: 100, ElectionMs: 1000, From 164175dfe3a6cd4e320f8471a3a41f9e040aaa79 Mon Sep 17 00:00:00 2001 From: James Blair Date: Fri, 18 Aug 2023 19:14:57 +1200 Subject: [PATCH 2/2] Backport adding unit test for socket options. Co-authored-by: Shawn Gerrard Signed-off-by: James Blair --- server/embed/config_test.go | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/server/embed/config_test.go b/server/embed/config_test.go index a0550a6a288..25331da2d35 100644 --- a/server/embed/config_test.go +++ b/server/embed/config_test.go @@ -42,12 +42,13 @@ func TestConfigFileOtherFields(t *testing.T) { ctls := securityConfig{TrustedCAFile: "cca", CertFile: "ccert", KeyFile: "ckey"} ptls := securityConfig{TrustedCAFile: "pca", CertFile: "pcert", KeyFile: "pkey"} yc := struct { - ClientSecurityCfgFile securityConfig `json:"client-transport-security"` - PeerSecurityCfgFile securityConfig `json:"peer-transport-security"` - ForceNewCluster bool `json:"force-new-cluster"` - Logger string `json:"logger"` - LogOutputs []string `json:"log-outputs"` - Debug bool `json:"debug"` + ClientSecurityCfgFile securityConfig `json:"client-transport-security"` + PeerSecurityCfgFile securityConfig `json:"peer-transport-security"` + ForceNewCluster bool `json:"force-new-cluster"` + Logger string `json:"logger"` + LogOutputs []string `json:"log-outputs"` + Debug bool `json:"debug"` + SocketOpts transport.SocketOpts `json:"socket-options"` }{ ctls, ptls, @@ -55,6 +56,9 @@ func TestConfigFileOtherFields(t *testing.T) { "zap", []string{"/dev/null"}, false, + transport.SocketOpts{ + ReusePort: true, + }, } b, err := yaml.Marshal(&yc) @@ -70,16 +74,18 @@ func TestConfigFileOtherFields(t *testing.T) { t.Fatal(err) } - if !cfg.ForceNewCluster { - t.Errorf("ForceNewCluster = %v, want %v", cfg.ForceNewCluster, true) - } - if !ctls.equals(&cfg.ClientTLSInfo) { t.Errorf("ClientTLS = %v, want %v", cfg.ClientTLSInfo, ctls) } if !ptls.equals(&cfg.PeerTLSInfo) { t.Errorf("PeerTLS = %v, want %v", cfg.PeerTLSInfo, ptls) } + + assert.Equal(t, true, cfg.ForceNewCluster, "ForceNewCluster does not match") + + assert.Equal(t, true, cfg.SocketOpts.ReusePort, "ReusePort does not match") + + assert.Equal(t, false, cfg.SocketOpts.ReuseAddress, "ReuseAddress does not match") } // TestUpdateDefaultClusterFromName ensures that etcd can start with 'etcd --name=abc'.