@@ -42,6 +42,7 @@ import (
42
42
"go.etcd.io/etcd/client/pkg/v3/transport"
43
43
"go.etcd.io/etcd/client/pkg/v3/types"
44
44
clientv3 "go.etcd.io/etcd/client/v3"
45
+ "go.etcd.io/etcd/pkg/v3/featuregate"
45
46
"go.etcd.io/etcd/pkg/v3/flags"
46
47
"go.etcd.io/etcd/pkg/v3/netutil"
47
48
"go.etcd.io/etcd/server/v3/config"
@@ -50,6 +51,7 @@ import (
50
51
"go.etcd.io/etcd/server/v3/etcdserver/api/rafthttp"
51
52
"go.etcd.io/etcd/server/v3/etcdserver/api/v3compactor"
52
53
"go.etcd.io/etcd/server/v3/etcdserver/api/v3discovery"
54
+ "go.etcd.io/etcd/server/v3/features"
53
55
)
54
56
55
57
const (
@@ -108,6 +110,8 @@ const (
108
110
maxElectionMs = 50000
109
111
// backend freelist map type
110
112
freelistArrayType = "array"
113
+
114
+ ServerFeatureGateFlagName = "server-feature-gates"
111
115
)
112
116
113
117
var (
@@ -455,6 +459,9 @@ type Config struct {
455
459
456
460
// V2Deprecation describes phase of API & Storage V2 support
457
461
V2Deprecation config.V2DeprecationEnum `json:"v2-deprecation"`
462
+
463
+ // ServerFeatureGate is a server level feature gate
464
+ ServerFeatureGate featuregate.FeatureGate
458
465
}
459
466
460
467
// configYAML holds the config suitable for yaml parsing
@@ -476,6 +483,8 @@ type configJSON struct {
476
483
477
484
ClientSecurityJSON securityConfig `json:"client-transport-security"`
478
485
PeerSecurityJSON securityConfig `json:"peer-transport-security"`
486
+
487
+ ServerFeatureGatesJSON string `json:"server-feature-gates"`
479
488
}
480
489
481
490
type securityConfig struct {
@@ -576,6 +585,7 @@ func NewConfig() *Config {
576
585
},
577
586
578
587
AutoCompactionMode : DefaultAutoCompactionMode ,
588
+ ServerFeatureGate : features .NewDefaultServerFeatureGate (DefaultName , nil ),
579
589
}
580
590
cfg .InitialCluster = cfg .InitialClusterFromName (cfg .Name )
581
591
return cfg
@@ -762,6 +772,9 @@ func (cfg *Config) AddFlags(fs *flag.FlagSet) {
762
772
// unsafe
763
773
fs .BoolVar (& cfg .UnsafeNoFsync , "unsafe-no-fsync" , false , "Disables fsync, unsafe, will cause data loss." )
764
774
fs .BoolVar (& cfg .ForceNewCluster , "force-new-cluster" , false , "Force to create a new one member cluster." )
775
+
776
+ // featuregate
777
+ cfg .ServerFeatureGate .(featuregate.MutableFeatureGate ).AddFlag (fs , ServerFeatureGateFlagName )
765
778
}
766
779
767
780
func ConfigFromFile (path string ) (* Config , error ) {
@@ -907,6 +920,7 @@ func (cfg *Config) Validate() error {
907
920
if err := cfg .setupLogging (); err != nil {
908
921
return err
909
922
}
923
+ cfg .ServerFeatureGate .(featuregate.MutableFeatureGate ).SetLogger (cfg .logger )
910
924
if err := checkBindURLs (cfg .ListenPeerUrls ); err != nil {
911
925
return err
912
926
}
0 commit comments