// CurrentStatus returns the status of the replica set for the given session. func CurrentStatus(session *mgo.Session) (*Status, error) { status := &Status{} err := session.Run("replSetGetStatus", status) if err != nil { return nil, fmt.Errorf("cannot get replica set status: %v", err) } return status, nil }
// IsMaster returns information about the configuration of the node that // the given session is connected to. func IsMaster(session *mgo.Session) (*IsMasterResults, error) { results := &IsMasterResults{} err := session.Run("isMaster", results) if err != nil { return nil, err } return results, nil }
// Optime returns the Timestamp for mongo getoptime command, session should be a direct session. func Optime(s *mgo.Session) (*Timestamp, error) { ts := new(Timestamp) stats := struct { Optime optime }{} if err := s.Run("getoptime", &stats); err != nil { return ts, err } *ts = Timestamp(stats.Optime) return ts, nil }
// applyRelSetConfig applies the new config to the mongo session. It also logs // what the changes are. It checks if the replica set changes cause the DB // connection to be dropped. If so, it Refreshes the session and tries to Ping // again. func applyRelSetConfig(cmd string, session *mgo.Session, oldconfig, newconfig *Config) error { logger.Debugf("%s() changing replica set\nfrom %s\n to %s", cmd, fmtConfigForLog(oldconfig), fmtConfigForLog(newconfig)) err := session.Run(bson.D{{"replSetReconfig", newconfig}}, nil) // We will only try to Ping 2 times for i := 0; i < 2; i++ { if err == io.EOF { // If the primary changes due to replSetReconfig, then all // current connections are dropped. // Refreshing should fix us up. logger.Debugf("got EOF while running %s(), calling session.Refresh()", cmd) session.Refresh() } else if err != nil { // For all errors that aren't EOF, return immediately return err } // err is either nil or EOF and we called Refresh, so Ping to // make sure we're actually connected err = session.Ping() // Change the command because it is the new command we ran cmd = "Ping" } return err }