MagicStack / MagicStack/asyncpg

Cockroachdb unimplemented feature multiple active portals not supported

Open
#580 19 comments 2 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Dominant language
Python
Stars
8.1k
Forks
468
PR merge metrics
No merged PRs in 30d

Description

* **asyncpg version**: 0.20.1
* **Cockroachdb version**: v20.1.0 (connected to a 5-node on premise cluster)
* **Python version**: 3.8.0
* **Platform**: Linux
* **Do you use pgbouncer?**: No
* **Did you install asyncpg with pip?**: Yes

Example code:
```python

async with pool.acquire() as conn:
async with conn.transaction():
if not await conn.table_exists("sys_app_config"):
await conn.execute("""
CREATE TABLE sys_app_config(
key text NOT NULL PRIMARY KEY,
value jsonb
);
""")
```

The table_exists method looks like this:

```python

class MyConnection(Connection):
async def table_exists(self, table_name: str) -> bool:
"""Tell if a table exists."""
return await self.fetchval(
"select table_name from information_schema.tables where table_name=$1", table_name) is not None

```

This code is actually called from tornado.ioloop.IOLoop.current().run_sync so it is guaranteed that nothing else is running queries concurrently.

Here is the traceback that I'm getting:

```

File "/home/user/my_project/db/initialize.py", line 19, in init_database
if not await conn.table_exists("sys_app_config"):
File "/home/user/.local/share/virtualenvs/backend-YgzYW8Ky/lib/python3.8/site-packages/asyncpg/transaction.py", line 91, in __aexit__
await self.__commit()
File "/home/user/.local/share/virtualenvs/backend-YgzYW8Ky/lib/python3.8/site-packages/asyncpg/transaction.py", line 179, in __commit
await self._connection.execute(query)
File "/home/user/.local/share/virtualenvs/backend-YgzYW8Ky/lib/python3.8/site-packages/asyncpg/connection.py", line 272, in execute
return await self._protocol.query(query, timeout)
File "asyncpg/protocol/protocol.pyx", line 316, in query
asyncpg.exceptions.FeatureNotSupportedError: unimplemented: multiple active portals not supported
HINT: You have attempted to use a feature that is not yet implemented.
See: https://github.com/cockroachdb/cockroach/issues/40195
```
The referenced issue tells that it is not possible to keep multiple queries open and fetch from them interleaved.

However, I'm not doing anything that should result in opening multiple queries and fetching from them that way. As far as I see, my code should not open a new query before closing the previous one.

I suspect that asyncpg itself forgot to close something in the background.

Contributor guide

No contributing guide indexed for this repository

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start with the transaction commit path in asyncpg/transaction.py, then inspect asyncpg/connection.py and asyncpg/protocol/protocol.pyx around execute and query. Reproduce the table_exists example against the stated CockroachDB setup and trace whether the driver leaves an active portal before commit. Done means identifying the driver behavior or confirming the database incompatibility and documenting the evidence.

Written by the indexing model from the issue text.

Assessment

Tech stack
postgresql, python
Domain
backend, databases
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Stale
Clarity
Needs clarification
Newbie friendliness
28/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.