diff --git a/cmd/rqlited/main.go b/cmd/rqlited/main.go index 36ca8aed..2f0d03fe 100644 --- a/cmd/rqlited/main.go +++ b/cmd/rqlited/main.go @@ -423,7 +423,6 @@ func createCluster(cfg *Config, hasPeers bool, client *cluster.Client, str *stor if err := networkCheckJoinAddrs(joins); err != nil { return err } - if joins == nil && cfg.DiscoMode == "" && !hasPeers { if cfg.RaftNonVoter { return fmt.Errorf("cannot create a new non-voting node without joining it to an existing cluster") @@ -438,16 +437,17 @@ func createCluster(cfg *Config, hasPeers bool, client *cluster.Client, str *stor } // Prepare definition of being part of a cluster. - isClustered := func() bool { + bootDoneFn := func() bool { leader, _ := str.LeaderAddr() return leader != "" } + clusterSuf := cluster.VoterSuffrage(!cfg.RaftNonVoter) joiner := cluster.NewJoiner(client, cfg.JoinAttempts, cfg.JoinInterval) joiner.SetCredentials(cluster.CredentialsFor(credStr, cfg.JoinAs)) if joins != nil && cfg.BootstrapExpect == 0 { // Explicit join operation requested, so do it. - j, err := joiner.Do(joins, str.ID(), cfg.RaftAdv, cluster.VoterSuffrage(!cfg.RaftNonVoter)) + j, err := joiner.Do(joins, str.ID(), cfg.RaftAdv, clusterSuf) if err != nil { return fmt.Errorf("failed to join cluster: %s", err.Error()) } @@ -459,7 +459,7 @@ func createCluster(cfg *Config, hasPeers bool, client *cluster.Client, str *stor // Bootstrap with explicit join addresses requests. bs := cluster.NewBootstrapper(cluster.NewAddressProviderString(joins), client) bs.SetCredentials(cluster.CredentialsFor(credStr, cfg.JoinAs)) - return bs.Boot(str.ID(), cfg.RaftAdv, cluster.VoterSuffrage(!cfg.RaftNonVoter), isClustered, cfg.BootstrapExpectTimeout) + return bs.Boot(str.ID(), cfg.RaftAdv, clusterSuf, bootDoneFn, cfg.BootstrapExpectTimeout) } if cfg.DiscoMode == "" { @@ -503,7 +503,7 @@ func createCluster(cfg *Config, hasPeers bool, client *cluster.Client, str *stor bs := cluster.NewBootstrapper(provider, client) bs.SetCredentials(cluster.CredentialsFor(credStr, cfg.JoinAs)) httpServ.RegisterStatus("disco", provider) - return bs.Boot(str.ID(), cfg.RaftAdv, cluster.VoterSuffrage(!cfg.RaftNonVoter), isClustered, cfg.BootstrapExpectTimeout) + return bs.Boot(str.ID(), cfg.RaftAdv, clusterSuf, bootDoneFn, cfg.BootstrapExpectTimeout) case DiscoModeEtcdKV, DiscoModeConsulKV: discoService, err := createDiscoService(cfg, str) @@ -533,7 +533,7 @@ func createCluster(cfg *Config, hasPeers bool, client *cluster.Client, str *stor } else { for { log.Printf("discovery service returned %s as join address", addr) - if j, err := joiner.Do([]string{addr}, str.ID(), cfg.RaftAdv, cluster.VoterSuffrage(!cfg.RaftNonVoter)); err != nil { + if j, err := joiner.Do([]string{addr}, str.ID(), cfg.RaftAdv, clusterSuf); err != nil { log.Printf("failed to join cluster at %s: %s", addr, err.Error()) time.Sleep(time.Second)