func (s *EtcdServer) updateClusterVersion(ver string) { if s.cluster.Version() == nil { plog.Infof("setting up the initial cluster version to %s", version.Cluster(ver)) } else { plog.Infof("updating the cluster version from %s to %s", version.Cluster(s.cluster.Version().String()), version.Cluster(ver)) } req := pb.Request{ Method: "PUT", Path: path.Join(StoreClusterPrefix, "version"), Val: ver, } ctx, cancel := context.WithTimeout(context.Background(), s.cfg.ReqTimeout()) _, err := s.Do(ctx, req) cancel() switch err { case nil: return case ErrStopped: plog.Infof("aborting update cluster version because server is stopped") return default: plog.Errorf("error updating cluster version (%v)", 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())) } }
// start prepares and starts server in a new goroutine. It is no longer safe to // modify a server's fields after it has been sent to Start. // This function is just used for testing. func (s *EtcdServer) start() { if s.snapCount == 0 { plog.Infof("set snapshot count to default %d", DefaultSnapCount) s.snapCount = DefaultSnapCount } s.w = wait.New() s.done = make(chan struct{}) s.stop = make(chan struct{}) if s.ClusterVersion() != nil { plog.Infof("starting server... [version: %v, cluster version: %v]", version.Version, version.Cluster(s.ClusterVersion().String())) } else { plog.Infof("starting server... [version: %v, cluster version: to_be_decided]", version.Version) } // TODO: if this is an empty log, writes all peer infos // into the first entry go s.run() }