@@ -119,6 +119,7 @@ def initialize(*args)
119119 # Refresh
120120 @refresh_mode = opts . fetch ( :refresh_mode , :sync )
121121 @refresh_interval = opts [ :refresh_interval ] || 90
122+ @last_refresh = Time . now
122123
123124 if ![ :sync , :async , false ] . include? ( @refresh_mode )
124125 raise MongoArgumentError ,
@@ -339,6 +340,80 @@ def logout_pools(db)
339340 end
340341 end
341342
343+ # Checkout a socket for reading (i.e., a secondary node).
344+ # Note that @read_pool might point to the primary pool
345+ # if no read pool has been defined.
346+ def checkout_reader
347+ connect unless connected?
348+ socket = get_socket_from_pool ( @read_pool )
349+
350+ if !socket
351+ refresh
352+ socket = get_socket_from_pool ( @primary_pool )
353+ end
354+
355+ if socket
356+ socket
357+ else
358+ raise ConnectionFailure . new ( "Could not connect to a node for reading." )
359+ end
360+ end
361+
362+ # Checkout a socket for writing (i.e., a primary node).
363+ def checkout_writer
364+ connect unless connected?
365+ socket = get_socket_from_pool ( @primary_pool )
366+
367+ if !socket
368+ refresh
369+ socket = get_socket_from_pool ( @primary_pool )
370+ end
371+
372+ if socket
373+ socket
374+ else
375+ raise ConnectionFailure . new ( "Could not connect to primary node." )
376+ end
377+ end
378+
379+ def checkin ( socket )
380+ sync_synchronize ( :SH ) do
381+ if pool = @sockets_to_pools [ socket ]
382+ pool . checkin ( socket )
383+ elsif socket
384+ begin
385+ socket . close
386+ rescue IOError
387+ log ( :info , "Tried to close socket #{ socket } but already closed." )
388+ end
389+ end
390+ end
391+
392+ # Refresh synchronously every @refresh_interval seconds
393+ # if synchronous refresh mode is enabled.
394+ if @refresh_mode == :sync &&
395+ ( ( Time . now - @last_refresh ) > @refresh_interval )
396+ refresh
397+ @last_refresh = Time . now
398+ end
399+ end
400+
401+ def get_socket_from_pool ( pool )
402+ begin
403+ sync_synchronize ( :SH ) do
404+ if pool
405+ socket = pool . checkout
406+ @sockets_to_pools [ socket ] = pool
407+ socket
408+ end
409+ end
410+
411+ rescue ConnectionFailure => ex
412+ log ( :info , "Failed to checkout from #{ pool } with #{ ex . class } ; #{ ex . message } " )
413+ return nil
414+ end
415+ end
416+
342417 private
343418
344419 # Given a pool manager, update this connection's
@@ -377,25 +452,6 @@ def initiate_refresh_mode
377452 @last_refresh = Time . now
378453 end
379454
380- # Checkout a socket for reading (i.e., a secondary node).
381- # Note that @read_pool might point to the primary pool
382- # if no read pool has been defined.
383- def checkout_reader
384- connect unless connected?
385- socket = get_socket_from_pool ( @read_pool )
386-
387- if !socket
388- refresh
389- socket = get_socket_from_pool ( @primary_pool )
390- end
391-
392- if socket
393- socket
394- else
395- raise ConnectionFailure . new ( "Could not connect to a node for reading." )
396- end
397- end
398-
399455 # Checkout a socket connected to a node with one of
400456 # the provided tags. If no such node exists, raise
401457 # an exception.
@@ -417,39 +473,6 @@ def checkout_tagged(tags)
417473 "Could not find a connection tagged with #{ tags } ."
418474 end
419475
420- # Checkout a socket for writing (i.e., a primary node).
421- def checkout_writer
422- connect unless connected?
423- socket = get_socket_from_pool ( @primary_pool )
424-
425- if !socket
426- refresh
427- socket = get_socket_from_pool ( @primary_pool )
428- end
429-
430- if socket
431- socket
432- else
433- raise ConnectionFailure . new ( "Could not connect to primary node." )
434- end
435- end
436-
437- def get_socket_from_pool ( pool )
438- begin
439- sync_synchronize ( :SH ) do
440- if pool
441- socket = pool . checkout
442- @sockets_to_pools [ socket ] = pool
443- socket
444- end
445- end
446-
447- rescue ConnectionFailure => ex
448- log ( :info , "Failed to checkout from #{ pool } with #{ ex . class } ; #{ ex . message } " )
449- return nil
450- end
451- end
452-
453476 # Checkin a socket used for reading.
454477 def checkin_reader ( socket )
455478 warn "ReplSetConnection#checkin_writer is deprecated and will be removed " +
@@ -463,27 +486,5 @@ def checkin_writer(socket)
463486 "in driver v2.0. Use ReplSetConnection#checkin instead."
464487 checkin ( socket )
465488 end
466-
467- def checkin ( socket )
468- sync_synchronize ( :SH ) do
469- if pool = @sockets_to_pools [ socket ]
470- pool . checkin ( socket )
471- elsif socket
472- begin
473- socket . close
474- rescue IOError
475- log ( :info , "Tried to close socket #{ socket } but already closed." )
476- end
477- end
478- end
479-
480- # Refresh synchronously every @refresh_interval seconds
481- # if synchronous refresh mode is enabled.
482- if @refresh_mode == :sync &&
483- ( ( Time . now - @last_refresh ) > @refresh_interval )
484- refresh
485- @last_refresh = Time . now
486- end
487- end
488489 end
489490end
0 commit comments