@@ -4800,13 +4800,13 @@ func (s *Session) acquireSocket(slaveOk bool) (*mongoSocket, error) {
4800
4800
s .m .RLock ()
4801
4801
// If there is a slave socket reserved and its use is acceptable, take it as long
4802
4802
// as there isn't a master socket which would be preferred by the read preference mode.
4803
- if s .slaveSocket != nil && s .slaveOk && slaveOk && (s .masterSocket == nil || s .consistency != PrimaryPreferred && s .consistency != Monotonic ) {
4803
+ if s .slaveSocket != nil && s .slaveSocket . dead == nil && s . slaveOk && slaveOk && (s .masterSocket == nil || s .consistency != PrimaryPreferred && s .consistency != Monotonic ) {
4804
4804
socket := s .slaveSocket
4805
4805
socket .Acquire ()
4806
4806
s .m .RUnlock ()
4807
4807
return socket , nil
4808
4808
}
4809
- if s .masterSocket != nil {
4809
+ if s .masterSocket != nil && s . masterSocket . dead == nil {
4810
4810
socket := s .masterSocket
4811
4811
socket .Acquire ()
4812
4812
s .m .RUnlock ()
@@ -4820,12 +4820,20 @@ func (s *Session) acquireSocket(slaveOk bool) (*mongoSocket, error) {
4820
4820
defer s .m .Unlock ()
4821
4821
4822
4822
if s .slaveSocket != nil && s .slaveOk && slaveOk && (s .masterSocket == nil || s .consistency != PrimaryPreferred && s .consistency != Monotonic ) {
4823
- s .slaveSocket .Acquire ()
4824
- return s .slaveSocket , nil
4823
+ if s .slaveSocket .dead == nil {
4824
+ s .slaveSocket .Acquire ()
4825
+ return s .slaveSocket , nil
4826
+ } else {
4827
+ s .unsetSocket ()
4828
+ }
4825
4829
}
4826
4830
if s .masterSocket != nil {
4827
- s .masterSocket .Acquire ()
4828
- return s .masterSocket , nil
4831
+ if s .masterSocket .dead == nil {
4832
+ s .masterSocket .Acquire ()
4833
+ return s .masterSocket , nil
4834
+ } else {
4835
+ s .unsetSocket ()
4836
+ }
4829
4837
}
4830
4838
4831
4839
// Still not good. We need a new socket.
@@ -4876,9 +4884,11 @@ func (s *Session) setSocket(socket *mongoSocket) {
4876
4884
// unsetSocket releases any slave and/or master sockets reserved.
4877
4885
func (s * Session ) unsetSocket () {
4878
4886
if s .masterSocket != nil {
4887
+ debugf ("unset master socket from session %p" , s )
4879
4888
s .masterSocket .Release ()
4880
4889
}
4881
4890
if s .slaveSocket != nil {
4891
+ debugf ("unset slave socket from session %p" , s )
4882
4892
s .slaveSocket .Release ()
4883
4893
}
4884
4894
s .masterSocket = nil
0 commit comments