Skip to content

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

Closed
@ShahriyarR

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 <[email protected]>"]

[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": "[email protected]", "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='[email protected]' 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
#0  0x00007fffee2028ae in record_repr (v=0x7fffeca32eb0) at asyncpg/protocol/record/recordobj.c:462
#1  0x00005555555fd868 in PyObject_Repr (v=v@entry=0x7fffeca32eb0) at Objects/object.c:420
#2  0x00005555555fdb39 in PyObject_Print (op=op@entry=0x7fffeca32eb0, fp=0x7ffff740a680 <_IO_2_1_stderr_>, flags=flags@entry=0) at Objects/object.c:275
#3  0x00005555555fdd48 in _PyObject_Dump (op=op@entry=0x7fffeca32eb0) at Objects/object.c:378
#4  0x00005555555fdf17 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
#5  0x00005555556ec022 in visit_validate (op=<optimized out>, parent_raw=parent_raw@entry=0x7fffeca32eb0) at Modules/gcmodule.c:2162
#6  0x00007fffee2021c2 in record_traverse (o=0x7fffeca32eb0, visit=0x5555556ebfe6 <visit_validate>, arg=0x7fffeca32eb0) at asyncpg/protocol/record/recordobj.c:125
#7  0x00005555556ee67b in PyObject_GC_Track (op_raw=op_raw@entry=0x7fffeca32eb0) at Modules/gcmodule.c:2188
#8  0x00007fffee20347b in ApgRecord_New (type=type@entry=0x7fffee424a20 <ApgRecord_Type>, desc=desc@entry=0x7fffeca60370, size=size@entry=10)
    at asyncpg/protocol/record/recordobj.c:57
#9  0x00007fffee1bc186 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
#10 0x00007fffee1bcf90 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
#11 0x00007fffee1b9860 in __pyx_f_7asyncpg_8protocol_8protocol_12CoreProtocol__parse_data_msgs (__pyx_v_self=0x7fffedefebd0) at asyncpg/protocol/protocol.c:41432
#12 0x00007fffee18d6fa 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
#13 0x00007fffee18a683 in __pyx_f_7asyncpg_8protocol_8protocol_12CoreProtocol__read_server_messages (__pyx_v_self=0x7fffedefebd0) at asyncpg/protocol/protocol.c:37586
#14 0x00007fffee183079 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
#16 0x000055555578cbe8 in method_vectorcall_O (func=0x7fffee48b6b0, args=0x555558338070, nargsf=<optimized out>, kwnames=<optimized out>) at Objects/descrobject.c:462
#17 0x000055555567caff in _PyObject_VectorcallTstate (kwnames=0x0, nargsf=9223372036854775810, args=0x555558338070, callable=0x7fffee48b6b0, tstate=0x555555bab990)
    at ./Include/cpython/abstract.h:118
#18 PyObject_Vectorcall (kwnames=0x0, nargsf=9223372036854775810, args=0x555558338070, callable=0x7fffee48b6b0) at ./Include/cpython/abstract.h:127

bt full excerpt:

(gdb) bt full
#0  0x00007fffee2028ae 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'}
#1  0x00005555555fd868 in PyObject_Repr (v=v@entry=0x7fffeca32eb0) at Objects/object.c:420
        res = <optimized out>
        tstate = <optimized out>
        __PRETTY_FUNCTION__ = "PyObject_Repr"
#2  0x00005555555fdb39 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"
#3  0x00005555555fdd48 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
#4  0x00005555555fdf17 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"
#5  0x00005555556ec022 in visit_validate (op=<optimized out>, parent_raw=parent_raw@entry=0x7fffeca32eb0) at Modules/gcmodule.c:2162
        parent = 0x7fffeca32eb0
        __func__ = "visit_validate"
#6  0x00007fffee2021c2 in record_traverse (o=0x7fffeca32eb0, visit=0x5555556ebfe6 <visit_validate>, arg=0x7fffeca32eb0) at asyncpg/protocol/record/recordobj.c:125
        vret = <optimized out>
        i = <optimized out>
#7  0x00005555556ee67b in PyObject_GC_Track (op_raw=op_raw@entry=0x7fffeca32eb0) at Modules/gcmodule.c:2188
        op = 0x7fffeca32eb0
        __func__ = "PyObject_GC_Track"
        traverse = <optimized out>
#8  0x00007fffee20347b 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>
#9  0x00007fffee1bc186 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
#10 0x00007fffee1bcf90 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
#11 0x00007fffee1b9860 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
#12 0x00007fffee18d6fa 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
#13 0x00007fffee18a683 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>
#14 0x00007fffee183079 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