blob: bc9790bc2e684da13876975242811de54dd6f0d6 [file] [log] [blame]
Abhay Kumara2ae5992025-11-10 14:02:24 +00001// Copyright 2021 The etcd Authors
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15package etcdserver
16
17import (
18 "context"
19
20 "github.com/coreos/go-semver/semver"
21
22 pb "go.etcd.io/etcd/api/v3/etcdserverpb"
23 "go.etcd.io/etcd/api/v3/membershippb"
24 "go.etcd.io/etcd/api/v3/version"
25 serverversion "go.etcd.io/etcd/server/v3/etcdserver/version"
26 "go.etcd.io/etcd/server/v3/storage/schema"
27)
28
29// serverVersionAdapter implements the interface Server defined in package
30// go.etcd.io/etcd/server/v3/etcdserver/version, and it's needed by Monitor
31// in the same package.
32type serverVersionAdapter struct {
33 *EtcdServer
34}
35
36func NewServerVersionAdapter(s *EtcdServer) serverversion.Server {
37 return &serverVersionAdapter{
38 EtcdServer: s,
39 }
40}
41
42var _ serverversion.Server = (*serverVersionAdapter)(nil)
43
44func (s *serverVersionAdapter) UpdateClusterVersion(version string) {
45 s.GoAttach(func() { s.updateClusterVersionV3(version) })
46}
47
48func (s *serverVersionAdapter) LinearizableReadNotify(ctx context.Context) error {
49 return s.linearizableReadNotify(ctx)
50}
51
52func (s *serverVersionAdapter) DowngradeEnable(ctx context.Context, targetVersion *semver.Version) error {
53 raftRequest := membershippb.DowngradeInfoSetRequest{Enabled: true, Ver: targetVersion.String()}
54 _, err := s.raftRequest(ctx, pb.InternalRaftRequest{DowngradeInfoSet: &raftRequest})
55 return err
56}
57
58func (s *serverVersionAdapter) DowngradeCancel(ctx context.Context) error {
59 raftRequest := membershippb.DowngradeInfoSetRequest{Enabled: false}
60 _, err := s.raftRequest(ctx, pb.InternalRaftRequest{DowngradeInfoSet: &raftRequest})
61 return err
62}
63
64func (s *serverVersionAdapter) GetClusterVersion() *semver.Version {
65 return s.cluster.Version()
66}
67
68func (s *serverVersionAdapter) GetDowngradeInfo() *serverversion.DowngradeInfo {
69 return s.cluster.DowngradeInfo()
70}
71
72func (s *serverVersionAdapter) GetMembersVersions() map[string]*version.Versions {
73 return getMembersVersions(s.lg, s.cluster, s.MemberID(), s.peerRt, s.Cfg.ReqTimeout())
74}
75
76func (s *serverVersionAdapter) GetStorageVersion() *semver.Version {
77 return s.StorageVersion()
78}
79
80func (s *serverVersionAdapter) UpdateStorageVersion(target semver.Version) error {
81 // `applySnapshot` sets a new backend instance, so we need to acquire the bemu lock.
82 s.bemu.RLock()
83 defer s.bemu.RUnlock()
84
85 tx := s.be.BatchTx()
86 tx.LockOutsideApply()
87 defer tx.Unlock()
88 return schema.UnsafeMigrate(s.lg, tx, s.r.storage, target)
89}