1 Commits
Author SHA1 Message Date
dsql ebd808f326 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>
2026-06-30 21:04:51 -04:00
3 changed files with 13 additions and 5 deletions
+3 -3
View File
@@ -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
View File
@@ -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 = [
+9 -1
View File
@@ -67,7 +67,15 @@ class MongoDB:
return self
async def __aenter__(self) -> "MongoDB":
return await self.connect()
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()