diff options
| author | Chris Lu <chris.lu@gmail.com> | 2020-04-28 17:29:10 -0700 |
|---|---|---|
| committer | Chris Lu <chris.lu@gmail.com> | 2020-04-28 17:29:10 -0700 |
| commit | 31583b5d6ca023edc95039815f05c4cfffeb02ad (patch) | |
| tree | c0cb4f07cda74ab6e8f17d9d64f3413c317b1d10 /weed | |
| parent | 98edec7c3e00f7fb40155f0a71bc8c73cddd004a (diff) | |
| download | seaweedfs-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.
Diffstat (limited to 'weed')
| -rw-r--r-- | weed/server/master_grpc_server.go | 4 | ||||
| -rw-r--r-- | weed/server/volume_grpc_client_to_master.go | 3 |
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) |
