Skip to content

Commit e30a4ab

Browse files
authored
Merge pull request #19078 from ishan16696/migrate/flagTofeatureGate
migrate `--experimental-txn-mode-write-with-shared-buffer` flag to feature gate.
2 parents 40b856e + c73b3d1 commit e30a4ab

File tree

10 files changed

+204
-100
lines changed

10 files changed

+204
-100
lines changed

server/embed/config.go

+4-5
Original file line numberDiff line numberDiff line change
@@ -583,11 +583,10 @@ func NewConfig() *Config {
583583
LogRotationConfigJSON: DefaultLogRotationConfig,
584584
EnableGRPCGateway: true,
585585

586-
ExperimentalDowngradeCheckTime: DefaultDowngradeCheckTime,
587-
ExperimentalMemoryMlock: false,
588-
ExperimentalTxnModeWriteWithSharedBuffer: true,
589-
ExperimentalStopGRPCServiceOnDefrag: false,
590-
ExperimentalMaxLearners: membership.DefaultMaxLearners,
586+
ExperimentalDowngradeCheckTime: DefaultDowngradeCheckTime,
587+
ExperimentalMemoryMlock: false,
588+
ExperimentalStopGRPCServiceOnDefrag: false,
589+
ExperimentalMaxLearners: membership.DefaultMaxLearners,
591590

592591
CompactHashCheckTime: DefaultCompactHashCheckTime,
593592
// TODO: delete in v3.7

server/embed/config_test.go

+97-24
Original file line numberDiff line numberDiff line change
@@ -94,24 +94,26 @@ func TestConfigFileOtherFields(t *testing.T) {
9494

9595
func TestConfigFileFeatureGates(t *testing.T) {
9696
testCases := []struct {
97-
name string
98-
serverFeatureGatesJSON string
99-
experimentalStopGRPCServiceOnDefrag string
100-
experimentalInitialCorruptCheck string
101-
experimentalCompactHashCheckEnabled string
102-
expectErr bool
103-
expectedFeatures map[featuregate.Feature]bool
97+
name string
98+
serverFeatureGatesJSON string
99+
experimentalStopGRPCServiceOnDefrag string
100+
experimentalInitialCorruptCheck string
101+
experimentalCompactHashCheckEnabled string
102+
experimentalTxnModeWriteWithSharedBuffer string
103+
expectErr bool
104+
expectedFeatures map[featuregate.Feature]bool
104105
}{
105106
{
106107
name: "default",
107108
expectedFeatures: map[featuregate.Feature]bool{
108-
features.DistributedTracing: false,
109-
features.StopGRPCServiceOnDefrag: false,
110-
features.InitialCorruptCheck: false,
109+
features.DistributedTracing: false,
110+
features.StopGRPCServiceOnDefrag: false,
111+
features.InitialCorruptCheck: false,
112+
features.TxnModeWriteWithSharedBuffer: true,
111113
},
112114
},
113115
{
114-
name: "cannot set both experimental flag and feature gate flag",
116+
name: "cannot set both experimental flag and feature gate flag for StopGRPCServiceOnDefrag",
115117
serverFeatureGatesJSON: "StopGRPCServiceOnDefrag=true",
116118
experimentalStopGRPCServiceOnDefrag: "false",
117119
expectErr: true,
@@ -122,6 +124,12 @@ func TestConfigFileFeatureGates(t *testing.T) {
122124
experimentalInitialCorruptCheck: "false",
123125
expectErr: true,
124126
},
127+
{
128+
name: "cannot set both experimental flag and feature gate flag for TxnModeWriteWithSharedBuffer",
129+
serverFeatureGatesJSON: "TxnModeWriteWithSharedBuffer=true",
130+
experimentalTxnModeWriteWithSharedBuffer: "false",
131+
expectErr: true,
132+
},
125133
{
126134
name: "ok to set different experimental flag and feature gate flag",
127135
serverFeatureGatesJSON: "DistributedTracing=true",
@@ -133,21 +141,35 @@ func TestConfigFileFeatureGates(t *testing.T) {
133141
},
134142
},
135143
{
136-
name: "can set feature gate to true from experimental flag",
144+
name: "ok to set different multiple experimental flags and feature gate flags",
145+
serverFeatureGatesJSON: "StopGRPCServiceOnDefrag=true,TxnModeWriteWithSharedBuffer=true",
146+
experimentalCompactHashCheckEnabled: "true",
147+
experimentalInitialCorruptCheck: "true",
148+
expectedFeatures: map[featuregate.Feature]bool{
149+
features.StopGRPCServiceOnDefrag: true,
150+
features.CompactHashCheck: true,
151+
features.InitialCorruptCheck: true,
152+
features.TxnModeWriteWithSharedBuffer: true,
153+
},
154+
},
155+
{
156+
name: "can set feature gate StopGRPCServiceOnDefrag to true from experimental flag",
137157
experimentalStopGRPCServiceOnDefrag: "true",
138158
expectedFeatures: map[featuregate.Feature]bool{
139-
features.StopGRPCServiceOnDefrag: true,
140-
features.DistributedTracing: false,
141-
features.InitialCorruptCheck: false,
159+
features.StopGRPCServiceOnDefrag: true,
160+
features.DistributedTracing: false,
161+
features.InitialCorruptCheck: false,
162+
features.TxnModeWriteWithSharedBuffer: true,
142163
},
143164
},
144165
{
145-
name: "can set feature gate to false from experimental flag",
166+
name: "can set feature gate StopGRPCServiceOnDefrag to false from experimental flag",
146167
experimentalStopGRPCServiceOnDefrag: "false",
147168
expectedFeatures: map[featuregate.Feature]bool{
148-
features.StopGRPCServiceOnDefrag: false,
149-
features.DistributedTracing: false,
150-
features.InitialCorruptCheck: false,
169+
features.StopGRPCServiceOnDefrag: false,
170+
features.DistributedTracing: false,
171+
features.InitialCorruptCheck: false,
172+
features.TxnModeWriteWithSharedBuffer: true,
151173
},
152174
},
153175
{
@@ -168,6 +190,28 @@ func TestConfigFileFeatureGates(t *testing.T) {
168190
features.InitialCorruptCheck: false,
169191
},
170192
},
193+
{
194+
name: "can set feature gate TxnModeWriteWithSharedBuffer to true from experimental flag",
195+
experimentalTxnModeWriteWithSharedBuffer: "true",
196+
expectedFeatures: map[featuregate.Feature]bool{
197+
features.StopGRPCServiceOnDefrag: false,
198+
features.DistributedTracing: false,
199+
features.InitialCorruptCheck: false,
200+
features.CompactHashCheck: false,
201+
features.TxnModeWriteWithSharedBuffer: true,
202+
},
203+
},
204+
{
205+
name: "can set feature gate TxnModeWriteWithSharedBuffer to false from experimental flag",
206+
experimentalTxnModeWriteWithSharedBuffer: "false",
207+
expectedFeatures: map[featuregate.Feature]bool{
208+
features.StopGRPCServiceOnDefrag: false,
209+
features.DistributedTracing: false,
210+
features.InitialCorruptCheck: false,
211+
features.CompactHashCheck: false,
212+
features.TxnModeWriteWithSharedBuffer: false,
213+
},
214+
},
171215
{
172216
name: "can set feature gate StopGRPCServiceOnDefrag to true from feature gate flag",
173217
serverFeatureGatesJSON: "StopGRPCServiceOnDefrag=true",
@@ -187,14 +231,34 @@ func TestConfigFileFeatureGates(t *testing.T) {
187231
},
188232
},
189233
{
190-
name: "can set feature gate to false from feature gate flag",
234+
name: "can set feature gate StopGRPCServiceOnDefrag to false from feature gate flag",
191235
serverFeatureGatesJSON: "StopGRPCServiceOnDefrag=false",
192236
expectedFeatures: map[featuregate.Feature]bool{
193237
features.StopGRPCServiceOnDefrag: false,
194238
features.DistributedTracing: false,
195239
features.InitialCorruptCheck: false,
196240
},
197241
},
242+
{
243+
name: "can set feature gate TxnModeWriteWithSharedBuffer to true from feature gate flag",
244+
serverFeatureGatesJSON: "TxnModeWriteWithSharedBuffer=true",
245+
expectedFeatures: map[featuregate.Feature]bool{
246+
features.StopGRPCServiceOnDefrag: false,
247+
features.DistributedTracing: false,
248+
features.InitialCorruptCheck: false,
249+
features.TxnModeWriteWithSharedBuffer: true,
250+
},
251+
},
252+
{
253+
name: "can set feature gate TxnModeWriteWithSharedBuffer to false from feature gate flag",
254+
serverFeatureGatesJSON: "TxnModeWriteWithSharedBuffer=false",
255+
expectedFeatures: map[featuregate.Feature]bool{
256+
features.StopGRPCServiceOnDefrag: false,
257+
features.DistributedTracing: false,
258+
features.InitialCorruptCheck: false,
259+
features.TxnModeWriteWithSharedBuffer: false,
260+
},
261+
},
198262
{
199263
name: "cannot set both experimental flag and feature gate flag for ExperimentalCompactHashCheckEnabled",
200264
serverFeatureGatesJSON: "CompactHashCheck=true",
@@ -232,10 +296,11 @@ func TestConfigFileFeatureGates(t *testing.T) {
232296
for _, tc := range testCases {
233297
t.Run(tc.name, func(t *testing.T) {
234298
yc := struct {
235-
ExperimentalStopGRPCServiceOnDefrag *bool `json:"experimental-stop-grpc-service-on-defrag,omitempty"`
236-
ExperimentalInitialCorruptCheck *bool `json:"experimental-initial-corrupt-check,omitempty"`
237-
ExperimentalCompactHashCheckEnabled *bool `json:"experimental-compact-hash-check-enabled,omitempty"`
238-
ServerFeatureGatesJSON string `json:"feature-gates"`
299+
ExperimentalStopGRPCServiceOnDefrag *bool `json:"experimental-stop-grpc-service-on-defrag,omitempty"`
300+
ExperimentalInitialCorruptCheck *bool `json:"experimental-initial-corrupt-check,omitempty"`
301+
ExperimentalCompactHashCheckEnabled *bool `json:"experimental-compact-hash-check-enabled,omitempty"`
302+
ExperimentalTxnModeWriteWithSharedBuffer *bool `json:"experimental-txn-mode-write-with-shared-buffer,omitempty"`
303+
ServerFeatureGatesJSON string `json:"feature-gates"`
239304
}{
240305
ServerFeatureGatesJSON: tc.serverFeatureGatesJSON,
241306
}
@@ -248,6 +313,14 @@ func TestConfigFileFeatureGates(t *testing.T) {
248313
yc.ExperimentalInitialCorruptCheck = &experimentalInitialCorruptCheck
249314
}
250315

316+
if tc.experimentalTxnModeWriteWithSharedBuffer != "" {
317+
experimentalTxnModeWriteWithSharedBuffer, err := strconv.ParseBool(tc.experimentalTxnModeWriteWithSharedBuffer)
318+
if err != nil {
319+
t.Fatal(err)
320+
}
321+
yc.ExperimentalTxnModeWriteWithSharedBuffer = &experimentalTxnModeWriteWithSharedBuffer
322+
}
323+
251324
if tc.experimentalStopGRPCServiceOnDefrag != "" {
252325
experimentalStopGRPCServiceOnDefrag, err := strconv.ParseBool(tc.experimentalStopGRPCServiceOnDefrag)
253326
if err != nil {

server/embed/etcd.go

+53-54
Original file line numberDiff line numberDiff line change
@@ -168,60 +168,59 @@ func StartEtcd(inCfg *Config) (e *Etcd, err error) {
168168
backendFreelistType := parseBackendFreelistType(cfg.BackendFreelistType)
169169

170170
srvcfg := config.ServerConfig{
171-
Name: cfg.Name,
172-
ClientURLs: cfg.AdvertiseClientUrls,
173-
PeerURLs: cfg.AdvertisePeerUrls,
174-
DataDir: cfg.Dir,
175-
DedicatedWALDir: cfg.WalDir,
176-
SnapshotCount: cfg.SnapshotCount,
177-
SnapshotCatchUpEntries: cfg.SnapshotCatchUpEntries,
178-
MaxSnapFiles: cfg.MaxSnapFiles,
179-
MaxWALFiles: cfg.MaxWalFiles,
180-
InitialPeerURLsMap: urlsmap,
181-
InitialClusterToken: token,
182-
DiscoveryURL: cfg.Durl,
183-
DiscoveryProxy: cfg.Dproxy,
184-
DiscoveryCfg: cfg.DiscoveryCfg,
185-
NewCluster: cfg.IsNewCluster(),
186-
PeerTLSInfo: cfg.PeerTLSInfo,
187-
TickMs: cfg.TickMs,
188-
ElectionTicks: cfg.ElectionTicks(),
189-
InitialElectionTickAdvance: cfg.InitialElectionTickAdvance,
190-
AutoCompactionRetention: autoCompactionRetention,
191-
AutoCompactionMode: cfg.AutoCompactionMode,
192-
QuotaBackendBytes: cfg.QuotaBackendBytes,
193-
BackendBatchLimit: cfg.BackendBatchLimit,
194-
BackendFreelistType: backendFreelistType,
195-
BackendBatchInterval: cfg.BackendBatchInterval,
196-
MaxTxnOps: cfg.MaxTxnOps,
197-
MaxRequestBytes: cfg.MaxRequestBytes,
198-
MaxConcurrentStreams: cfg.MaxConcurrentStreams,
199-
SocketOpts: cfg.SocketOpts,
200-
StrictReconfigCheck: cfg.StrictReconfigCheck,
201-
ClientCertAuthEnabled: cfg.ClientTLSInfo.ClientCertAuth,
202-
AuthToken: cfg.AuthToken,
203-
BcryptCost: cfg.BcryptCost,
204-
TokenTTL: cfg.AuthTokenTTL,
205-
CORS: cfg.CORS,
206-
HostWhitelist: cfg.HostWhitelist,
207-
CorruptCheckTime: cfg.ExperimentalCorruptCheckTime,
208-
CompactHashCheckTime: cfg.CompactHashCheckTime,
209-
PreVote: cfg.PreVote,
210-
Logger: cfg.logger,
211-
ForceNewCluster: cfg.ForceNewCluster,
212-
EnableGRPCGateway: cfg.EnableGRPCGateway,
213-
ExperimentalEnableDistributedTracing: cfg.ExperimentalEnableDistributedTracing,
214-
UnsafeNoFsync: cfg.UnsafeNoFsync,
215-
EnableLeaseCheckpoint: cfg.ExperimentalEnableLeaseCheckpoint,
216-
LeaseCheckpointPersist: cfg.ExperimentalEnableLeaseCheckpointPersist,
217-
CompactionBatchLimit: cfg.ExperimentalCompactionBatchLimit,
218-
CompactionSleepInterval: cfg.ExperimentalCompactionSleepInterval,
219-
WatchProgressNotifyInterval: cfg.ExperimentalWatchProgressNotifyInterval,
220-
DowngradeCheckTime: cfg.ExperimentalDowngradeCheckTime,
221-
WarningApplyDuration: cfg.ExperimentalWarningApplyDuration,
222-
WarningUnaryRequestDuration: cfg.WarningUnaryRequestDuration,
223-
ExperimentalMemoryMlock: cfg.ExperimentalMemoryMlock,
224-
ExperimentalTxnModeWriteWithSharedBuffer: cfg.ExperimentalTxnModeWriteWithSharedBuffer,
171+
Name: cfg.Name,
172+
ClientURLs: cfg.AdvertiseClientUrls,
173+
PeerURLs: cfg.AdvertisePeerUrls,
174+
DataDir: cfg.Dir,
175+
DedicatedWALDir: cfg.WalDir,
176+
SnapshotCount: cfg.SnapshotCount,
177+
SnapshotCatchUpEntries: cfg.SnapshotCatchUpEntries,
178+
MaxSnapFiles: cfg.MaxSnapFiles,
179+
MaxWALFiles: cfg.MaxWalFiles,
180+
InitialPeerURLsMap: urlsmap,
181+
InitialClusterToken: token,
182+
DiscoveryURL: cfg.Durl,
183+
DiscoveryProxy: cfg.Dproxy,
184+
DiscoveryCfg: cfg.DiscoveryCfg,
185+
NewCluster: cfg.IsNewCluster(),
186+
PeerTLSInfo: cfg.PeerTLSInfo,
187+
TickMs: cfg.TickMs,
188+
ElectionTicks: cfg.ElectionTicks(),
189+
InitialElectionTickAdvance: cfg.InitialElectionTickAdvance,
190+
AutoCompactionRetention: autoCompactionRetention,
191+
AutoCompactionMode: cfg.AutoCompactionMode,
192+
QuotaBackendBytes: cfg.QuotaBackendBytes,
193+
BackendBatchLimit: cfg.BackendBatchLimit,
194+
BackendFreelistType: backendFreelistType,
195+
BackendBatchInterval: cfg.BackendBatchInterval,
196+
MaxTxnOps: cfg.MaxTxnOps,
197+
MaxRequestBytes: cfg.MaxRequestBytes,
198+
MaxConcurrentStreams: cfg.MaxConcurrentStreams,
199+
SocketOpts: cfg.SocketOpts,
200+
StrictReconfigCheck: cfg.StrictReconfigCheck,
201+
ClientCertAuthEnabled: cfg.ClientTLSInfo.ClientCertAuth,
202+
AuthToken: cfg.AuthToken,
203+
BcryptCost: cfg.BcryptCost,
204+
TokenTTL: cfg.AuthTokenTTL,
205+
CORS: cfg.CORS,
206+
HostWhitelist: cfg.HostWhitelist,
207+
CorruptCheckTime: cfg.ExperimentalCorruptCheckTime,
208+
CompactHashCheckTime: cfg.CompactHashCheckTime,
209+
PreVote: cfg.PreVote,
210+
Logger: cfg.logger,
211+
ForceNewCluster: cfg.ForceNewCluster,
212+
EnableGRPCGateway: cfg.EnableGRPCGateway,
213+
ExperimentalEnableDistributedTracing: cfg.ExperimentalEnableDistributedTracing,
214+
UnsafeNoFsync: cfg.UnsafeNoFsync,
215+
EnableLeaseCheckpoint: cfg.ExperimentalEnableLeaseCheckpoint,
216+
LeaseCheckpointPersist: cfg.ExperimentalEnableLeaseCheckpointPersist,
217+
CompactionBatchLimit: cfg.ExperimentalCompactionBatchLimit,
218+
CompactionSleepInterval: cfg.ExperimentalCompactionSleepInterval,
219+
WatchProgressNotifyInterval: cfg.ExperimentalWatchProgressNotifyInterval,
220+
DowngradeCheckTime: cfg.ExperimentalDowngradeCheckTime,
221+
WarningApplyDuration: cfg.ExperimentalWarningApplyDuration,
222+
WarningUnaryRequestDuration: cfg.WarningUnaryRequestDuration,
223+
ExperimentalMemoryMlock: cfg.ExperimentalMemoryMlock,
225224
ExperimentalBootstrapDefragThresholdMegabytes: cfg.ExperimentalBootstrapDefragThresholdMegabytes,
226225
ExperimentalMaxLearners: cfg.ExperimentalMaxLearners,
227226
V2Deprecation: cfg.V2DeprecationEffective(),

server/etcdmain/config.go

+3-2
Original file line numberDiff line numberDiff line change
@@ -62,8 +62,9 @@ var (
6262
"snapshot-count": "--snapshot-count is deprecated in 3.6 and will be decommissioned in 3.7.",
6363
"max-snapshots": "--max-snapshots is deprecated in 3.6 and will be decommissioned in 3.7.",
6464
"v2-deprecation": "--v2-deprecation is deprecated and scheduled for removal in v3.8. The default value is enforced, ignoring user input.",
65-
"experimental-compact-hash-check-enabled": "--experimental-compact-hash-check-enabled is deprecated in 3.6 and will be decommissioned in 3.7. Use '--feature-gates=CompactHashCheck=true' instead.",
66-
"experimental-compact-hash-check-time": "--experimental-compact-hash-check-time is deprecated in 3.6 and will be decommissioned in 3.7. Use '--compact-hash-check-time' instead.",
65+
"experimental-compact-hash-check-enabled": "--experimental-compact-hash-check-enabled is deprecated in 3.6 and will be decommissioned in 3.7. Use '--feature-gates=CompactHashCheck=true' instead.",
66+
"experimental-compact-hash-check-time": "--experimental-compact-hash-check-time is deprecated in 3.6 and will be decommissioned in 3.7. Use '--compact-hash-check-time' instead.",
67+
"experimental-txn-mode-write-with-shared-buffer": "--experimental-txn-mode-write-with-shared-buffer is deprecated in v3.6 and will be decommissioned in v3.7. Use '--feature-gates=TxnModeWriteWithSharedBuffer=true' instead.",
6768
}
6869
)
6970

server/etcdmain/help.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -293,7 +293,7 @@ Experimental feature:
293293
Duration of periodical watch progress notification.
294294
--experimental-warning-apply-duration '100ms'
295295
Warning is generated if requests take more than this duration.
296-
--experimental-txn-mode-write-with-shared-buffer 'true'
296+
--experimental-txn-mode-write-with-shared-buffer 'true'. Deprecated in v3.6 and will be decommissioned in v3.7. Use '--feature-gates=TxnModeWriteWithSharedBuffer=true' instead.
297297
Enable the write transaction to use a shared buffer in its readonly check operations.
298298
--experimental-bootstrap-defrag-threshold-megabytes
299299
Enable the defrag during etcd server bootstrap on condition that it will free at least the provided threshold of disk space. Needs to be set to non-zero value to take effect.

server/etcdserver/server.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -1148,7 +1148,7 @@ func (s *EtcdServer) applySnapshot(ep *etcdProgress, toApply *toApply) {
11481148

11491149
func (s *EtcdServer) NewUberApplier() apply.UberApplier {
11501150
return apply.NewUberApplier(s.lg, s.be, s.KV(), s.alarmStore, s.authStore, s.lessor, s.cluster, s, s, s.consistIndex,
1151-
s.Cfg.WarningApplyDuration, s.Cfg.ExperimentalTxnModeWriteWithSharedBuffer, s.Cfg.QuotaBackendBytes)
1151+
s.Cfg.WarningApplyDuration, s.Cfg.ServerFeatureGate.Enabled(features.TxnModeWriteWithSharedBuffer), s.Cfg.QuotaBackendBytes)
11521152
}
11531153

11541154
func verifySnapshotIndex(snapshot raftpb.Snapshot, cindex uint64) {

0 commit comments

Comments
 (0)