Skip to content

Commit 38eea2b

Browse files
committed
try to fix the issue that socket always returns "i/o timeout" or "Closed explicitly" error
1 parent 1ac9b5d commit 38eea2b

File tree

1 file changed

+16
-6
lines changed

1 file changed

+16
-6
lines changed

session.go

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4800,13 +4800,13 @@ func (s *Session) acquireSocket(slaveOk bool) (*mongoSocket, error) {
48004800
s.m.RLock()
48014801
// If there is a slave socket reserved and its use is acceptable, take it as long
48024802
// 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) {
48044804
socket := s.slaveSocket
48054805
socket.Acquire()
48064806
s.m.RUnlock()
48074807
return socket, nil
48084808
}
4809-
if s.masterSocket != nil {
4809+
if s.masterSocket != nil && s.masterSocket.dead == nil {
48104810
socket := s.masterSocket
48114811
socket.Acquire()
48124812
s.m.RUnlock()
@@ -4820,12 +4820,20 @@ func (s *Session) acquireSocket(slaveOk bool) (*mongoSocket, error) {
48204820
defer s.m.Unlock()
48214821

48224822
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+
}
48254829
}
48264830
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+
}
48294837
}
48304838

48314839
// Still not good. We need a new socket.
@@ -4876,9 +4884,11 @@ func (s *Session) setSocket(socket *mongoSocket) {
48764884
// unsetSocket releases any slave and/or master sockets reserved.
48774885
func (s *Session) unsetSocket() {
48784886
if s.masterSocket != nil {
4887+
debugf("unset master socket from session %p", s)
48794888
s.masterSocket.Release()
48804889
}
48814890
if s.slaveSocket != nil {
4891+
debugf("unset slave socket from session %p", s)
48824892
s.slaveSocket.Release()
48834893
}
48844894
s.masterSocket = nil

0 commit comments

Comments
 (0)