func replicaRemoveCall(session mgoSession, addrs ...string) error { mSession := session.(*mgo.Session) if err := replicaset.Remove(mSession, addrs...); err != nil { return errors.Annotate(err, "cannot resume HA") } return nil }
func upgradeMongoWatcher(st *state.State, stopch <-chan struct{}, machineID string, maybeStopMongo StopMongo) error { m, err := st.Machine(machineID) if err != nil { return errors.Annotatef(err, "cannot start watcher for machine %q", machineID) } watch := m.Watch() defer func() { watch.Kill() watch.Wait() }() for { select { case <-watch.Changes(): if err := m.Refresh(); err != nil { return errors.Annotate(err, "cannot refresh machine information") } if !m.IsManager() { continue } expectedVersion, err := m.StopMongoUntilVersion() if err != nil { return errors.Annotate(err, "cannot obtain minimum version of mongo") } if expectedVersion == mongo.Mongo24 { continue } var isMaster bool isMaster, err = mongo.IsMaster(st.MongoSession(), m) if err != nil { return errors.Annotatef(err, "cannot determine if machine %q is master", machineID) } err = maybeStopMongo(expectedVersion, isMaster) if err != nil { return errors.Annotate(err, "cannot determine if mongo must be stopped") } if !isMaster { addrs := make([]string, len(m.Addresses())) ssi, err := st.StateServingInfo() if err != nil { return errors.Annotate(err, "cannot obtain state serving info to stop mongo") } for i, addr := range m.Addresses() { addrs[i] = net.JoinHostPort(addr.Value, strconv.Itoa(ssi.StatePort)) } if err := replicaset.Remove(st.MongoSession(), addrs...); err != nil { return errors.Annotatef(err, "cannot remove %q from replicaset", m.Id()) } if err := m.SetStopMongoUntilVersion(mongo.Mongo24); err != nil { return errors.Annotate(err, "cannot reset stop mongo flag") } } case <-stopch: return nil } } }