diff options
| author | Chris Lu <chris.lu@gmail.com> | 2020-10-07 01:25:39 -0700 |
|---|---|---|
| committer | Chris Lu <chris.lu@gmail.com> | 2020-10-07 01:25:39 -0700 |
| commit | da4edf3651d0dd17570057388e5e012eeda4ff80 (patch) | |
| tree | 8122c14acacf89d66dec12f97c4a16075e5b2588 /weed/command/master.go | |
| parent | c543762e23d5f38dc90365f6e9c04abc5aa5c0d4 (diff) | |
| download | seaweedfs-da4edf3651d0dd17570057388e5e012eeda4ff80.tar.xz seaweedfs-da4edf3651d0dd17570057388e5e012eeda4ff80.zip | |
master: check peers for existing leader before starting a leader election
fix https://github.com/chrislusf/seaweedfs/issues/1509
Diffstat (limited to 'weed/command/master.go')
| -rw-r--r-- | weed/command/master.go | 26 |
1 files changed, 22 insertions, 4 deletions
diff --git a/weed/command/master.go b/weed/command/master.go index a42983259..bf5f83875 100644 --- a/weed/command/master.go +++ b/weed/command/master.go @@ -1,15 +1,16 @@ package command import ( + "github.com/chrislusf/raft/protobuf" + "github.com/gorilla/mux" + "google.golang.org/grpc/reflection" "net/http" "os" "runtime" + "sort" "strconv" "strings" - - "github.com/chrislusf/raft/protobuf" - "github.com/gorilla/mux" - "google.golang.org/grpc/reflection" + "time" "github.com/chrislusf/seaweedfs/weed/util/grace" @@ -141,6 +142,15 @@ func startMaster(masterOption MasterOptions, masterWhiteList []string) { glog.V(0).Infof("Start Seaweed Master %s grpc server at %s:%d", util.Version(), *masterOption.ipBind, grpcPort) go grpcS.Serve(grpcL) + go func() { + time.Sleep(1500 * time.Millisecond) + if ms.Topo.RaftServer.Leader() == "" && ms.Topo.RaftServer.IsLogEmpty() && isTheFirstOne(myMasterAddress, peers) { + if ms.MasterClient.FindLeader(myMasterAddress) == "" { + raftServer.DoJoinCommand() + } + } + }() + go ms.MasterClient.KeepConnectedToMaster() // start http server @@ -174,6 +184,14 @@ func checkPeers(masterIp string, masterPort int, peers string) (masterAddress st return } +func isTheFirstOne(self string, peers []string) bool { + sort.Strings(peers) + if len(peers) <= 0 { + return true + } + return self == peers[0] +} + func (m *MasterOptions) toMasterOption(whiteList []string) *weed_server.MasterOption { return &weed_server.MasterOption{ Host: *m.ip, |
