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`:
|
`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:
|
Direct:
|
||||||
|
|
||||||
```bash
|
```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).
|
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
|
## Usage
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|||||||
|
|
||||||
[project]
|
[project]
|
||||||
name = "mongo"
|
name = "mongo"
|
||||||
version = "0.1.4"
|
version = "0.1.5"
|
||||||
description = "async mongodb wrapper over motor with a raw escape hatch"
|
description = "async mongodb wrapper over motor with a raw escape hatch"
|
||||||
requires-python = ">=3.10"
|
requires-python = ">=3.10"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
|
|||||||
+9
-1
@@ -67,7 +67,15 @@ class MongoDB:
|
|||||||
return self
|
return self
|
||||||
|
|
||||||
async def __aenter__(self) -> "MongoDB":
|
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:
|
async def __aexit__(self, exc_type, exc, tb) -> None:
|
||||||
self.close()
|
self.close()
|
||||||
|
|||||||
Reference in New Issue
Block a user