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

@ -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 // cluster version in the range of [MinClusterVersion, Version] and no known members has a cluster version
// out of the range. // out of the range.
// We set this rule since when the local member joins, another member might be offline. // 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) vers := getVersions(lg, cl, local, rt)
minV := semver.Must(semver.NewVersion(version.MinClusterVersion)) minV := semver.Must(semver.NewVersion(version.MinClusterVersion))
maxV := semver.Must(semver.NewVersion(version.Version)) maxV := semver.Must(semver.NewVersion(version.Version))
@ -241,6 +241,9 @@ func isCompatibleWithCluster(lg *zap.Logger, cl *membership.RaftCluster, local t
Major: maxV.Major, Major: maxV.Major,
Minor: maxV.Minor, Minor: maxV.Minor,
} }
if nextClusterVersionCompatible {
maxV.Minor += 1
}
return isCompatibleWithVers(lg, vers, local, minV, maxV) 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 { if err = membership.ValidateClusterAndAssignIDs(cfg.Logger, cl, existingCluster); err != nil {
return nil, fmt.Errorf("error validating peerURLs %s: %v", existingCluster, err) 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") return nil, fmt.Errorf("incompatible with current running cluster")
} }