Browse Source

fix: drain regWait channel before closing to prevent message loss

- Add drain loop before closing regWait in reconnect() cleanup
- Add drain loop before closing regWait in handleDisconnect() cleanup
- Ensures no pending RegistrationResponse messages are lost during channel closure
pull/7838/head
Chris Lu 2 months ago
parent
commit
6ad8cb56f7
  1. 26
      weed/worker/client.go

26
weed/worker/client.go

@ -270,8 +270,17 @@ func (c *GrpcAdminClient) reconnect(s *grpcState) error {
c.safeCloseChannel(&s.streamExit)
c.safeCloseChannel(&s.streamFailed)
if s.regWait != nil {
close(s.regWait)
s.regWait = nil
// Drain any pending registration responses before closing to avoid losing them
for {
select {
case <-s.regWait:
// continue draining until channel is empty
default:
close(s.regWait)
s.regWait = nil
break
}
}
}
if s.streamCancel != nil {
s.streamCancel()
@ -552,8 +561,17 @@ func (c *GrpcAdminClient) handleDisconnect(cmd grpcCommand, s *grpcState) {
c.safeCloseChannel(&s.streamExit)
c.safeCloseChannel(&s.streamFailed)
if s.regWait != nil {
close(s.regWait)
s.regWait = nil
// Drain any pending registration responses before closing to avoid losing them
for {
select {
case <-s.regWait:
// continue draining until channel is empty
default:
close(s.regWait)
s.regWait = nil
break
}
}
}
// Cancel stream context

Loading…
Cancel
Save