@@ -40,19 +40,20 @@ type replyFunc func(err error, reply *replyOp, docNum int, docData []byte)
40
40
41
41
type mongoSocket struct {
42
42
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
56
57
}
57
58
58
59
type queryOpFlags uint32
@@ -264,10 +265,13 @@ func (socket *mongoSocket) Release() {
264
265
if socket .references == 0 {
265
266
stats .socketsInUse (- 1 )
266
267
server := socket .server
268
+ closeAfterIdle := socket .closeAfterIdle
267
269
socket .Unlock ()
268
270
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.
271
275
server .RecycleSocket (socket )
272
276
}
273
277
} else {
@@ -316,6 +320,19 @@ func (socket *mongoSocket) Close() {
316
320
socket .kill (errors .New ("Closed explicitly" ), false )
317
321
}
318
322
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
+
319
336
func (socket * mongoSocket ) kill (err error , abend bool ) {
320
337
socket .Lock ()
321
338
if socket .dead != nil {
0 commit comments