Skip to content

Commit a9e85ce

Browse files
committed
Ensure we return sockets if authentication fails.
1 parent 774e08a commit a9e85ce

File tree

2 files changed

+24
-14
lines changed

2 files changed

+24
-14
lines changed

pymongo/mongo_client.py

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -351,11 +351,13 @@ def _cache_credentials(self, source, credentials):
351351
'to this database. You must logout first.')
352352

353353
sock_info = self.__socket()
354-
# Logout any previous user for this source database
355-
self.__check_auth(sock_info)
356-
auth.authenticate(credentials, sock_info, self.__simple_command)
357-
sock_info.authset.add(credentials)
358-
self.__pool.maybe_return_socket(sock_info)
354+
try:
355+
# Since __check_auth was called in __socket
356+
# there is no need to call it here.
357+
auth.authenticate(credentials, sock_info, self.__simple_command)
358+
sock_info.authset.add(credentials)
359+
finally:
360+
self.__pool.maybe_return_socket(sock_info)
359361

360362
self.__auth_credentials[source] = credentials
361363

@@ -662,7 +664,11 @@ def __socket(self):
662664
host_details = "%s:%d:" % (host, port)
663665
raise AutoReconnect("could not connect to "
664666
"%s %s" % (host_details, str(why)))
665-
self.__check_auth(sock_info)
667+
try:
668+
self.__check_auth(sock_info)
669+
except OperationFailure:
670+
self.__pool.maybe_return_socket(sock_info)
671+
raise
666672
return sock_info
667673

668674
def disconnect(self):

pymongo/mongo_replica_set_client.py

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -558,11 +558,13 @@ def _cache_credentials(self, source, credentials):
558558
members = self.__members.copy().values()
559559
member = select_member(members, ReadPreference.PRIMARY_PREFERRED)
560560
sock_info = self.__socket(member)
561-
# Logout any previous user for this source database
562-
self.__check_auth(sock_info)
563-
auth.authenticate(credentials, sock_info, self.__simple_command)
564-
sock_info.authset.add(credentials)
565-
member.pool.maybe_return_socket(sock_info)
561+
try:
562+
# Since __check_auth was called in __socket
563+
# there is no need to call it here.
564+
auth.authenticate(credentials, sock_info, self.__simple_command)
565+
sock_info.authset.add(credentials)
566+
finally:
567+
member.pool.maybe_return_socket(sock_info)
566568

567569
self.__auth_credentials[source] = credentials
568570

@@ -917,7 +919,11 @@ def __socket(self, member):
917919

918920
sock_info = member.pool.get_socket()
919921

920-
self.__check_auth(sock_info)
922+
try:
923+
self.__check_auth(sock_info)
924+
except OperationFailure:
925+
member.pool.maybe_return_socket(sock_info)
926+
raise
921927
return sock_info
922928

923929
def disconnect(self):
@@ -1123,8 +1129,6 @@ def __send_and_receive(self, member, msg, **kwargs):
11231129
member.pool.maybe_return_socket(sock_info)
11241130

11251131
return response
1126-
except OperationFailure:
1127-
raise
11281132
except (ConnectionFailure, socket.error), why:
11291133
host, port = member.pool.pair
11301134
member.pool.discard_socket(sock_info)

0 commit comments

Comments
 (0)