Skip to content

Commit b8e2dc6

Browse files
committed
Update etcdserver and client to support DowngradeVersionTest request
Signed-off-by: Benjamin Wang <benjamin.ahrtr@gmail.com>
1 parent 78047ed commit b8e2dc6

File tree

8 files changed

+61
-2
lines changed

8 files changed

+61
-2
lines changed

client/v3/client_test.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -476,6 +476,10 @@ func (mm mockMaintenance) Downgrade(ctx context.Context, action DowngradeAction,
476476
return nil, nil
477477
}
478478

479+
func (mm mockMaintenance) DowngradeVersionTest(ctx context.Context, version string) (*DowngradeVersionTestResponse, error) {
480+
return nil, nil
481+
}
482+
479483
type mockAuthServer struct {
480484
*etcdserverpb.UnimplementedAuthServer
481485
}

client/v3/maintenance.go

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,8 @@ type (
3535
MoveLeaderResponse pb.MoveLeaderResponse
3636
DowngradeResponse pb.DowngradeResponse
3737

38-
DowngradeAction pb.DowngradeRequest_DowngradeAction
38+
DowngradeAction pb.DowngradeRequest_DowngradeAction
39+
DowngradeVersionTestResponse pb.DowngradeVersionTestResponse
3940
)
4041

4142
const (
@@ -87,6 +88,10 @@ type Maintenance interface {
8788
// on the cluster version.
8889
// Supported since etcd 3.5.
8990
Downgrade(ctx context.Context, action DowngradeAction, version string) (*DowngradeResponse, error)
91+
92+
// DowngradeVersionTest is for test only! It enables users (test cases)
93+
// to send a DowngradeVersionTestRequest to etcdserver.
94+
DowngradeVersionTest(ctx context.Context, version string) (*DowngradeVersionTestResponse, error)
9095
}
9196

9297
// SnapshotResponse is aggregated response from the snapshot stream.
@@ -348,3 +353,8 @@ func (m *maintenance) Downgrade(ctx context.Context, action DowngradeAction, ver
348353
resp, err := m.remote.Downgrade(ctx, &pb.DowngradeRequest{Action: actionType, Version: version}, m.callOpts...)
349354
return (*DowngradeResponse)(resp), ContextError(ctx, err)
350355
}
356+
357+
func (m *maintenance) DowngradeVersionTest(ctx context.Context, version string) (*DowngradeVersionTestResponse, error) {
358+
resp, err := m.remote.DowngradeVersionTest(ctx, &pb.DowngradeVersionTestRequest{Ver: version})
359+
return (*DowngradeVersionTestResponse)(resp), ContextError(ctx, err)
360+
}

client/v3/retry.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -233,6 +233,10 @@ type retryAuthClient struct {
233233
ac pb.AuthClient
234234
}
235235

236+
func (rmc *retryMaintenanceClient) DowngradeVersionTest(ctx context.Context, in *pb.DowngradeVersionTestRequest, opts ...grpc.CallOption) (resp *pb.DowngradeVersionTestResponse, err error) {
237+
return rmc.mc.DowngradeVersionTest(ctx, in, opts...)
238+
}
239+
236240
// RetryAuthClient implements a AuthClient.
237241
func RetryAuthClient(c *Client) pb.AuthClient {
238242
return &retryAuthClient{

server/etcdserver/api/v3rpc/maintenance.go

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ type Alarmer interface {
5555

5656
type Downgrader interface {
5757
Downgrade(ctx context.Context, dr *pb.DowngradeRequest) (*pb.DowngradeResponse, error)
58+
DowngradeVersionTest(ctx context.Context, r *pb.DowngradeVersionTestRequest) (*pb.DowngradeVersionTestResponse, error)
5859
}
5960

6061
type LeaderTransferrer interface {
@@ -296,6 +297,16 @@ func (ms *maintenanceServer) Downgrade(ctx context.Context, r *pb.DowngradeReque
296297
return resp, nil
297298
}
298299

300+
func (ms *maintenanceServer) DowngradeVersionTest(ctx context.Context, r *pb.DowngradeVersionTestRequest) (*pb.DowngradeVersionTestResponse, error) {
301+
resp, err := ms.d.DowngradeVersionTest(ctx, r)
302+
if err != nil {
303+
return nil, togRPCError(err)
304+
}
305+
resp.Header = &pb.ResponseHeader{}
306+
ms.hdr.fill(resp.Header)
307+
return resp, nil
308+
}
309+
299310
type authMaintenanceServer struct {
300311
*maintenanceServer
301312
*AuthAdmin
@@ -355,3 +366,11 @@ func (ams *authMaintenanceServer) Downgrade(ctx context.Context, r *pb.Downgrade
355366

356367
return ams.maintenanceServer.Downgrade(ctx, r)
357368
}
369+
370+
func (ams *authMaintenanceServer) DowngradeVersionTest(ctx context.Context, r *pb.DowngradeVersionTestRequest) (*pb.DowngradeVersionTestResponse, error) {
371+
if err := ams.isPermitted(ctx); err != nil {
372+
return nil, togRPCError(err)
373+
}
374+
375+
return ams.maintenanceServer.DowngradeVersionTest(ctx, r)
376+
}

server/etcdserver/server.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2006,7 +2006,7 @@ func (s *EtcdServer) applyEntryNormal(e *raftpb.Entry, shouldApplyV3 membership.
20062006
}
20072007

20082008
func (s *EtcdServer) applyInternalRaftRequest(r *pb.InternalRaftRequest, shouldApplyV3 membership.ShouldApplyV3) *apply.Result {
2009-
if r.ClusterVersionSet == nil && r.ClusterMemberAttrSet == nil && r.DowngradeInfoSet == nil {
2009+
if r.ClusterVersionSet == nil && r.ClusterMemberAttrSet == nil && r.DowngradeInfoSet == nil && r.DowngradeVersionTest == nil {
20102010
if !shouldApplyV3 {
20112011
return nil
20122012
}
@@ -2029,6 +2029,10 @@ func (s *EtcdServer) applyInternalRaftRequest(r *pb.InternalRaftRequest, shouldA
20292029
case r.DowngradeInfoSet != nil:
20302030
op = "DowngradeInfoSet" // Implemented in 3.5.x
20312031
membershipApplier.DowngradeInfoSet(r.DowngradeInfoSet, shouldApplyV3)
2032+
case r.DowngradeVersionTest != nil:
2033+
op = "DowngradeVersionTest"
2034+
// do nothing, we are good as long as a WAL record
2035+
// has already been generated for this request.
20322036
default:
20332037
s.lg.Panic("not implemented apply", zap.Stringer("raft-request", r))
20342038
return nil

server/etcdserver/v3_server.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1044,6 +1044,16 @@ func (s *EtcdServer) downgradeEnable(ctx context.Context, r *pb.DowngradeRequest
10441044
return &resp, nil
10451045
}
10461046

1047+
// DowngradeVersionTest is for test only! We intentionally send
1048+
// a raft request so that a related WAL record can be generated.
1049+
func (s *EtcdServer) DowngradeVersionTest(ctx context.Context, r *pb.DowngradeVersionTestRequest) (*pb.DowngradeVersionTestResponse, error) {
1050+
resp, err := s.raftRequest(ctx, pb.InternalRaftRequest{DowngradeVersionTest: r})
1051+
if err != nil {
1052+
return nil, err
1053+
}
1054+
return resp.(*pb.DowngradeVersionTestResponse), nil
1055+
}
1056+
10471057
func (s *EtcdServer) downgradeCancel(ctx context.Context) (*pb.DowngradeResponse, error) {
10481058
err := s.Version().DowngradeCancel(ctx)
10491059
if err != nil {

server/proxy/grpcproxy/adapter/maintenance_client_adapter.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,10 @@ func (s *mts2mtc) Downgrade(ctx context.Context, r *pb.DowngradeRequest, opts ..
5656
return s.mts.Downgrade(ctx, r)
5757
}
5858

59+
func (s *mts2mtc) DowngradeVersionTest(ctx context.Context, r *pb.DowngradeVersionTestRequest, opts ...grpc.CallOption) (*pb.DowngradeVersionTestResponse, error) {
60+
return s.mts.DowngradeVersionTest(ctx, r)
61+
}
62+
5963
func (s *mts2mtc) Snapshot(ctx context.Context, in *pb.SnapshotRequest, opts ...grpc.CallOption) (pb.Maintenance_SnapshotClient, error) {
6064
cs := newPipeStream(ctx, func(ss chanServerStream) error {
6165
return s.mts.Snapshot(in, &ss2scServerStream{ss})

server/proxy/grpcproxy/maintenance.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,3 +86,7 @@ func (mp *maintenanceProxy) MoveLeader(ctx context.Context, r *pb.MoveLeaderRequ
8686
func (mp *maintenanceProxy) Downgrade(ctx context.Context, r *pb.DowngradeRequest) (*pb.DowngradeResponse, error) {
8787
return mp.maintenanceClient.Downgrade(ctx, r)
8888
}
89+
90+
func (mp *maintenanceProxy) DowngradeVersionTest(ctx context.Context, r *pb.DowngradeVersionTestRequest) (*pb.DowngradeVersionTestResponse, error) {
91+
return mp.maintenanceClient.DowngradeVersionTest(ctx, r)
92+
}

0 commit comments

Comments
 (0)