From 25fbff5d52f0c74bd0ee55802ee20e80e0359f44 Mon Sep 17 00:00:00 2001 From: "cheng.li01" Date: Mon, 10 Aug 2020 16:37:47 +0800 Subject: [PATCH] fix bug: two same volumeId in different collections 1, there will be two leader when master server startup in a few seconds 2, raft server will get a leader even there is only one master, so there is no need to do hard code to set the server to be leader --- weed/topology/topology.go | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/weed/topology/topology.go b/weed/topology/topology.go index 993f444a7..f93d2179c 100644 --- a/weed/topology/topology.go +++ b/weed/topology/topology.go @@ -5,6 +5,7 @@ import ( "fmt" "math/rand" "sync" + "time" "github.com/chrislusf/raft" @@ -65,26 +66,26 @@ func (t *Topology) IsLeader() bool { if t.RaftServer.State() == raft.Leader { return true } - if t.RaftServer.Leader() == "" { - return true - } } return false } func (t *Topology) Leader() (string, error) { l := "" - if t.RaftServer != nil { - l = t.RaftServer.Leader() - } else { - return "", errors.New("Raft Server not ready yet!") - } - - if l == "" { - // We are a single node cluster, we are the leader - return t.RaftServer.Name(), nil + count := 3 + for count > 0 { + if t.RaftServer != nil { + l = t.RaftServer.Leader() + } else { + return "", errors.New("Raft Server not ready yet!") + } + if l != "" { + break + } else { + time.Sleep(time.Duration(5-count) * time.Second) + } + count -= 1 } - return l, nil }