@@ -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
@@ -268,10 +269,13 @@ func (socket *mongoSocket) Release() {
268269 if socket .references == 0 {
269270 stats .socketsInUse (- 1 )
270271 server := socket .server
272+ closeAfterIdle := socket .closeAfterIdle
271273 socket .Unlock ()
272274 socket .LogoutAll ()
273- // If the socket is dead server is nil.
274- if server != nil {
275+ if closeAfterIdle {
276+ socket .Close ()
277+ } else if server != nil {
278+ // If the socket is dead server is nil.
275279 server .RecycleSocket (socket )
276280 }
277281 } else {
@@ -320,6 +324,21 @@ func (socket *mongoSocket) Close() {
320324 socket .kill (errors .New ("Closed explicitly" ), false )
321325}
322326
327+ // CloseAfterIdle terminates an idle socket, which has a zero
328+ // reference, or marks the socket to be terminate after idle.
329+ func (socket * mongoSocket ) CloseAfterIdle () {
330+ socket .Lock ()
331+ if socket .references == 0 {
332+ socket .Unlock ()
333+ socket .Close ()
334+ logf ("Socket %p to %s: idle and close." , socket , socket .addr )
335+ return
336+ }
337+ socket .closeAfterIdle = true
338+ socket .Unlock ()
339+ logf ("Socket %p to %s: close after idle." , socket , socket .addr )
340+ }
341+
323342func (socket * mongoSocket ) kill (err error , abend bool ) {
324343 socket .Lock ()
325344 if socket .dead != nil {
0 commit comments