Skip to content

Segmentation Fault in record_repr at asyncpg/protocol/record/recordobj.c:462 #757

Description

@ShahriyarR
  • asyncpg version: 0.22.0
  • PostgreSQL version: PostgreSQL 10.16 (Ubuntu 10.16-1.pgdg18.04+1)
  • Do you use a PostgreSQL SaaS? If so, which? Can you reproduce
    the issue with a local PostgreSQL install?
    : Local 10.16
  • Python version: 3.9.0+ (heads/3.9:5b1fdcacfc, Oct 18 2020, 00:00:17) \n[GCC 7.5.0]
  • Platform: Ubuntu 18.04 (5.4.0-73-generic "RuntimeError: no codec for array element type 17189" with $1::citext[] #82~18.04.1-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?: No
  • Can the issue be reproduced under both asyncio and
    uvloop?
    : N/D

The reproducible full project code is located here:
https://github.com/ShahriyarR/ecommerce-nuxtjs-fastapi-backend/tree/episode-5

Steps to start:

  • clone the branch
  • activate python3.9 venv
  • do poetry install
  • uvicorn backend.app.main:app

NOTE: There is no such issue with Python 3.8, spotted only with 3.9

The pyproject.toml:

[tool.poetry]
name = "backend"version = "0.1.0"description = ""authors = ["Shahriyar Rzayev <rzayev.sehriyar@gmail.com>"]
[tool.poetry.dependencies]
python = "^3.7"fastapi = "^0.64.0"gino = {extras = ["pg", "starlette"], version = "^1.0.1"}
uvicorn = "^0.13.4"gunicorn = "^20.1.0"alembic = "^1.6.2"psycopg2 = "^2.8.6"passlib = {extras = ["bcrypt"], version = "^1.7.4"}
pydantic = {extras = ["dotenv"], version = "^1.8.2"}
[tool.poetry.dev-dependencies]
pytest = "^5.2"pytest-cov = "^2.10.1"requests = "^2.25.1"
[build-system]
requires = ["poetry-core>=1.0.0"]
build-backend = "poetry.core.masonry.api"

Basically, I am trying to use FastAPI & Gino to build a simple user registration endpoint.

Start the GDB session:

(gdb) run -X tracemalloc -m uvicorn app.main:app
Starting program: /home/shako/REPOS/Learning_FastAPI/Djackets/.venv/bin/python -X tracemalloc -m uvicorn app.main:app
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
INFO: Started server process [10345]
INFO: Waiting for application startup.
[New Thread 0x7fffede85700 (LWP 10346)]
[New Thread 0x7fffed432700 (LWP 10348)]
app started
INFO: Application startup complete.
INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)

Sending POST request:

curl -X POST http://127.0.0.1:8000/users/create -d '{"email": "example@gmail.com", "password": "12345789", "username": "example"}'| jq
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 77 0 0 0 77 0 0 --:--:-- 0:52:57 --:--:-- 0

Got the following from gdb side:

email='example@gmail.com' username='example' email_verified=False is_active=True is_superuser=False created_at=datetime.datetime(2021, 5, 16, 12, 38, 11, 847838) updated_at=datetime.datetime(2021, 5, 16, 12, 38, 11, 847874) password='$2b$12$VfJuQRvRMeFWrvwcbgZHsO3V2gGeigcXEvIePfQEEJqzgy/LdDHxC' salt='$2b$12$3FB/lyWlyPU.WcK8K2WKgu'
[New Thread 0x7fffeca31700 (LWP 10361)]
[New Thread 0x7fffdffff700 (LWP 10362)]
Modules/gcmodule.c:2163: visit_validate: Assertion failed: PyObject_GC_Track() object is not valid
Memory block allocated at (most recent call first):
File "/usr/local/lib/python3.9/asyncio/sslproto.py", line 545
object address : 0x7fffeca32eb0
object refcount : 1
object type: 0x7fffee424a20
object type name: asyncpg.Record
object repr : Thread 1 "python" received signal SIGSEGV, Segmentation fault.
0x00007fffee2028ae in record_repr (v=0x7fffeca32eb0) at asyncpg/protocol/record/recordobj.c:462
462	asyncpg/protocol/record/recordobj.c: No such file or directory.

bt:

(gdb) bt
#00x00007fffee2028ae in record_repr (v=0x7fffeca32eb0) at asyncpg/protocol/record/recordobj.c:462
#10x00005555555fd868 in PyObject_Repr (v=v@entry=0x7fffeca32eb0) at Objects/object.c:420
#20x00005555555fdb39 in PyObject_Print (op=op@entry=0x7fffeca32eb0, fp=0x7ffff740a680 <_IO_2_1_stderr_>, flags=flags@entry=0) at Objects/object.c:275
#30x00005555555fdd48 in _PyObject_Dump (op=op@entry=0x7fffeca32eb0) at Objects/object.c:378
#40x00005555555fdf17 in _PyObject_AssertFailed (obj=obj@entry=0x7fffeca32eb0, expr=expr@entry=0x0, msg=msg@entry=0x55555587e860"PyObject_GC_Track() object is not valid", file=file@entry=0x55555587e348"Modules/gcmodule.c", line=line@entry=2163, function=function@entry=0x55555587ec68 <__func__.16393> "visit_validate") at Objects/object.c:2192
#50x00005555556ec022 in visit_validate (op=<optimized out>, parent_raw=parent_raw@entry=0x7fffeca32eb0) at Modules/gcmodule.c:2162
#60x00007fffee2021c2 in record_traverse (o=0x7fffeca32eb0, visit=0x5555556ebfe6 <visit_validate>, arg=0x7fffeca32eb0) at asyncpg/protocol/record/recordobj.c:125
#70x00005555556ee67b in PyObject_GC_Track (op_raw=op_raw@entry=0x7fffeca32eb0) at Modules/gcmodule.c:2188
#80x00007fffee20347b in ApgRecord_New (type=type@entry=0x7fffee424a20 <ApgRecord_Type>, desc=desc@entry=0x7fffeca60370, size=size@entry=10)
at asyncpg/protocol/record/recordobj.c:57
#90x00007fffee1bc186 in __pyx_f_7asyncpg_8protocol_8protocol_22PreparedStatementState__decode_row (__pyx_v_self=0x7fffecaeb680, __pyx_v_cbuf=<optimized out>, __pyx_v_buf_len=<optimized out>) at asyncpg/protocol/protocol.c:52281
#100x00007fffee1bcf90 in __pyx_f_7asyncpg_8protocol_8protocol_12BaseProtocol__decode_row (__pyx_v_self=<optimized out>, __pyx_v_buf=<optimized out>, __pyx_v_buf_len=<optimized out>)
at asyncpg/protocol/protocol.c:68934
#110x00007fffee1b9860 in __pyx_f_7asyncpg_8protocol_8protocol_12CoreProtocol__parse_data_msgs (__pyx_v_self=0x7fffedefebd0) at asyncpg/protocol/protocol.c:41432
#120x00007fffee18d6fa in __pyx_f_7asyncpg_8protocol_8protocol_12CoreProtocol__process__bind_execute (__pyx_v_self=0x7fffedefebd0, __pyx_v_mtype=21'\025')
at asyncpg/protocol/protocol.c:39047
#130x00007fffee18a683 in __pyx_f_7asyncpg_8protocol_8protocol_12CoreProtocol__read_server_messages (__pyx_v_self=0x7fffedefebd0) at asyncpg/protocol/protocol.c:37586
#140x00007fffee183079 in __pyx_pf_7asyncpg_8protocol_8protocol_12BaseProtocol_61data_received (__pyx_v_data=<optimized out>, __pyx_v_self=0x7fffedefebd0)
at asyncpg/protocol/protocol.c:71031
#15__pyx_pw_7asyncpg_8protocol_8protocol_12BaseProtocol_62data_received (__pyx_v_self=0x7fffedefebd0, __pyx_v_data=<optimized out>) at asyncpg/protocol/protocol.c:5461
#160x000055555578cbe8 in method_vectorcall_O (func=0x7fffee48b6b0, args=0x555558338070, nargsf=<optimized out>, kwnames=<optimized out>) at Objects/descrobject.c:462
#170x000055555567caff in _PyObject_VectorcallTstate (kwnames=0x0, nargsf=9223372036854775810, args=0x555558338070, callable=0x7fffee48b6b0, tstate=0x555555bab990)
at ./Include/cpython/abstract.h:118
#18PyObject_Vectorcall (kwnames=0x0, nargsf=9223372036854775810, args=0x555558338070, callable=0x7fffee48b6b0) at ./Include/cpython/abstract.h:127

bt full excerpt:

(gdb) bt full
#00x00007fffee2028ae in record_repr (v=0x7fffeca32eb0) at asyncpg/protocol/record/recordobj.c:462
i = <optimized out>
n = 10
keys_iter = <optimized out>
writer = {buffer = 0x1, data = 0x7ffff7bc53bc <__libc_write+92>, kind = PyUnicode_1BYTE_KIND, maxchar = 0, size = 0, pos = 33, min_length = 14, min_char = 3, overallocate = 0'\000', readonly = 0'\000'}
#10x00005555555fd868 in PyObject_Repr (v=v@entry=0x7fffeca32eb0) at Objects/object.c:420
res = <optimized out>
tstate = <optimized out>
__PRETTY_FUNCTION__ = "PyObject_Repr"
#20x00005555555fdb39 in PyObject_Print (op=op@entry=0x7fffeca32eb0, fp=0x7ffff740a680 <_IO_2_1_stderr_>, flags=flags@entry=0) at Objects/object.c:275
s = <optimized out>
ret = 0
__PRETTY_FUNCTION__ = "PyObject_Print"
#30x00005555555fdd48 in _PyObject_Dump (op=op@entry=0x7fffeca32eb0) at Objects/object.c:378
type = <optimized out>
gil = PyGILState_LOCKED
error_type = 0x0
error_value = 0x0
error_traceback = 0x0
#40x00005555555fdf17 in _PyObject_AssertFailed (obj=obj@entry=0x7fffeca32eb0, expr=expr@entry=0x0, msg=msg@entry=0x55555587e860"PyObject_GC_Track() object is not valid", file=file@entry=0x55555587e348"Modules/gcmodule.c", line=line@entry=2163, function=function@entry=0x55555587ec68 <__func__.16393> "visit_validate") at Objects/object.c:2192
ptr = 0x7fffeca32ea0
type = <optimized out>
__func__ = "_PyObject_AssertFailed"
#50x00005555556ec022 in visit_validate (op=<optimized out>, parent_raw=parent_raw@entry=0x7fffeca32eb0) at Modules/gcmodule.c:2162
parent = 0x7fffeca32eb0
__func__ = "visit_validate"
#60x00007fffee2021c2 in record_traverse (o=0x7fffeca32eb0, visit=0x5555556ebfe6 <visit_validate>, arg=0x7fffeca32eb0) at asyncpg/protocol/record/recordobj.c:125
vret = <optimized out>
i = <optimized out>
#70x00005555556ee67b in PyObject_GC_Track (op_raw=op_raw@entry=0x7fffeca32eb0) at Modules/gcmodule.c:2188
op = 0x7fffeca32eb0
__func__ = "PyObject_GC_Track"
traverse = <optimized out>
#80x00007fffee20347b in ApgRecord_New (type=type@entry=0x7fffee424a20 <ApgRecord_Type>, desc=desc@entry=0x7fffeca60370, size=size@entry=10)
at asyncpg/protocol/record/recordobj.c:57
o = 0x7fffeca32eb0
i = <optimized out>
#90x00007fffee1bc186 in __pyx_f_7asyncpg_8protocol_8protocol_22PreparedStatementState__decode_row (__pyx_v_self=0x7fffecaeb680, __pyx_v_cbuf=<optimized out>, __pyx_v_buf_len=<optimized out>) at asyncpg/protocol/protocol.c:52281
__pyx_v_codec = 0x0
__pyx_v_fnum = <optimized out>
---Type <return> to continue, or q <return> to quit---
__pyx_v_flen = <optimized out>
__pyx_v_dec_row = 0x0
__pyx_v_rows_codecs = 0x7fffeca89ef0
__pyx_v_settings = 0x7fffecaaf2f0
__pyx_v_i = <optimized out>
__pyx_v_rbuf = {buf = 0x5555587aa0dc"", len = 180}
__pyx_v_bl = <optimized out>
__pyx_v_val = 0x0
__pyx_r = 0x0
__pyx_t_1 = 0x7fffee424a20 <ApgRecord_Type>
__pyx_t_2 = 0xcdcdcdcdcdcdcdcd <error: Cannot access memory at address 0xcdcdcdcdcdcdcdcd>
__pyx_t_3 = <optimized out>
__pyx_t_4 = 0x0
__pyx_t_5 = 0x7fffeca60370
__pyx_t_6 = 0x0
__pyx_t_7 = 0x0
__pyx_t_8 = 0x0
__pyx_t_9 = 0x0
__pyx_t_10 = <optimized out>
__pyx_t_11 = 0x0
__pyx_t_12 = <optimized out>
__pyx_t_13 = <optimized out>
__pyx_t_14 = <optimized out>
__pyx_t_15 = <optimized out>
__pyx_lineno = 0
__pyx_filename = 0x0
__pyx_clineno = 0
#100x00007fffee1bcf90 in __pyx_f_7asyncpg_8protocol_8protocol_12BaseProtocol__decode_row (__pyx_v_self=<optimized out>, __pyx_v_buf=<optimized out>, __pyx_v_buf_len=<optimized out>)
at asyncpg/protocol/protocol.c:68934
__pyx_r = 0x0
__pyx_t_2 = <optimized out>
__pyx_t_3 = 0x0
__pyx_lineno = 0
__pyx_filename = 0x0
__pyx_clineno = 0
#110x00007fffee1b9860 in __pyx_f_7asyncpg_8protocol_8protocol_12CoreProtocol__parse_data_msgs (__pyx_v_self=0x7fffedefebd0) at asyncpg/protocol/protocol.c:41432
__pyx_v_buf = 0x7fffecae22d0
__pyx_v_rows = 0x7fffeca8d780
__pyx_v_decoder = 0x7fffee1bcf80 <__pyx_f_7asyncpg_8protocol_8protocol_12BaseProtocol__decode_row>
__pyx_v_try_consume_message = 0x7fffedf35590 <__pyx_f_7asyncpg_7pgproto_7pgproto_10ReadBuffer_try_consume_message>
__pyx_v_take_message_type = 0x7fffedf377e0 <__pyx_f_7asyncpg_7pgproto_7pgproto_10ReadBuffer_take_message_type>
__pyx_v_cbuf = <optimized out>
__pyx_v_cbuf_len = 182
---Type <return> to continue, or q <return> to quit---
__pyx_v_row = 0x0
__pyx_v_mem = 0x0
__pyx_r = 0x0
__pyx_t_1 = 0x0
__pyx_t_2 = 0
__pyx_t_5 = <optimized out>
__pyx_t_6 = <optimized out>
__pyx_t_9 = <optimized out>
__pyx_lineno = 0
__pyx_filename = 0x0
__pyx_clineno = 0
#120x00007fffee18d6fa in __pyx_f_7asyncpg_8protocol_8protocol_12CoreProtocol__process__bind_execute (__pyx_v_self=0x7fffedefebd0, __pyx_v_mtype=21'\025')
at asyncpg/protocol/protocol.c:39047
__pyx_r = 0xcdcdcdcdcdcdcdcd
__pyx_t_1 = <optimized out>
__pyx_lineno = 68
__pyx_filename = <optimized out>
__pyx_clineno = -303043632
#130x00007fffee18a683 in __pyx_f_7asyncpg_8protocol_8protocol_12CoreProtocol__read_server_messages (__pyx_v_self=0x7fffedefebd0) at asyncpg/protocol/protocol.c:37586
__pyx_tstate = 0x555555bab990
__pyx_v_mtype = 68 'D'
__pyx_v_state = __pyx_e_7asyncpg_8protocol_8protocol_PROTOCOL_BIND_EXECUTE
__pyx_v_take_message = 0x7fffedf377c0 <__pyx_f_7asyncpg_7pgproto_7pgproto_10ReadBuffer_take_message>
__pyx_v_get_message_type = <optimized out>
__pyx_v_ex = 0x0
__pyx_r = 0x0
__pyx_t_1 = 0x0
__pyx_t_2 = <optimized out>
__pyx_t_3 = 1
__pyx_t_4 = __pyx_e_7asyncpg_8protocol_8protocol_PROTOCOL_BIND_EXECUTE
__pyx_t_5 = 0x555555b58b00 <_Py_NoneStruct>
__pyx_t_6 = 0x0
__pyx_t_7 = 0x0
__pyx_t_8 = 0x0
__pyx_t_9 = 0x0
__pyx_t_10 = <optimized out>
__pyx_t_11 = <optimized out>
__pyx_t_12 = 0x0
__pyx_t_13 = 0x0
__pyx_t_14 = <optimized out>
__pyx_t_15 = <optimized out>
__pyx_t_16 = <optimized out>
__pyx_t_17 = 0x0
---Type <return> to continue, or q <return> to quit---
__pyx_t_18 = 0x0
__pyx_t_19 = 0x0
__pyx_t_20 = 0x0
__pyx_t_21 = 0x0
__pyx_t_22 = 0x0
__pyx_t_23 = <optimized out>
__pyx_lineno = <optimized out>
__pyx_filename = <optimized out>
__pyx_clineno = <optimized out>
#140x00007fffee183079 in __pyx_pf_7asyncpg_8protocol_8protocol_12BaseProtocol_61data_received (__pyx_v_data=<optimized out>, __pyx_v_self=0x7fffedefebd0)
at asyncpg/protocol/protocol.c:71031
__pyx_r = 0x0
__pyx_t_1 = 0x0
__pyx_lineno = 0
__pyx_filename = 0x0
__pyx_clineno = 0
__pyx_r = <optimized out>
__pyx_t_1 = <optimized out>
__pyx_lineno = <optimized out>
__pyx_filename = <optimized out>
__pyx_clineno = <optimized out>
#15__pyx_pw_7asyncpg_8protocol_8protocol_12BaseProtocol_62data_received (__pyx_v_self=0x7fffedefebd0, __pyx_v_data=<optimized out>) at asyncpg/protocol/protocol.c:5461
__pyx_r = 0x0

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions