Merge pull request #3309 from xiang90/enforce

etcdserver: add version enforcement when setting cluster version
This commit is contained in:
Xiang Li 2015-08-17 12:41:04 -07:00
commit ba3a9b5f92
2 changed files with 11 additions and 0 deletions

View File

@ -222,6 +222,7 @@ func (c *cluster) SetStore(st store.Store) { c.store = st }
func (c *cluster) Recover() {
c.members, c.removed = membersFromStore(c.store)
c.version = clusterVersionFromStore(c.store)
MustDetectDowngrade(c.version)
}
// ValidateConfigurationChange takes a proposed ConfChange and
@ -364,6 +365,7 @@ func (c *cluster) SetVersion(ver *semver.Version) {
plog.Noticef("set the initial cluster version to %v", version.Cluster(ver.String()))
}
c.version = ver
MustDetectDowngrade(c.version)
}
func membersFromStore(st store.Store) (map[types.ID]*Member, map[types.ID]bool) {

View File

@ -252,3 +252,12 @@ func getVersion(m *Member, tr *http.Transport) (*version.Versions, error) {
}
return nil, err
}
func MustDetectDowngrade(cv *semver.Version) {
lv := semver.Must(semver.NewVersion(version.Version))
// only keep major.minor version for comparison against cluster version
lv = &semver.Version{Major: lv.Major, Minor: lv.Minor}
if cv != nil && lv.LessThan(*cv) {
plog.Fatalf("cluster cannot be downgraded (current version: %s is lower than determined cluster version: %s).", version.Version, version.Cluster(cv.String()))
}
}