Browse Source
Merge pull request #1475 from levenlabs/lock
Fix deadlock with KeepConnected and SendHeartbeat
pull/1489/head
Chris Lu
4 years ago
committed by
GitHub
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with
9 additions and
3 deletions
-
weed/command/server.go
-
weed/server/master_grpc_server.go
|
|
@ -99,7 +99,7 @@ func init() { |
|
|
|
serverOptions.v.fileSizeLimitMB = cmdServer.Flag.Int("volume.fileSizeLimitMB", 1024, "limit file size to avoid out of memory") |
|
|
|
serverOptions.v.publicUrl = cmdServer.Flag.String("volume.publicUrl", "", "publicly accessible address") |
|
|
|
serverOptions.v.preStopSeconds = cmdServer.Flag.Int("volume.preStopSeconds", 10, "number of seconds between stop send heartbeats and stop volume server") |
|
|
|
serverOptions.v.pprof = &False |
|
|
|
serverOptions.v.pprof = cmdServer.Flag.Bool("volume.pprof", false, "enable pprof http handlers. precludes --memprofile and --cpuprofile") |
|
|
|
|
|
|
|
s3Options.port = cmdServer.Flag.Int("s3.port", 8333, "s3 server http listen port") |
|
|
|
s3Options.domainName = cmdServer.Flag.String("s3.domainName", "", "suffix of the host name, {bucket}.{domainName}") |
|
|
|
|
|
@ -187,7 +187,8 @@ func (ms *MasterServer) KeepConnected(stream master_pb.Seaweed_KeepConnectedServ |
|
|
|
|
|
|
|
peerAddress := findClientAddress(stream.Context(), req.GrpcPort) |
|
|
|
|
|
|
|
stopChan := make(chan bool) |
|
|
|
// buffer by 1 so we don't end up getting stuck writing to stopChan forever
|
|
|
|
stopChan := make(chan bool, 1) |
|
|
|
|
|
|
|
clientName, messageChan := ms.addClient(req.Name, peerAddress) |
|
|
|
|
|
|
@ -247,7 +248,12 @@ func (ms *MasterServer) addClient(clientType string, clientAddress string) (clie |
|
|
|
clientName = clientType + "@" + clientAddress |
|
|
|
glog.V(0).Infof("+ client %v", clientName) |
|
|
|
|
|
|
|
messageChan = make(chan *master_pb.VolumeLocation) |
|
|
|
// we buffer this because otherwise we end up in a potential deadlock where
|
|
|
|
// the KeepConnected loop is no longer listening on this channel but we're
|
|
|
|
// trying to send to it in SendHeartbeat and so we can't lock the
|
|
|
|
// clientChansLock to remove the channel and we're stuck writing to it
|
|
|
|
// 100 is probably overkill
|
|
|
|
messageChan = make(chan *master_pb.VolumeLocation, 100) |
|
|
|
|
|
|
|
ms.clientChansLock.Lock() |
|
|
|
ms.clientChans[clientName] = messageChan |
|
|
|