// attemptInitiateMongoServer attempts to initiate the replica set. func attemptInitiateMongoServer(dialInfo *mgo.DialInfo, memberHostPort string) error { session, err := mgo.DialWithInfo(dialInfo) if err != nil { return errors.Annotatef(err, "cannot dial mongo to initiate replicaset") } defer session.Close() session.SetSocketTimeout(mongo.SocketTimeout) return replicaset.Initiate( session, memberHostPort, mongo.ReplicaSetName, map[string]string{ jujuMachineKey: agent.BootstrapMachineId, }, ) }
// attemptInitiateMongoServer attempts to initiate the replica set. func attemptInitiateMongoServer(dialInfo *mgo.DialInfo, memberHostPort string, force bool) error { session, err := mgo.DialWithInfo(dialInfo) if err != nil { return errors.Annotatef(err, "cannot dial mongo to initiate replicaset") } defer session.Close() session.SetSocketTimeout(mongo.SocketTimeout) if !force { bInfo, err := session.BuildInfo() if err != nil && isNotUnreachableError(err) { return errors.Annotate(err, "cannot determine mongo build information") } var cfg *replicaset.Config if err != nil || !bInfo.VersionAtLeast(3) { cfg, err = replicaset.CurrentConfig(session) if err != nil && err != mgo.ErrNotFound { return errors.Errorf("cannot get replica set configuration: %v", err) } } if cfg != nil && len(cfg.Members) > 0 { logger.Infof("replica set configuration found: %#v", cfg) return ErrReplicaSetAlreadyInitiated } } return replicaset.Initiate( session, memberHostPort, mongo.ReplicaSetName, map[string]string{ jujuMachineKey: agent.BootstrapMachineId, }, ) }
// startReplicaSet starts up a replica set with n mongo instances. func startReplicaSet(n int) (_ []*gitjujutesting.MgoInstance, err error) { insts := make([]*gitjujutesting.MgoInstance, 0, n) root, err := newMongoInstance() if err != nil { return nil, err } insts = append(insts, root) defer func() { if err == nil { return } for _, inst := range insts { inst.Destroy() } }() dialInfo := root.DialInfo() dialInfo.Direct = true dialInfo.Timeout = 60 * time.Second session, err := root.DialDirect() if err != nil { return nil, fmt.Errorf("cannot dial root instance: %v", err) } defer session.Close() logger.Infof("dialled root instance") if err := replicaset.Initiate(session, root.Addr(), replicaSetName, nil); err != nil { return nil, fmt.Errorf("cannot initiate replica set: %v", err) } var members []replicaset.Member for i := 1; i < n; i++ { inst, err := newMongoInstance() if err != nil { return nil, err } insts = append(insts, inst) members = append(members, replicaset.Member{ Address: inst.Addr(), Priority: newFloat64(0.1), Id: i + 1, }) } attempt := utils.AttemptStrategy{ Total: 60 * time.Second, Delay: 1 * time.Second, } for a := attempt.Start(); a.Next(); { err := replicaset.Add(session, members...) if err == nil { break } logger.Errorf("cannot add members: %v", err) if !a.HasNext() { return nil, fmt.Errorf("timed out trying to add members") } logger.Errorf("retrying") } return insts, err }