From 723ef9f1e4261e95ee83c7c6bcac334d5fddf6cc Mon Sep 17 00:00:00 2001 From: Siyuan Zhang Date: Thu, 28 Mar 2024 23:29:17 +0000 Subject: [PATCH] Allow server to join higher cluster version if NextClusterVersionCompatible is true Signed-off-by: Siyuan Zhang --- etcdmain/help.go | 2 +- etcdserver/cluster_util.go | 5 ++++- etcdserver/server.go | 2 +- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/etcdmain/help.go b/etcdmain/help.go index 83102094ff3..cc2807a70a0 100644 --- a/etcdmain/help.go +++ b/etcdmain/help.go @@ -126,7 +126,7 @@ Clustering: --enable-v2 '` + strconv.FormatBool(embed.DefaultEnableV2) + `' Accept etcd V2 client requests. --next-cluster-version-compatible 'false' - Enable 3.4 to be compatible with next version 3.5, to allow 3.4 server to join 3.5 cluster and start on 3.5 schema. + Enable 3.4 to be compatible with next version 3.5, to allow 3.4 server to join 3.5 cluster and start on 3.5 schema. Security: --cert-file '' diff --git a/etcdserver/cluster_util.go b/etcdserver/cluster_util.go index abe77d2ae2d..b67dab2b35a 100644 --- a/etcdserver/cluster_util.go +++ b/etcdserver/cluster_util.go @@ -233,7 +233,7 @@ func decideClusterVersion(lg *zap.Logger, vers map[string]*version.Versions) *se // cluster version in the range of [MinClusterVersion, Version] and no known members has a cluster version // out of the range. // We set this rule since when the local member joins, another member might be offline. -func isCompatibleWithCluster(lg *zap.Logger, cl *membership.RaftCluster, local types.ID, rt http.RoundTripper) bool { +func isCompatibleWithCluster(lg *zap.Logger, cl *membership.RaftCluster, local types.ID, rt http.RoundTripper, nextClusterVersionCompatible bool) bool { vers := getVersions(lg, cl, local, rt) minV := semver.Must(semver.NewVersion(version.MinClusterVersion)) maxV := semver.Must(semver.NewVersion(version.Version)) @@ -241,6 +241,9 @@ func isCompatibleWithCluster(lg *zap.Logger, cl *membership.RaftCluster, local t Major: maxV.Major, Minor: maxV.Minor, } + if nextClusterVersionCompatible { + maxV.Minor += 1 + } return isCompatibleWithVers(lg, vers, local, minV, maxV) } diff --git a/etcdserver/server.go b/etcdserver/server.go index 02acb2877a1..e862b2927fa 100644 --- a/etcdserver/server.go +++ b/etcdserver/server.go @@ -371,7 +371,7 @@ func NewServer(cfg ServerConfig) (srv *EtcdServer, err error) { if err = membership.ValidateClusterAndAssignIDs(cfg.Logger, cl, existingCluster); err != nil { return nil, fmt.Errorf("error validating peerURLs %s: %v", existingCluster, err) } - if !isCompatibleWithCluster(cfg.Logger, cl, cl.MemberByName(cfg.Name).ID, prt) { + if !isCompatibleWithCluster(cfg.Logger, cl, cl.MemberByName(cfg.Name).ID, prt, cfg.NextClusterVersionCompatible) { return nil, fmt.Errorf("incompatible with current running cluster") }