Description
In gomecached, it holds lock while writing to the data channel. If data channel is full, this goroutine will hold onto the lock.
func (feed *UprFeed) doStreamClose(ch chan *UprEvent) \{
|
feed.mu.RLock()
|
for vb, stream := range feed.vbstreams \{
|
uprEvent := &UprEvent\{
|
VBucket: vb,
|
VBuuid: stream.Vbuuid,
|
Opcode: gomemcached.UPR_STREAMEND,
|
}
|
ch <- uprEvent
|
}
|
feed.mu.RUnlock()
|
}
|
In dcp_nozzle.processData(), it could make gomemcached call that could wait for the same lock.
if m.Opcode == mc.UPR_STREAMREQ \{
|
|
...
|
|
} else if m.Status == mc.ROLLBACK \{
|
|
...
|
|
dcp.startUprStream(vbno, updated_ts)
|
|
|
Attachments
Issue Links
- depends on
-
MB-25599 Possible deadlock between dcp_nozzle and gomemcached
- Closed