aboutsummaryrefslogtreecommitdiff
path: root/weed/server/master_server.go
diff options
context:
space:
mode:
authorKonstantin Lebedev <9497591+kmlebedev@users.noreply.github.com>2022-10-06 21:30:30 +0500
committerGitHub <noreply@github.com>2022-10-06 09:30:30 -0700
commitb9933d558973c41ff05f50a509533d1045bae44f (patch)
tree28a4f9434c809d753c687cf3130b4a954462ef09 /weed/server/master_server.go
parent36daa7709d52e368ee4efc9a05a4e9dece321dc0 (diff)
downloadseaweedfs-b9933d558973c41ff05f50a509533d1045bae44f.tar.xz
seaweedfs-b9933d558973c41ff05f50a509533d1045bae44f.zip
master server graceful stop (#3797)
Diffstat (limited to 'weed/server/master_server.go')
-rw-r--r--weed/server/master_server.go37
1 files changed, 26 insertions, 11 deletions
diff --git a/weed/server/master_server.go b/weed/server/master_server.go
index 758f212ad..cd20f78fc 100644
--- a/weed/server/master_server.go
+++ b/weed/server/master_server.go
@@ -174,39 +174,45 @@ func (ms *MasterServer) SetRaftServer(raftServer *RaftServer) {
glog.V(0).Infof("leader change event: %+v => %+v", e.PrevValue(), e.Value())
stats.MasterLeaderChangeCounter.WithLabelValues(fmt.Sprintf("%+v", e.Value())).Inc()
if ms.Topo.RaftServer.Leader() != "" {
- glog.V(0).Infoln("[", ms.Topo.RaftServer.Name(), "]", ms.Topo.RaftServer.Leader(), "becomes leader.")
+ glog.V(0).Infof("[%s] %s becomes leader.", ms.Topo.RaftServer.Name(), ms.Topo.RaftServer.Leader())
}
})
- raftServerName = ms.Topo.RaftServer.Name()
+ raftServerName = fmt.Sprintf("[%s]", ms.Topo.RaftServer.Name())
} else if raftServer.RaftHashicorp != nil {
ms.Topo.HashicorpRaft = raftServer.RaftHashicorp
leaderCh := raftServer.RaftHashicorp.LeaderCh()
- prevLeader := ms.Topo.HashicorpRaft.Leader()
+ prevLeader, _ := ms.Topo.HashicorpRaft.LeaderWithID()
+ raftServerName = ms.Topo.HashicorpRaft.String()
go func() {
for {
select {
case isLeader := <-leaderCh:
- leader := ms.Topo.HashicorpRaft.Leader()
+ ms.Topo.RaftServerAccessLock.RLock()
+ leader, _ := ms.Topo.HashicorpRaft.LeaderWithID()
+ ms.Topo.RaftServerAccessLock.RUnlock()
glog.V(0).Infof("is leader %+v change event: %+v => %+v", isLeader, prevLeader, leader)
stats.MasterLeaderChangeCounter.WithLabelValues(fmt.Sprintf("%+v", leader)).Inc()
prevLeader = leader
}
}
}()
- raftServerName = ms.Topo.HashicorpRaft.String()
}
ms.Topo.RaftServerAccessLock.Unlock()
if ms.Topo.IsLeader() {
- glog.V(0).Infoln("[", raftServerName, "]", "I am the leader!")
+ glog.V(0).Infof("%s I am the leader!", raftServerName)
} else {
+ var raftServerLeader string
ms.Topo.RaftServerAccessLock.RLock()
- if ms.Topo.RaftServer != nil && ms.Topo.RaftServer.Leader() != "" {
- glog.V(0).Infoln("[", ms.Topo.RaftServer.Name(), "]", ms.Topo.RaftServer.Leader(), "is the leader.")
- } else if ms.Topo.HashicorpRaft != nil && ms.Topo.HashicorpRaft.Leader() != "" {
- glog.V(0).Infoln("[", ms.Topo.HashicorpRaft.String(), "]", ms.Topo.HashicorpRaft.Leader(), "is the leader.")
+ if ms.Topo.RaftServer != nil {
+ raftServerLeader = ms.Topo.RaftServer.Leader()
+ } else if ms.Topo.HashicorpRaft != nil {
+ raftServerName = ms.Topo.HashicorpRaft.String()
+ raftServerLeaderAddr, _ := ms.Topo.HashicorpRaft.LeaderWithID()
+ raftServerLeader = string(raftServerLeaderAddr)
}
ms.Topo.RaftServerAccessLock.RUnlock()
+ glog.V(0).Infof("%s %s - is the leader.", raftServerName, raftServerLeader)
}
}
@@ -388,8 +394,17 @@ func (ms *MasterServer) OnPeerUpdate(update *master_pb.ClusterNodeUpdate, startF
} else {
glog.V(0).Infof("master %s successfully responded to ping", peerName)
}
-
return nil
})
}
}
+
+func (ms *MasterServer) Shutdown() {
+ if ms.Topo == nil || ms.Topo.HashicorpRaft == nil {
+ return
+ }
+ if ms.Topo.HashicorpRaft.State() == hashicorpRaft.Leader {
+ ms.Topo.HashicorpRaft.LeadershipTransfer()
+ }
+ ms.Topo.HashicorpRaft.Shutdown()
+}