Skip to content

Commit 1b899db

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

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
@@ -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.
48224830
func (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

Comments
 (0)