globalsign / mgo

The MongoDB driver for Go
Other
1.97k stars 231 forks source link

Lock never unlocked in socket.SimpleQuery #348

Open rajeshnair opened 5 years ago

rajeshnair commented 5 years ago

wait Mutex in socket.SimpleQuery is never Unlocked. https://github.com/globalsign/mgo/blob/master/socket.go#L408

func (socket *mongoSocket) SimpleQuery(op *queryOp) (data []byte, err error) {
    var wait, change sync.Mutex
    var replyDone bool
    var replyData []byte
    var replyErr error
    wait.Lock()
    op.replyFunc = func(err error, reply *replyOp, docNum int, docData []byte) {
        change.Lock()
        if !replyDone {
            replyDone = true
            replyErr = err
            if err == nil {
                replyData = docData
            }
        }
        change.Unlock()
        wait.Unlock()
    }
    err = socket.Query(op)
    if err != nil {
        return nil, err
    }
    wait.Lock()
    change.Lock()
    data = replyData
    err = replyErr
    change.Unlock()
    return data, err
}

What version of MongoDB are you using (mongod --version)?

3.4.9

What version of Go are you using (go version)?

1.11.4

What operating system and processor architecture are you using (go env)?

GOARCH="amd64"
GOOS="darwin"

What did you do?

We started seeing deadlocks which pointed to globalsiogn/mgo driver when we started using listIndexes Trying the prof dump, lead us to this method which is used in multiple places

Can you reproduce the issue on the latest development branch?

We have not tried the development branch yet