Each Pool guards its poll.poll with a mutex to prevent concurrent calls.
poll and select are retried if they are interrupted with EINTR. Also fixes
PYTHON-1179.
SocketInfo and Pool are now responsible for catching all socket.errors and
gaierrors and translating them to ConnectionFailure. Server and MongoClient
need no longer worry about anything but ConnectionFailure. Functions in pool.py
and network.py still throw socket.errors into SocketInfo and Pool.
With this change the max_pool_size named parameter to
MongoClient is removed. It is replaced by the maxPoolSize
MongoDB URI option, which can be passed in a URI, or as a
keyword argument to MongoClient.
Call ismaster on each new connection and store the results on the SocketInfo
instance.
The upcoming Authentication Spec says: "If credentials exist, upon opening a
socket, drivers MUST send an isMaster command immediately. This allows a driver
to determine whether the server is an Arbiter. Calling ismaster additionally
allows the driver to know if the default authentication method for each socket
is MONGODB-CR or SCRAM-SHA-1, avoiding races when the driver repopulates the
pool after a disconnect."
In theory we could choose not to call ismaster if there are no credentials, but
it's simpler always to call ismaster, and paves the way for future breaking
changes to the wire protocol besides the current breaking change to
authentication.
The Server Discovery And Monitoring Spec has replaced the term "cluster"
with "topology", since "cluster" in MongoDB terminology should be reserved
for sharded clusters. "Topology" describes a single server, replica set, or a
set of mongoses.
The previous commit replaced "cluster" with "topology" in file names. Here
I replace the term in class and variable names.
The new MongoClient, based on Cluster and Server,
includes functionality that had been split between the
old MongoClient and MongoReplicaSetClient. A
previous commit introduced the new MongoClient
but broke authentication.
Replace MongoClient with an implementation that relies on Cluster and Server. The new MongoClient takes over MongoReplicaSetClient's responsibilities.
Authentication, secondary-pinning, and Mongos high-availability are broken and will be reimplemented in a future commit. RS tests are temporarily disabled.
_test_max_pool_size_no_rendezvous had run tests with the MongoClient "self.c", then asserted post-conditions with the local MongoClient "c". So the test passed by accident: it never tested what it thought it tested.
Require tests to pass the client explicitly to the MongoThread to avoid repeating this mistake.
Gevent and multiprocessing work poorly together, so don't use
multiprocessing in test_objectid. Additionally, Gevent 0.13.8
deadlocks with more than about 40 concurrent greenlets on Mac,
so reduce the concurrency to about 20. test_interrupt_signal
still fails with 0.13.8, but others pass, and *all* tests pass
with Gevent 1.0.1:
python -m gevent.monkey setup.py test