MagicStack / MagicStack/asyncpg
Client not reconnecting after postgres restarting
未关闭
还没有人认领这个 Issue。
- 主要语言
- Python
- 星标
- 8.1k
- 派生
- 468
- PR 合并指标
- 30 天内没有已合并 PR
描述
- asyncpg version: asyncpg==0.18.3
- PostgreSQL version: PostgreSQL 10.6 on x86_64-pc-linux-gnu, compiled by gcc (Debian 6.3.0-18+deb9u1) 6.3.0 20170516, 64-bit
- Do you use a PostgreSQL SaaS? If so, which? Can you reproduce
the issue with a local PostgreSQL install?: - Python version: 3.6
- Platform: Ubuntu
- Do you use pgbouncer?: no
- Did you install asyncpg with pip?: yes
- If you built asyncpg locally, which version of Cython did you use?:
- Can the issue be reproduced under both asyncio and
uvloop?:
I'm using this library using Tortoise ORM but the trace back is going to the asyncpg library. so I hope you can share and help with this issue.
Describe the bug
ORM is not reconnect
To Reproduce
- connect to postgres instance
- restart postgres
- try to execute query within the existing python process
- see exception
Expected behavior
- reconnect when postgres instance is up
Additional context
Trace-back1
Traceback (most recent call last):
File \"/usr/lib/python3.6/asyncio/selector_events.py\", line 714, in _read_ready
data = self._sock.recv(self.max_size)
ConnectionResetError: [Errno 104] Connection reset by peer
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File \"/home/shlomy/PycharmProjects/playground/venv36/lib/python3.6/site-packages/tortoise/models.py\", line 277, in create
await instance.save(using_db=kwargs.get('using_db'))
File \"/home/shlomy/PycharmProjects/playground/venv36/lib/python3.6/site-packages/tortoise/models.py\", line 221, in save
await self._insert_instance(*args, **kwargs)
File \"/home/shlomy/PycharmProjects/playground/venv36/lib/python3.6/site-packages/tortoise/models.py\", line 210, in _insert_instance
).execute_insert(self)
File \"/home/shlomy/PycharmProjects/playground/venv36/lib/python3.6/site-packages/tortoise/backends/base/executor.py\", line 77, in execute_insert
instance.id = await self.db.execute_insert(query, values)
File \"/home/shlomy/PycharmProjects/playground/venv36/lib/python3.6/site-packages/tortoise/backends/asyncpg/client.py\", line 22, in wrapped
return await func(self, query, *args)
File \"/home/shlomy/PycharmProjects/playground/venv36/lib/python3.6/site-packages/tortoise/backends/asyncpg/client.py\", line 108, in execute_insert
stmt = await connection.prepare(query)
File \"/home/shlomy/PycharmProjects/playground/venv36/lib/python3.6/site-packages/asyncpg/connection.py\", line 403, in prepare
return await self._prepare(query, timeout=timeout, use_cache=False)
File \"/home/shlomy/PycharmProjects/playground/venv36/lib/python3.6/site-packages/asyncpg/connection.py\", line 408, in _prepare
use_cache=use_cache)
File \"/home/shlomy/PycharmProjects/playground/venv36/lib/python3.6/site-packages/asyncpg/connection.py\", line 329, in _get_statement
statement = await self._protocol.prepare(stmt_name, query, timeout)
File \"asyncpg/protocol/protocol.pyx\", line 163, in prepare
asyncpg.exceptions.ConnectionDoesNotExistError: connection was closed in the middle of operation"}
Trace back 2
connection is closed", "level": "error", "logger": "app.controller", "timestamp": "2019-05-23 12:30:55", "exception": "Traceback (most recent call last):
result = await orm_class.filter(id__in=kwargs['devices_ids']).all()
File \"/usr/local/lib/python3.7/site-packages/tortoise/queryset.py\", line 442, in _execute
self.query, custom_fields=list(self._annotations.keys())
File \"/usr/local/lib/python3.7/site-packages/tortoise/backends/base/executor.py\", line 28, in execute_select
raw_results = await self.db.execute_query(query.get_sql())
File \"/usr/local/lib/python3.7/site-packages/tortoise/backends/asyncpg/client.py\", line 22, in wrapped
return await func(self, query, *args)
File \"/usr/local/lib/python3.7/site-packages/tortoise/backends/asyncpg/client.py\", line 115, in execute_query
return await connection.fetch(query)
File \"/usr/local/lib/python3.7/site-packages/asyncpg/connection.py\", line 420, in fetch
self._check_open()
File \"/usr/local/lib/python3.7/site-packages/asyncpg/connection.py\", line 1147, in _check_open
raise exceptions.InterfaceError('connection is closed')
asyncpg.exceptions._base.InterfaceError: connection is closed"}
贡献指南
这个仓库没有索引到贡献指南
从这里开始
- 先读完整个 Issue,再读项目的贡献指南。
- 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
- Fork 仓库,在一个分支上完成修改。
- 提交 Pull Request,并在描述里引用这个 Issue 编号。
调研方向
从 asyncpg/connection.py 和 asyncpg/protocol/protocol.pyx 中展示的连接处理开始,然后重现报告的操作序列:连接、重启 PostgreSQL 并执行查询。将产生的 ConnectionDoesNotExistError 和 InterfaceError 与预期的重新连接行为进行比较;当 PostgreSQL 恢复运行后可以执行查询时,即表示完成。
由索引模型根据 Issue 内容生成。
评估
- 技术栈
- postgresql, python
- 领域
- backend, databases
- Issue 类型
- 缺陷
- 难度
- 4/5
- 预计耗时
- 3-5 天
- 活跃度
- 停滞
- 描述清晰度
- 基本清楚
- 新手友好度
- 35/100