@@ -40,19 +40,20 @@ type replyFunc func(err error, reply *replyOp, docNum int, docData []byte)
4040
4141type mongoSocket struct {
4242 sync.Mutex
43- server * mongoServer // nil when cached
44- conn net.Conn
45- timeout time.Duration
46- addr string // For debugging only.
47- nextRequestId uint32
48- replyFuncs map [uint32 ]replyFunc
49- references int
50- creds []Credential
51- logout []Credential
52- cachedNonce string
53- gotNonce sync.Cond
54- dead error
55- serverInfo * mongoServerInfo
43+ server * mongoServer // nil when cached
44+ conn net.Conn
45+ timeout time.Duration
46+ addr string // For debugging only.
47+ nextRequestId uint32
48+ replyFuncs map [uint32 ]replyFunc
49+ references int
50+ creds []Credential
51+ logout []Credential
52+ cachedNonce string
53+ gotNonce sync.Cond
54+ dead error
55+ serverInfo * mongoServerInfo
56+ closeAfterIdle bool
5657}
5758
5859type queryOpFlags uint32
@@ -264,10 +265,13 @@ func (socket *mongoSocket) Release() {
264265 if socket .references == 0 {
265266 stats .socketsInUse (- 1 )
266267 server := socket .server
268+ closeAfterIdle := socket .closeAfterIdle
267269 socket .Unlock ()
268270 socket .LogoutAll ()
269- // If the socket is dead server is nil.
270- if server != nil {
271+ if closeAfterIdle {
272+ socket .Close ()
273+ } else if server != nil {
274+ // If the socket is dead server is nil.
271275 server .RecycleSocket (socket )
272276 }
273277 } else {
@@ -316,6 +320,19 @@ func (socket *mongoSocket) Close() {
316320 socket .kill (errors .New ("Closed explicitly" ), false )
317321}
318322
323+ func (socket * mongoSocket ) CloseAfterIdle () {
324+ socket .Lock ()
325+ if socket .references == 0 {
326+ socket .Unlock ()
327+ socket .Close ()
328+ logf ("Socket %p to %s: idle and close." , socket , socket .addr )
329+ return
330+ }
331+ socket .closeAfterIdle = true
332+ socket .Unlock ()
333+ logf ("Socket %p to %s: close after idle." , socket , socket .addr )
334+ }
335+
319336func (socket * mongoSocket ) kill (err error , abend bool ) {
320337 socket .Lock ()
321338 if socket .dead != nil {
0 commit comments