v3.5.0
The MongoDB Node.js team is pleased to announce version 3.5.0 of the driver
Release Highlights
CMAP-compliant Connection Pool
This release introduces a modern replacement for the driver's connection pool, available only with the
unified topology. A major effort was made in early 2019 to fully specifiy connection pools for MongoDB
drivers (see: CMAP specification), and this release brings the Node.js driver in line with that
specification.
Traceability
The new pool supports monitoring for all aspects of its behavior. This allows deep introspection into
the operation of the connection pool, as well as an ability to profile the lifetime of an operation
when used in conjunction with command monitoring.
Stream-first Connection Design
The Connection
class was completely rewritten for the new pool adopting a stream-first mentality. All
wire message processing and compression is handled in a duplex stream called the MessageStream
, and
that stream is connected bidirectionally to the underlaying TCP socket. The result is a connection which
gains the general benefit of streams: better performance, less memory pressure, backpressure support. It
also opens the possiblity of supporting non-TCP/UDP streams as a transport for the driver.
waitQueueTimeoutMS
The new connection pool has a concept of a "wait queue", which allows operation requests to buffer waiting
for a connection to execute against. There is no timeout by default, but users can now specify a new value
waitQueueTimeoutMS
in their connection string or MongoClient
options to proactively cancel operations
that have waited too long.
Remember that the new connection pool is only available for the "Unified Topology", so remember to pass
useUnifiedTopology: true
to your MongoClient
constructor to use it!
Dedicated monitoring connection
Both the legacy and unified SDAM implementations have until now executed monitoring checks as priority
messages in the legacy Pool implementation. This means that monitoring (ismaster
) operations were
prioritized over other queued operations, but also means that monitoring could be indefinitely blocked,
in particular during failover or black hole scenarios. The default socket timeout is null
(read: Infinity),
so if the pool was completely saturated with operations, there may be no ability to execute a monitoring
check and determine that the connection to a server was no longer valid. This version of the driver
introduces a new Monitor
class which manages its own dedicated monitoring connection to each known
node.
Server selection errors
In v3.3.0 of the driver we introduced a new MongoTimeoutError
for all errors covered by the server
selection loop, leading to a spike in bug reports with a title similar to Server selection timed out after 30000ms
.
Even though the error type itself had an attached reason
field, we still feel it was easy to miss why
the selection had failed. As a result we have introduced a new type MongoServerSelectionError
which
will use the originating error (reason
) for its message, better informing users what caused a
selection error, while still also conveying it is an error in server selection.
Release Notes
New Feature
- [NODE-1742] - Implement Connection Monitoring and Pooling spec
- [NODE-2386] - Use a dedicated monitoring thread
Bug
- [NODE-2400] - Synchronous errors are swallowed by executeOperation
- [NODE-2417] - Server descriptions with me mismatch from primary response should be removed
- [NODE-2418] - client platform not sent in metadata for CMAP connections
Improvement
- [NODE-1619] - Remove wasteful empty Buffer allocations in `Connection`
- [NODE-2049] - Add "connectionError" as a valid "reason" for a ConnectionCheckOutFailedEvent when connection set up fails
- [NODE-2397] - Make server selection errors more informative
- [NODE-2402] - Integrate CMAP connection pool into unified topology
- [NODE-2419] - Improve traceability of CMAP events
- [NODE-2033] - Ignore ConnectionReadyEvent in CMAP pool creation test