fix: async with closes the motor client when connect()/ping fails (mongo-1)
__aenter__ delegated to connect(); when the ping raised on a bad server, __aexit__ was not called so the eagerly-constructed motor client (with its background topology monitor + pool) leaked. a retry loop against a flapping DB accumulated live clients. now close-on-failure. verified: 5 failed async-with blocks leave 0 open clients (was 5). bump v0.1.4 -> v0.1.5 Signed-off-by: disqualifier <dev@disqualifier.me>
This commit is contained in:
@@ -8,18 +8,18 @@ helpers for the common paths, with a raw escape hatch for everything else.
|
||||
`requirements.txt`:
|
||||
|
||||
```
|
||||
mongo @ git+ssh://git@git.rethinkstudios.io/rethink-public/mongo.git@v0.1.4
|
||||
mongo @ git+ssh://git@git.rethinkstudios.io/rethink-public/mongo.git@v0.1.5
|
||||
```
|
||||
|
||||
Direct:
|
||||
|
||||
```bash
|
||||
pip install "mongo @ git+ssh://git@git.rethinkstudios.io/rethink-public/mongo.git@v0.1.4"
|
||||
pip install "mongo @ git+ssh://git@git.rethinkstudios.io/rethink-public/mongo.git@v0.1.5"
|
||||
```
|
||||
|
||||
Requires `motor` and `pymongo` (pulled transitively).
|
||||
|
||||
Drop the `@v0.1.4` suffix from the line above to install the latest unpinned.
|
||||
Drop the `@v0.1.5` suffix from the line above to install the latest unpinned.
|
||||
|
||||
## Usage
|
||||
|
||||
|
||||
+1
-1
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
||||
|
||||
[project]
|
||||
name = "mongo"
|
||||
version = "0.1.4"
|
||||
version = "0.1.5"
|
||||
description = "async mongodb wrapper over motor with a raw escape hatch"
|
||||
requires-python = ">=3.10"
|
||||
dependencies = [
|
||||
|
||||
@@ -67,7 +67,15 @@ class MongoDB:
|
||||
return self
|
||||
|
||||
async def __aenter__(self) -> "MongoDB":
|
||||
try:
|
||||
return await self.connect()
|
||||
except BaseException:
|
||||
# connect()/ping failing here would otherwise leak the motor client (built
|
||||
# eagerly in __init__ with a background topology monitor + pool) — __aexit__
|
||||
# is not called when __aenter__ raises. close it before propagating so a
|
||||
# retry loop against a flapping server doesn't accumulate live clients.
|
||||
self.close()
|
||||
raise
|
||||
|
||||
async def __aexit__(self, exc_type, exc, tb) -> None:
|
||||
self.close()
|
||||
|
||||
Reference in New Issue
Block a user