diff --git a/session.go b/session.go index cdce36919..e31323f92 100644 --- a/session.go +++ b/session.go @@ -4800,13 +4800,13 @@ func (s *Session) acquireSocket(slaveOk bool) (*mongoSocket, error) { s.m.RLock() // If there is a slave socket reserved and its use is acceptable, take it as long // as there isn't a master socket which would be preferred by the read preference mode. - if s.slaveSocket != nil && s.slaveOk && slaveOk && (s.masterSocket == nil || s.consistency != PrimaryPreferred && s.consistency != Monotonic) { + if s.slaveSocket != nil && s.slaveSocket.dead == nil && s.slaveOk && slaveOk && (s.masterSocket == nil || s.consistency != PrimaryPreferred && s.consistency != Monotonic) { socket := s.slaveSocket socket.Acquire() s.m.RUnlock() return socket, nil } - if s.masterSocket != nil { + if s.masterSocket != nil && s.masterSocket.dead == nil { socket := s.masterSocket socket.Acquire() s.m.RUnlock() @@ -4820,12 +4820,20 @@ func (s *Session) acquireSocket(slaveOk bool) (*mongoSocket, error) { defer s.m.Unlock() if s.slaveSocket != nil && s.slaveOk && slaveOk && (s.masterSocket == nil || s.consistency != PrimaryPreferred && s.consistency != Monotonic) { - s.slaveSocket.Acquire() - return s.slaveSocket, nil + if s.slaveSocket.dead == nil { + s.slaveSocket.Acquire() + return s.slaveSocket, nil + } else { + s.unsetSocket() + } } if s.masterSocket != nil { - s.masterSocket.Acquire() - return s.masterSocket, nil + if s.masterSocket.dead == nil { + s.masterSocket.Acquire() + return s.masterSocket, nil + } else { + s.unsetSocket() + } } // Still not good. We need a new socket. @@ -4876,9 +4884,11 @@ func (s *Session) setSocket(socket *mongoSocket) { // unsetSocket releases any slave and/or master sockets reserved. func (s *Session) unsetSocket() { if s.masterSocket != nil { + debugf("unset master socket from session %p", s) s.masterSocket.Release() } if s.slaveSocket != nil { + debugf("unset slave socket from session %p", s) s.slaveSocket.Release() } s.masterSocket = nil