Skip to content

Commit 93a245a

Browse files
authored
Merge pull request #18478 from liangyuanpeng/fg_skipClientSan
KEP-4578: migrate experimental-initial-corrupt-check flag to feature gate.
2 parents 5485c71 + a966c07 commit 93a245a

File tree

4 files changed

+61
-4
lines changed

4 files changed

+61
-4
lines changed

server/embed/config_test.go

+51-1
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,7 @@ func TestConfigFileFeatureGates(t *testing.T) {
9797
name string
9898
serverFeatureGatesJSON string
9999
experimentalStopGRPCServiceOnDefrag string
100+
experimentalInitialCorruptCheck string
100101
expectErr bool
101102
expectedFeatures map[featuregate.Feature]bool
102103
}{
@@ -105,6 +106,7 @@ func TestConfigFileFeatureGates(t *testing.T) {
105106
expectedFeatures: map[featuregate.Feature]bool{
106107
features.DistributedTracing: false,
107108
features.StopGRPCServiceOnDefrag: false,
109+
features.InitialCorruptCheck: false,
108110
},
109111
},
110112
{
@@ -113,13 +115,20 @@ func TestConfigFileFeatureGates(t *testing.T) {
113115
experimentalStopGRPCServiceOnDefrag: "false",
114116
expectErr: true,
115117
},
118+
{
119+
name: "cannot set both experimental flag and feature gate flag for InitialCorruptCheck",
120+
serverFeatureGatesJSON: "InitialCorruptCheck=true",
121+
experimentalInitialCorruptCheck: "false",
122+
expectErr: true,
123+
},
116124
{
117125
name: "ok to set different experimental flag and feature gate flag",
118126
serverFeatureGatesJSON: "DistributedTracing=true",
119127
experimentalStopGRPCServiceOnDefrag: "true",
120128
expectedFeatures: map[featuregate.Feature]bool{
121129
features.DistributedTracing: true,
122130
features.StopGRPCServiceOnDefrag: true,
131+
features.InitialCorruptCheck: false,
123132
},
124133
},
125134
{
@@ -128,6 +137,7 @@ func TestConfigFileFeatureGates(t *testing.T) {
128137
expectedFeatures: map[featuregate.Feature]bool{
129138
features.StopGRPCServiceOnDefrag: true,
130139
features.DistributedTracing: false,
140+
features.InitialCorruptCheck: false,
131141
},
132142
},
133143
{
@@ -136,14 +146,43 @@ func TestConfigFileFeatureGates(t *testing.T) {
136146
expectedFeatures: map[featuregate.Feature]bool{
137147
features.StopGRPCServiceOnDefrag: false,
138148
features.DistributedTracing: false,
149+
features.InitialCorruptCheck: false,
150+
},
151+
},
152+
{
153+
name: "can set feature gate experimentalInitialCorruptCheck to true from experimental flag",
154+
experimentalInitialCorruptCheck: "true",
155+
expectedFeatures: map[featuregate.Feature]bool{
156+
features.StopGRPCServiceOnDefrag: false,
157+
features.DistributedTracing: false,
158+
features.InitialCorruptCheck: true,
159+
},
160+
},
161+
{
162+
name: "can set feature gate experimentalInitialCorruptCheck to false from experimental flag",
163+
experimentalInitialCorruptCheck: "false",
164+
expectedFeatures: map[featuregate.Feature]bool{
165+
features.StopGRPCServiceOnDefrag: false,
166+
features.DistributedTracing: false,
167+
features.InitialCorruptCheck: false,
139168
},
140169
},
141170
{
142-
name: "can set feature gate to true from feature gate flag",
171+
name: "can set feature gate StopGRPCServiceOnDefrag to true from feature gate flag",
143172
serverFeatureGatesJSON: "StopGRPCServiceOnDefrag=true",
144173
expectedFeatures: map[featuregate.Feature]bool{
145174
features.StopGRPCServiceOnDefrag: true,
146175
features.DistributedTracing: false,
176+
features.InitialCorruptCheck: false,
177+
},
178+
},
179+
{
180+
name: "can set feature gate InitialCorruptCheck to true from feature gate flag",
181+
serverFeatureGatesJSON: "InitialCorruptCheck=true",
182+
expectedFeatures: map[featuregate.Feature]bool{
183+
features.StopGRPCServiceOnDefrag: false,
184+
features.DistributedTracing: false,
185+
features.InitialCorruptCheck: true,
147186
},
148187
},
149188
{
@@ -152,25 +191,36 @@ func TestConfigFileFeatureGates(t *testing.T) {
152191
expectedFeatures: map[featuregate.Feature]bool{
153192
features.StopGRPCServiceOnDefrag: false,
154193
features.DistributedTracing: false,
194+
features.InitialCorruptCheck: false,
155195
},
156196
},
157197
}
158198
for _, tc := range testCases {
159199
t.Run(tc.name, func(t *testing.T) {
160200
yc := struct {
161201
ExperimentalStopGRPCServiceOnDefrag *bool `json:"experimental-stop-grpc-service-on-defrag,omitempty"`
202+
ExperimentalInitialCorruptCheck *bool `json:"experimental-initial-corrupt-check,omitempty"`
162203
ServerFeatureGatesJSON string `json:"feature-gates"`
163204
}{
164205
ServerFeatureGatesJSON: tc.serverFeatureGatesJSON,
165206
}
166207

208+
if tc.experimentalInitialCorruptCheck != "" {
209+
experimentalInitialCorruptCheck, err := strconv.ParseBool(tc.experimentalInitialCorruptCheck)
210+
if err != nil {
211+
t.Fatal(err)
212+
}
213+
yc.ExperimentalInitialCorruptCheck = &experimentalInitialCorruptCheck
214+
}
215+
167216
if tc.experimentalStopGRPCServiceOnDefrag != "" {
168217
experimentalStopGRPCServiceOnDefrag, err := strconv.ParseBool(tc.experimentalStopGRPCServiceOnDefrag)
169218
if err != nil {
170219
t.Fatal(err)
171220
}
172221
yc.ExperimentalStopGRPCServiceOnDefrag = &experimentalStopGRPCServiceOnDefrag
173222
}
223+
174224
b, err := yaml.Marshal(&yc)
175225
if err != nil {
176226
t.Fatal(err)

server/embed/etcd.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ import (
4848
"go.etcd.io/etcd/server/v3/etcdserver"
4949
"go.etcd.io/etcd/server/v3/etcdserver/api/etcdhttp"
5050
"go.etcd.io/etcd/server/v3/etcdserver/api/rafthttp"
51+
"go.etcd.io/etcd/server/v3/features"
5152
"go.etcd.io/etcd/server/v3/storage"
5253
"go.etcd.io/etcd/server/v3/verify"
5354
)
@@ -203,7 +204,6 @@ func StartEtcd(inCfg *Config) (e *Etcd, err error) {
203204
TokenTTL: cfg.AuthTokenTTL,
204205
CORS: cfg.CORS,
205206
HostWhitelist: cfg.HostWhitelist,
206-
InitialCorruptCheck: cfg.ExperimentalInitialCorruptCheck,
207207
CorruptCheckTime: cfg.ExperimentalCorruptCheckTime,
208208
CompactHashCheckEnabled: cfg.ExperimentalCompactHashCheckEnabled,
209209
CompactHashCheckTime: cfg.ExperimentalCompactHashCheckTime,
@@ -259,7 +259,7 @@ func StartEtcd(inCfg *Config) (e *Etcd, err error) {
259259

260260
// newly started member ("memberInitialized==false")
261261
// does not need corruption check
262-
if memberInitialized && srvcfg.InitialCorruptCheck {
262+
if memberInitialized && srvcfg.ServerFeatureGate.Enabled(features.InitialCorruptCheck) {
263263
if err = e.Server.CorruptionChecker().InitialCheck(); err != nil {
264264
// set "EtcdServer" to nil, so that it does not block on "EtcdServer.Close()"
265265
// (nothing to close since rafthttp transports have not been started)

server/etcdmain/help.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -273,7 +273,7 @@ Experimental distributed tracing:
273273
Number of samples to collect per million spans for distributed tracing. Disabled by default.
274274
275275
Experimental feature:
276-
--experimental-initial-corrupt-check 'false'
276+
--experimental-initial-corrupt-check 'false'. It's deprecated, and will be decommissioned in v3.7. Use '--feature-gates=InitialCorruptCheck=true' instead.
277277
Enable to check data corruption before serving any client/peer traffic.
278278
--experimental-corrupt-check-time '0s'
279279
Duration of time between cluster corruption check passes.

server/features/etcd_features.go

+7
Original file line numberDiff line numberDiff line change
@@ -45,18 +45,25 @@ const (
4545
// alpha: v3.6
4646
// main PR: https://github.com/etcd-io/etcd/pull/18279
4747
StopGRPCServiceOnDefrag featuregate.Feature = "StopGRPCServiceOnDefrag"
48+
// InitialCorruptCheck enable to check data corruption before serving any client/peer traffic.
49+
// owner: @serathius
50+
// alpha: v3.6
51+
// main PR: https://github.com/etcd-io/etcd/pull/10524
52+
InitialCorruptCheck featuregate.Feature = "InitialCorruptCheck"
4853
)
4954

5055
var (
5156
DefaultEtcdServerFeatureGates = map[featuregate.Feature]featuregate.FeatureSpec{
5257
DistributedTracing: {Default: false, PreRelease: featuregate.Alpha},
5358
StopGRPCServiceOnDefrag: {Default: false, PreRelease: featuregate.Alpha},
59+
InitialCorruptCheck: {Default: false, PreRelease: featuregate.Alpha},
5460
}
5561
// ExperimentalFlagToFeatureMap is the map from the cmd line flags of experimental features
5662
// to their corresponding feature gates.
5763
// Deprecated: only add existing experimental features here. DO NOT use for new features.
5864
ExperimentalFlagToFeatureMap = map[string]featuregate.Feature{
5965
"experimental-stop-grpc-service-on-defrag": StopGRPCServiceOnDefrag,
66+
"experimental-initial-corrupt-check": InitialCorruptCheck,
6067
}
6168
)
6269

0 commit comments

Comments
 (0)