aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Lu <chris.lu@gmail.com>2020-04-28 17:29:10 -0700
committerChris Lu <chris.lu@gmail.com>2020-04-28 17:29:10 -0700
commit31583b5d6ca023edc95039815f05c4cfffeb02ad (patch)
treec0cb4f07cda74ab6e8f17d9d64f3413c317b1d10
parent98edec7c3e00f7fb40155f0a71bc8c73cddd004a (diff)
downloadseaweedfs-31583b5d6ca023edc95039815f05c4cfffeb02ad.tar.xz
seaweedfs-31583b5d6ca023edc95039815f05c4cfffeb02ad.zip
master and volume server: avoid race condition
The volume server may disconnect and reconnect to the same master. The master's unregistration may happen after the reconnection. Thus the volume server will disappear.
-rw-r--r--weed/server/master_grpc_server.go4
-rw-r--r--weed/server/volume_grpc_client_to_master.go3
2 files changed, 6 insertions, 1 deletions
diff --git a/weed/server/master_grpc_server.go b/weed/server/master_grpc_server.go
index 9f5bf569d..1ee214deb 100644
--- a/weed/server/master_grpc_server.go
+++ b/weed/server/master_grpc_server.go
@@ -24,8 +24,10 @@ func (ms *MasterServer) SendHeartbeat(stream master_pb.Seaweed_SendHeartbeatServ
defer func() {
if dn != nil {
- glog.V(0).Infof("unregister disconnected volume server %s:%d", dn.Ip, dn.Port)
+ // if the volume server disconnects and reconnects quickly
+ // the unregister and register can race with each other
t.UnRegisterDataNode(dn)
+ glog.V(0).Infof("unregister disconnected volume server %s:%d", dn.Ip, dn.Port)
message := &master_pb.VolumeLocation{
Url: dn.Url(),
diff --git a/weed/server/volume_grpc_client_to_master.go b/weed/server/volume_grpc_client_to_master.go
index 517eb4bc0..7cb836344 100644
--- a/weed/server/volume_grpc_client_to_master.go
+++ b/weed/server/volume_grpc_client_to_master.go
@@ -35,6 +35,9 @@ func (vs *VolumeServer) heartbeat() {
for {
for _, master := range vs.SeedMasterNodes {
if newLeader != "" {
+ // the new leader may actually is the same master
+ // need to wait a bit before adding itself
+ time.Sleep(3 * time.Second)
master = newLeader
}
masterGrpcAddress, parseErr := pb.ParseServerToGrpcAddress(master)