@@ -4745,13 +4745,13 @@ func (s *Session) acquireSocket(slaveOk bool) (*mongoSocket, error) {
47454745 s .m .RLock ()
47464746 // If there is a slave socket reserved and its use is acceptable, take it as long
47474747 // as there isn't a master socket which would be preferred by the read preference mode.
4748- if s .slaveSocket != nil && s .slaveOk && slaveOk && (s .masterSocket == nil || s .consistency != PrimaryPreferred && s .consistency != Monotonic ) {
4748+ if s .slaveSocket != nil && s .slaveSocket . dead == nil && s . slaveOk && slaveOk && (s .masterSocket == nil || s .consistency != PrimaryPreferred && s .consistency != Monotonic ) {
47494749 socket := s .slaveSocket
47504750 socket .Acquire ()
47514751 s .m .RUnlock ()
47524752 return socket , nil
47534753 }
4754- if s .masterSocket != nil {
4754+ if s .masterSocket != nil && s . masterSocket . dead == nil {
47554755 socket := s .masterSocket
47564756 socket .Acquire ()
47574757 s .m .RUnlock ()
@@ -4765,12 +4765,20 @@ func (s *Session) acquireSocket(slaveOk bool) (*mongoSocket, error) {
47654765 defer s .m .Unlock ()
47664766
47674767 if s .slaveSocket != nil && s .slaveOk && slaveOk && (s .masterSocket == nil || s .consistency != PrimaryPreferred && s .consistency != Monotonic ) {
4768- s .slaveSocket .Acquire ()
4769- return s .slaveSocket , nil
4768+ if s .slaveSocket .dead == nil {
4769+ s .slaveSocket .Acquire ()
4770+ return s .slaveSocket , nil
4771+ } else {
4772+ s .unsetSocket ()
4773+ }
47704774 }
47714775 if s .masterSocket != nil {
4772- s .masterSocket .Acquire ()
4773- return s .masterSocket , nil
4776+ if s .masterSocket .dead == nil {
4777+ s .masterSocket .Acquire ()
4778+ return s .masterSocket , nil
4779+ } else {
4780+ s .unsetSocket ()
4781+ }
47744782 }
47754783
47764784 // Still not good. We need a new socket.
@@ -4821,9 +4829,11 @@ func (s *Session) setSocket(socket *mongoSocket) {
48214829// unsetSocket releases any slave and/or master sockets reserved.
48224830func (s * Session ) unsetSocket () {
48234831 if s .masterSocket != nil {
4832+ debugf ("unset master socket from session %p" , s )
48244833 s .masterSocket .Release ()
48254834 }
48264835 if s .slaveSocket != nil {
4836+ debugf ("unset slave socket from session %p" , s )
48274837 s .slaveSocket .Release ()
48284838 }
48294839 s .masterSocket = nil
0 commit comments