fix: mutex deadlock when connection close

This commit is contained in:
barryyt.cai.moxa
2025-12-09 11:51:38 +08:00
parent af17ac4c09
commit cb1b1b1673
2 changed files with 11 additions and 7 deletions

View File

@@ -828,11 +828,12 @@ func (c *client) Close() {
Timestamp: time.Now().Unix(),
})
if c.mu.Lock(); c.conn != nil {
c.mu.Lock()
if c.conn != nil {
_ = c.conn.Close()
c.conn = nil
c.mu.Unlock()
}
c.mu.Unlock()
if b == nil {
return
@@ -905,13 +906,14 @@ func (c *client) WriterPacket(packet packets.ControlPacket) error {
if packet == nil {
return nil
}
if c.conn == nil {
c.Close()
return errors.New("connect lost ....")
}
c.mu.Lock()
defer c.mu.Unlock()
if c.conn == nil {
return errors.New("connect lost ....")
}
return packet.Write(c.conn)
}

View File

@@ -202,11 +202,13 @@ func (c *client) retryDelivery() {
c.inflightMu.RLock()
ilen := len(c.inflight)
if c.mu.Lock(); c.conn == nil || ilen == 0 { //Reset timer when client offline OR inflight is empty
c.mu.Lock()
if c.conn == nil || ilen == 0 { //Reset timer when client offline OR inflight is empty
c.inflightMu.RUnlock()
c.mu.Unlock()
return
}
c.mu.Unlock()
// copy the to be retried elements out of the map to only hold the lock for a short time and use the new slice later to iterate
// through them