// 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 }