@@ -515,9 +515,6 @@ def end_session(self) -> None:
515515
516516 It is an error to use the session after the session has ended.
517517 """
518- self ._end_session (lock = True )
519-
520- def _end_session (self , lock : bool ) -> None :
521518 if self ._server_session is not None :
522519 try :
523520 if self .in_transaction :
@@ -526,7 +523,7 @@ def _end_session(self, lock: bool) -> None:
526523 # is in the committed state when the session is discarded.
527524 self ._unpin ()
528525 finally :
529- self ._client ._return_server_session (self ._server_session , lock )
526+ self ._client ._return_server_session (self ._server_session )
530527 self ._server_session = None
531528
532529 def _check_ended (self ) -> None :
@@ -537,7 +534,7 @@ def __enter__(self) -> ClientSession:
537534 return self
538535
539536 def __exit__ (self , exc_type : Any , exc_val : Any , exc_tb : Any ) -> None :
540- self ._end_session ( lock = True )
537+ self .end_session ( )
541538
542539 @property
543540 def client (self ) -> MongoClient :
@@ -1097,7 +1094,7 @@ def inc_transaction_id(self) -> None:
10971094class _ServerSessionPool (collections .deque ):
10981095 """Pool of _ServerSession objects.
10991096
1100- This class is not thread-safe, access it while holding the Topology lock .
1097+ This class is thread-safe.
11011098 """
11021099
11031100 def __init__ (self , * args : Any , ** kwargs : Any ):
@@ -1110,8 +1107,11 @@ def reset(self) -> None:
11101107
11111108 def pop_all (self ) -> list [_ServerSession ]:
11121109 ids = []
1113- while self :
1114- ids .append (self .pop ().session_id )
1110+ while True :
1111+ try :
1112+ ids .append (self .pop ().session_id )
1113+ except IndexError :
1114+ break
11151115 return ids
11161116
11171117 def get_server_session (self , session_timeout_minutes : Optional [int ]) -> _ServerSession :
@@ -1123,33 +1123,30 @@ def get_server_session(self, session_timeout_minutes: Optional[int]) -> _ServerS
11231123 self ._clear_stale (session_timeout_minutes )
11241124
11251125 # The most recently used sessions are on the left.
1126- while self :
1127- s = self .popleft ()
1126+ while True :
1127+ try :
1128+ s = self .popleft ()
1129+ except IndexError :
1130+ break
11281131 if not s .timed_out (session_timeout_minutes ):
11291132 return s
11301133
11311134 return _ServerSession (self .generation )
11321135
1133- def return_server_session (
1134- self , server_session : _ServerSession , session_timeout_minutes : Optional [int ]
1135- ) -> None :
1136- if session_timeout_minutes is not None :
1137- self ._clear_stale (session_timeout_minutes )
1138- if server_session .timed_out (session_timeout_minutes ):
1139- return
1140- self .return_server_session_no_lock (server_session )
1141-
1142- def return_server_session_no_lock (self , server_session : _ServerSession ) -> None :
1136+ def return_server_session (self , server_session : _ServerSession ) -> None :
11431137 # Discard sessions from an old pool to avoid duplicate sessions in the
11441138 # child process after a fork.
11451139 if server_session .generation == self .generation and not server_session .dirty :
11461140 self .appendleft (server_session )
11471141
11481142 def _clear_stale (self , session_timeout_minutes : Optional [int ]) -> None :
11491143 # Clear stale sessions. The least recently used are on the right.
1150- while self :
1151- if self [- 1 ].timed_out (session_timeout_minutes ):
1152- self .pop ()
1153- else :
1144+ while True :
1145+ try :
1146+ s = self .pop ()
1147+ except IndexError :
1148+ break
1149+ if not s .timed_out (session_timeout_minutes ):
1150+ self .append (s )
11541151 # The remaining sessions also haven't timed out.
11551152 break
0 commit comments