Merge pull request #17665 from siyuanfoundation/3.4-downgrade

[3.4] Allow new server to join higher cluster version if NextClusterVersionCompatible is true
This commit is contained in:
Benjamin Wang 2024-03-29 21:04:28 +00:00 committed by GitHub
commit 75f799cdc1
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 6 additions and 3 deletions

View File

@ -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 ''

View File

@ -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)
}

View File

@ -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")
}