@@ -109,7 +109,7 @@ def _partition_node(node):
109109
110110# Concurrency notes: A MongoReplicaSetClient keeps its view of the replica-set
111111# state in an RSState instance. RSStates are immutable, except for
112- # host-pinning. Pools, which are internally thread / greenlet safe, can be
112+ # host-pinning. Pools, which are internally thread- safe, can be
113113# copied from old to new RSStates safely. The client updates its view of the
114114# set's state not by modifying its RSState but by replacing it with an updated
115115# copy.
@@ -133,7 +133,7 @@ def _partition_node(node):
133133
134134class RSState (object ):
135135 def __init__ (
136- self , threadlocal , hosts = None , host_to_member = None , arbiters = None ,
136+ self , threadlocal = None , hosts = None , host_to_member = None , arbiters = None ,
137137 writer = None , error_message = 'No primary available' , exc = None ,
138138 initial = False ):
139139 """An immutable snapshot of the client's view of the replica set state.
@@ -143,7 +143,7 @@ def __init__(
143143 in the most recent ismaster response.
144144
145145 :Parameters:
146- - `threadlocal`: Thread -local storage
146+ - `threadlocal`: Optional thread -local storage
147147 - `hosts`: Sequence of (host, port) pairs
148148 - `host_to_member`: Optional dict: (host, port) -> Member instance
149149 - `arbiters`: Optional sequence of arbiters as (host, port)
@@ -152,7 +152,7 @@ def __init__(
152152 - `exc`: Optional error if state is unusable
153153 - `initial`: Whether this is the initial client state
154154 """
155- self ._threadlocal = threadlocal # threading.local
155+ self ._threadlocal = threadlocal or threading .local ()
156156 self ._arbiters = frozenset (arbiters or []) # set of (host, port)
157157 self ._writer = writer # (host, port) of the primary, or None
158158 self ._error_message = error_message
@@ -191,17 +191,12 @@ def clone_with_host_down(self, host, error_message):
191191 self ._error_message ,
192192 self ._exc )
193193
194- def clone_without_writer (self , threadlocal ):
195- """Get a clone without a primary. Unpins all threads.
196-
197- :Parameters:
198- - `threadlocal`: Thread-local storage
199- """
194+ def clone_without_writer (self ):
195+ """Get a clone without a primary. Unpins all threads."""
200196 return RSState (
201- threadlocal ,
202- self ._hosts ,
203- self ._host_to_member ,
204- self ._arbiters )
197+ hosts = self ._hosts ,
198+ host_to_member = self ._host_to_member ,
199+ arbiters = self ._arbiters )
205200
206201 def clone_with_error (self , exc ):
207202 return RSState (
@@ -387,48 +382,6 @@ def run(self):
387382 self .monitor ()
388383
389384
390- have_gevent = False
391- try :
392- from gevent import Greenlet
393- from gevent .event import Event
394-
395- # Used by ReplicaSetConnection
396- from gevent .local import local as gevent_local
397- have_gevent = True
398-
399- class MonitorGreenlet (Monitor , Greenlet ):
400- """Greenlet based replica set monitor.
401- """
402- def __init__ (self , rsc ):
403- self .monitor_greenlet_alive = False
404- Monitor .__init__ (self , rsc , Event )
405- Greenlet .__init__ (self )
406-
407- def start_sync (self ):
408- self .monitor_greenlet_alive = True
409-
410- # Call superclass.
411- Monitor .start_sync (self )
412-
413- # Don't override `run` in a Greenlet. Add _run instead.
414- # Refer to gevent's Greenlet docs and source for more
415- # information.
416- def _run (self ):
417- """Define Greenlet's _run method.
418- """
419- self .monitor ()
420-
421- def isAlive (self ):
422- # bool(self) isn't immediately True after someone calls start(),
423- # but isAlive() is. Thus it's safe for greenlets to do:
424- # "if not monitor.isAlive(): monitor.start()"
425- # ... and be guaranteed only one greenlet starts the monitor.
426- return self .monitor_greenlet_alive
427-
428- except ImportError :
429- pass
430-
431-
432385class MongoReplicaSetClient (common .BaseObject ):
433386 """Connection to a MongoDB replica set.
434387 """
@@ -619,15 +572,10 @@ def __init__(self, hosts_or_uri=None, max_pool_size=100,
619572 socket_timeout = self .__opts .get ('sockettimeoutms' )
620573 wait_queue_timeout = self .__opts .get ('waitqueuetimeoutms' )
621574 wait_queue_multiple = self .__opts .get ('waitqueuemultiple' )
622- self .__use_greenlets = self .__opts .get ('use_greenlets' , False )
623- if self .__use_greenlets and not have_gevent :
624- raise ConfigurationError (
625- "The gevent module is not available. "
626- "Install the gevent package from PyPI." )
627575
628- self .__rs_state = RSState (self . __make_threadlocal (), initial = True )
576+ self .__rs_state = RSState (initial = True )
629577
630- self .__request_counter = thread_util .Counter (self . __use_greenlets )
578+ self .__request_counter = thread_util .Counter ()
631579
632580 self .__auto_start_request = self .__opts .get ('auto_start_request' , False )
633581 if self .__auto_start_request :
@@ -674,9 +622,7 @@ def __init__(self, hosts_or_uri=None, max_pool_size=100,
674622 wait_queue_timeout = wait_queue_timeout ,
675623 wait_queue_multiple = wait_queue_multiple ,
676624 ssl_context = ssl_context ,
677- use_greenlets = self .__use_greenlets ,
678- socket_keepalive = socket_keepalive
679- )
625+ socket_keepalive = socket_keepalive )
680626
681627 super (MongoReplicaSetClient , self ).__init__ (** self .__opts )
682628
@@ -706,21 +652,9 @@ def __init__(self, hosts_or_uri=None, max_pool_size=100,
706652
707653 # Start the monitor after we know the configuration is correct.
708654 if not self .__monitor_class :
709- if self .__use_greenlets :
710- self .__monitor_class = MonitorGreenlet
711- else :
712- # Common case: monitor RS with a background thread.
713- self .__monitor_class = MonitorThread
714-
715- if self .__use_greenlets :
716- # Greenlets don't need to lock around access to the monitor.
717- # A Greenlet can safely do:
718- # "if not self.__monitor: self.__monitor = monitor_class()"
719- # because it won't be interrupted between the check and the
720- # assignment.
721- self .__monitor_lock = DummyLock ()
722- else :
723- self .__monitor_lock = threading .Lock ()
655+ self .__monitor_class = MonitorThread
656+
657+ self .__monitor_lock = threading .Lock ()
724658
725659 if _connect :
726660 self .__ensure_monitor ()
@@ -902,15 +836,6 @@ def max_pool_size(self):
902836 """
903837 return self .__pool_opts .max_pool_size
904838
905- @property
906- def use_greenlets (self ):
907- """Whether calling :meth:`start_request` assigns greenlet-local,
908- rather than thread-local, sockets.
909-
910- .. versionadded:: 2.4.2
911- """
912- return self .__pool_opts .use_greenlets
913-
914839 def get_document_class (self ):
915840 """document_class getter"""
916841 return self .__document_class
@@ -1059,12 +984,6 @@ def __ensure_monitor(self):
1059984 finally :
1060985 self .__monitor_lock .release ()
1061986
1062- def __make_threadlocal (self ):
1063- if self .__use_greenlets :
1064- return gevent_local ()
1065- else :
1066- return threading .local ()
1067-
1068987 def refresh (self , initial = False ):
1069988 """Iterate through the existing host list, or possibly the
1070989 seed list, to update the list of hosts and arbiters in this
@@ -1201,7 +1120,7 @@ def __create_rs_state(self, rs_state, initial):
12011120 else :
12021121 # We unpin threads from members if the primary has changed, since
12031122 # no monotonic consistency can be promised now anyway.
1204- threadlocal = self . __make_threadlocal ()
1123+ threadlocal = None
12051124
12061125 # Get list of hosts in the RS config, including unreachable ones.
12071126 # Prefer the primary's list, otherwise any member's list.
@@ -1286,8 +1205,7 @@ def disconnect(self):
12861205 if rs_state .primary_member :
12871206 rs_state .primary_member .pool .reset ()
12881207
1289- threadlocal = self .__make_threadlocal ()
1290- self .__rs_state = rs_state .clone_without_writer (threadlocal )
1208+ self .__rs_state = rs_state .clone_without_writer ()
12911209 self .__schedule_refresh ()
12921210
12931211 def close (self ):
@@ -1307,7 +1225,7 @@ def close(self):
13071225 The :meth:`close` method now terminates the replica set monitor.
13081226 """
13091227 self .__closed = True
1310- self .__rs_state = RSState (self . __make_threadlocal () )
1228+ self .__rs_state = RSState ()
13111229
13121230 monitor , self .__monitor = self .__monitor , None
13131231 if monitor :
0 commit comments