#35672: Using database connection pooling, threads do not return the connection
-------------------------------------+-------------------------------------
     Reporter:  André S. Hansen      |                    Owner:  (none)
         Type:  Bug                  |                   Status:  new
    Component:  Database layer       |                  Version:  5.1
  (models, ORM)                      |
     Severity:  Normal               |               Resolution:
     Keywords:                       |             Triage Stage:
                                     |  Unreviewed
    Has patch:  0                    |      Needs documentation:  0
  Needs tests:  0                    |  Patch needs improvement:  0
Easy pickings:  0                    |                    UI/UX:  0
-------------------------------------+-------------------------------------
Changes (by André S. Hansen):

 * resolution:  needsinfo =>
 * status:  closed => new


Old description:

> I am testing the new db connection pooling, which increased the
> performance greatly, typically lowering api response times from 30ms ->
> 20ms on my dev env.
>
> **However, after a while i started getting**
> {{{
> psycopg_pool.PoolTimeout : couldn't get a connection after 30.00 sec
> }}}
>
> It happened after 220 api calls within the span of 7minutes, which
> probably means x5-10 database calls.
>
> This forces me to turn of connection pooling.
>

> **Using settings**
> {{{
> {
>    "ENGINE": os.environ.get("DB_ENGINE",
> "django.db.backends.postgresql"),
>    "OPTIONS": {"pool": True}
> }
> }}}
>
> **Extra info:**
> - Python 3.12.1
> - Django 5.1
> - psycopg 3.2.1
> - psycopg-pool 3.2.2
> - Local docker image hosted postgresql database using image "postgres"
>
> **Logs**
> {{{
> [13/Aug/2024 00:50:41] "POST /api/instances/2/actions/move/ HTTP/1.1" 200
> 91
> couldn't get a connection after 30.00 sec
> Traceback (most recent call last):
>   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
> packages\django\db\backends\base\base.py", line 279, in ensure_connection
>     self.connect()
>   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
> packages\django\utils\asyncio.py", line 26, in inner
>     return func(*args, **kwargs)
>            ^^^^^^^^^^^^^^^^^^^^^
>   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
> packages\django\db\backends\base\base.py", line 256, in connect
>     self.connection = self.get_new_connection(conn_params)
>                       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
> packages\django\utils\asyncio.py", line 26, in inner
>     return func(*args, **kwargs)
>            ^^^^^^^^^^^^^^^^^^^^^
>   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
> packages\django\db\backends\postgresql\base.py", line 348, in
> get_new_connection
>     connection = self.pool.getconn()
>                  ^^^^^^^^^^^^^^^^^^^
>   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
> packages\psycopg_pool\pool.py", line 202, in getconn
>     raise PoolTimeout(
> psycopg_pool.PoolTimeout: couldn't get a connection after 30.00 sec
>
> The above exception was the direct cause of the following exception:
>
> Traceback (most recent call last):
>   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
> packages\ninja\operation.py", line 192, in _run_authentication
>     result = callback(request)
>              ^^^^^^^^^^^^^^^^^
>   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
> packages\ninja\security\apikey.py", line 23, in __call__
>     return self.authenticate(request, key)
>            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
> packages\ninja\security\session.py", line 17, in authenticate
>     if request.user.is_authenticated:
>        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
> packages\django\utils\functional.py", line 251, in inner
>     self._setup()
>   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
> packages\django\utils\functional.py", line 404, in _setup
>     self._wrapped = self._setupfunc()
>                     ^^^^^^^^^^^^^^^^^
>   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
> packages\django\contrib\auth\middleware.py", line 37, in <lambda>
>     request.user = SimpleLazyObject(lambda: get_user(request))
>                                             ^^^^^^^^^^^^^^^^^
>   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
> packages\django\contrib\auth\middleware.py", line 17, in get_user
>     request._cached_user = auth.get_user(request)
>                            ^^^^^^^^^^^^^^^^^^^^^^
>   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
> packages\django\contrib\auth\__init__.py", line 209, in get_user
>     user_id = _get_user_session_key(request)
>               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
> packages\django\contrib\auth\__init__.py", line 62, in
> _get_user_session_key
>     return
> get_user_model()._meta.pk.to_python(request.session[SESSION_KEY])
> ~~~~~~~~~~~~~~~^^^^^^^^^^^^^
>   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
> packages\django\contrib\sessions\backends\base.py", line 55, in
> __getitem__
>     return self._session[key]
>            ^^^^^^^^^^^^^
>   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
> packages\django\contrib\sessions\backends\base.py", line 249, in
> _get_session
>     self._session_cache = self.load()
>                           ^^^^^^^^^^^
>   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
> packages\django\contrib\sessions\backends\db.py", line 55, in load
>     s = self._get_session_from_db()
>         ^^^^^^^^^^^^^^^^^^^^^^^^^^^
>   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
> packages\django\contrib\sessions\backends\db.py", line 34, in
> _get_session_from_db
>     return self.model.objects.get(
>            ^^^^^^^^^^^^^^^^^^^^^^^
>   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
> packages\django\db\models\manager.py", line 87, in manager_method
>     return getattr(self.get_queryset(), name)(*args, **kwargs)
>            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
> packages\django\db\models\query.py", line 645, in get
>     num = len(clone)
>           ^^^^^^^^^^
>   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
> packages\django\db\models\query.py", line 382, in __len__
>     self._fetch_all()
>   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
> packages\django\db\models\query.py", line 1928, in _fetch_all
>     self._result_cache = list(self._iterable_class(self))
>                          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
> packages\django\db\models\query.py", line 91, in __iter__
>     results = compiler.execute_sql(
>               ^^^^^^^^^^^^^^^^^^^^^
>   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
> packages\cachalot\monkey_patch.py", line 37, in inner
>     return original(compiler, *args, **kwargs)
>            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
> packages\cachalot\monkey_patch.py", line 94, in inner
>     return execute_query_func()
>            ^^^^^^^^^^^^^^^^^^^^
>   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
> packages\cachalot\monkey_patch.py", line 80, in <lambda>
>     execute_query_func = lambda: original(compiler, *args, **kwargs)
>                                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
> packages\django\db\models\sql\compiler.py", line 1572, in execute_sql
>     cursor = self.connection.cursor()
>              ^^^^^^^^^^^^^^^^^^^^^^^^
>   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
> packages\django\utils\asyncio.py", line 26, in inner
>     return func(*args, **kwargs)
>            ^^^^^^^^^^^^^^^^^^^^^
>   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
> packages\django\db\backends\base\base.py", line 320, in cursor
>     return self._cursor()
>            ^^^^^^^^^^^^^^
>   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
> packages\django\db\backends\base\base.py", line 296, in _cursor
>     self.ensure_connection()
>   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
> packages\django\utils\asyncio.py", line 26, in inner
>     return func(*args, **kwargs)
>            ^^^^^^^^^^^^^^^^^^^^^
>   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
> packages\django\db\backends\base\base.py", line 278, in ensure_connection
>     with self.wrap_database_errors:
>   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
> packages\django\db\utils.py", line 91, in __exit__
>     raise dj_exc_value.with_traceback(traceback) from exc_value
>   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
> packages\django\db\backends\base\base.py", line 279, in ensure_connection
>     self.connect()
>   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
> packages\django\utils\asyncio.py", line 26, in inner
>     return func(*args, **kwargs)
>            ^^^^^^^^^^^^^^^^^^^^^
>   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
> packages\django\db\backends\base\base.py", line 256, in connect
>     self.connection = self.get_new_connection(conn_params)
>                       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
> packages\django\utils\asyncio.py", line 26, in inner
>     return func(*args, **kwargs)
>            ^^^^^^^^^^^^^^^^^^^^^
>   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
> packages\django\db\backends\postgresql\base.py", line 348, in
> get_new_connection
>     connection = self.pool.getconn()
>                  ^^^^^^^^^^^^^^^^^^^
>   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
> packages\psycopg_pool\pool.py", line 202, in getconn
>     raise PoolTimeout(
> django.db.utils.OperationalError: couldn't get a connection after 30.00
> sec
> Internal Server Error: /api/instances/2/actions/move/
> Traceback (most recent call last):
>   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
> packages\django\db\backends\base\base.py", line 279, in ensure_connection
>     self.connect()
>   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
> packages\django\utils\asyncio.py", line 26, in inner
>     return func(*args, **kwargs)
>            ^^^^^^^^^^^^^^^^^^^^^
>   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
> packages\django\db\backends\base\base.py", line 256, in connect
>     self.connection = self.get_new_connection(conn_params)
>                       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
> packages\django\utils\asyncio.py", line 26, in inner
>     return func(*args, **kwargs)
>            ^^^^^^^^^^^^^^^^^^^^^
>   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
> packages\django\db\backends\postgresql\base.py", line 348, in
> get_new_connection
>     connection = self.pool.getconn()
>                  ^^^^^^^^^^^^^^^^^^^
>   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
> packages\psycopg_pool\pool.py", line 202, in getconn
>     raise PoolTimeout(
> psycopg_pool.PoolTimeout: couldn't get a connection after 30.00 sec
>
> The above exception was the direct cause of the following exception:
>
> Traceback (most recent call last):
>   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
> packages\django\core\handlers\exception.py", line 55, in inner
>     response = get_response(request)
>                ^^^^^^^^^^^^^^^^^^^^^
>   File "C:\Repos\untitledgame\backend\monitor\middleware.py", line 35, in
> __call__
>     user_id=user_id_or_none(request.user),
>             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>   File "C:\Repos\untitledgame\backend\game\api\utils.py", line 9, in
> user_id_or_none
>     if isinstance(user, AnonymousUser):
>        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
> packages\django\utils\functional.py", line 280, in __getattribute__
>     value = super().__getattribute__(name)
>             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
> packages\django\utils\functional.py", line 251, in inner
>     self._setup()
>   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
> packages\django\utils\functional.py", line 404, in _setup
>     self._wrapped = self._setupfunc()
>                     ^^^^^^^^^^^^^^^^^
>   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
> packages\django\contrib\auth\middleware.py", line 37, in <lambda>
>     request.user = SimpleLazyObject(lambda: get_user(request))
>                                             ^^^^^^^^^^^^^^^^^
>   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
> packages\django\contrib\auth\middleware.py", line 17, in get_user
>     request._cached_user = auth.get_user(request)
>                            ^^^^^^^^^^^^^^^^^^^^^^
>   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
> packages\django\contrib\auth\__init__.py", line 209, in get_user
>     user_id = _get_user_session_key(request)
>               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
> packages\django\contrib\auth\__init__.py", line 62, in
> _get_user_session_key
>     return
> get_user_model()._meta.pk.to_python(request.session[SESSION_KEY])
> ~~~~~~~~~~~~~~~^^^^^^^^^^^^^
>   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
> packages\django\contrib\sessions\backends\base.py", line 55, in
> __getitem__
>     return self._session[key]
>            ^^^^^^^^^^^^^
>   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
> packages\django\contrib\sessions\backends\base.py", line 249, in
> _get_session
>     self._session_cache = self.load()
>                           ^^^^^^^^^^^
>   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
> packages\django\contrib\sessions\backends\db.py", line 55, in load
>     s = self._get_session_from_db()
>         ^^^^^^^^^^^^^^^^^^^^^^^^^^^
>   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
> packages\django\contrib\sessions\backends\db.py", line 34, in
> _get_session_from_db
>     return self.model.objects.get(
>            ^^^^^^^^^^^^^^^^^^^^^^^
>   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
> packages\django\db\models\manager.py", line 87, in manager_method
>     return getattr(self.get_queryset(), name)(*args, **kwargs)
>            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
> packages\django\db\models\query.py", line 645, in get
>     num = len(clone)
>           ^^^^^^^^^^
>   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
> packages\django\db\models\query.py", line 382, in __len__
>     self._fetch_all()
>   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
> packages\django\db\models\query.py", line 1928, in _fetch_all
>     self._result_cache = list(self._iterable_class(self))
>                          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
> packages\django\db\models\query.py", line 91, in __iter__
>     results = compiler.execute_sql(
>               ^^^^^^^^^^^^^^^^^^^^^
>   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
> packages\cachalot\monkey_patch.py", line 37, in inner
>     return original(compiler, *args, **kwargs)
>            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
> packages\cachalot\monkey_patch.py", line 94, in inner
>     return execute_query_func()
>            ^^^^^^^^^^^^^^^^^^^^
>   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
> packages\cachalot\monkey_patch.py", line 80, in <lambda>
>     execute_query_func = lambda: original(compiler, *args, **kwargs)
>                                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
> packages\django\db\models\sql\compiler.py", line 1572, in execute_sql
>     cursor = self.connection.cursor()
>              ^^^^^^^^^^^^^^^^^^^^^^^^
>   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
> packages\django\utils\asyncio.py", line 26, in inner
>     return func(*args, **kwargs)
>            ^^^^^^^^^^^^^^^^^^^^^
>   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
> packages\django\db\backends\base\base.py", line 320, in cursor
>     return self._cursor()
>            ^^^^^^^^^^^^^^
>   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
> packages\django\db\backends\base\base.py", line 296, in _cursor
>     self.ensure_connection()
>   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
> packages\django\utils\asyncio.py", line 26, in inner
>     return func(*args, **kwargs)
>            ^^^^^^^^^^^^^^^^^^^^^
>   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
> packages\django\db\backends\base\base.py", line 278, in ensure_connection
>     with self.wrap_database_errors:
>   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
> packages\django\db\utils.py", line 91, in __exit__
>     raise dj_exc_value.with_traceback(traceback) from exc_value
>   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
> packages\django\db\backends\base\base.py", line 279, in ensure_connection
>     self.connect()
>   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
> packages\django\utils\asyncio.py", line 26, in inner
>     return func(*args, **kwargs)
>            ^^^^^^^^^^^^^^^^^^^^^
>   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
> packages\django\db\backends\base\base.py", line 256, in connect
>     self.connection = self.get_new_connection(conn_params)
>                       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
> packages\django\utils\asyncio.py", line 26, in inner
>     return func(*args, **kwargs)
>            ^^^^^^^^^^^^^^^^^^^^^
>   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
> packages\django\db\backends\postgresql\base.py", line 348, in
> get_new_connection
>     connection = self.pool.getconn()
>                  ^^^^^^^^^^^^^^^^^^^
>   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
> packages\psycopg_pool\pool.py", line 202, in getconn
>     raise PoolTimeout(
> django.db.utils.OperationalError: couldn't get a connection after 30.00
> sec
> [13/Aug/2024 00:56:42] "POST /api/instances/2/actions/move/ HTTP/1.1" 500
> 235606
> }}}

New description:

 I am testing the new db connection pooling, which increased the
 performance greatly, typically lowering api response times from 30ms ->
 20ms on my dev env.

 **However, after a while i started getting**
 {{{
 psycopg_pool.PoolTimeout : couldn't get a connection after 30.00 sec
 }}}

 Further investigation shows the reason was a Threaded Middleware orm
 interaction, like this simplified code.

 class TimeMonitorMiddleware(object):
     batched_logs: List[RequestLog] = []

     def __call__(self, request: WSGIRequest) -> HttpResponse:
         # ...

         # Save batched logs
         if len(self.batched_logs) >= 50:
             Thread(target=RequestLog.objects.bulk_create,
 args=(batched_logs,)).start()

         return response




 **Using settings**
 {{{
 {
    "ENGINE": os.environ.get("DB_ENGINE", "django.db.backends.postgresql"),
    "OPTIONS": {"pool": True}
 }
 }}}

 **Extra info:**
 - Python 3.12.1
 - Django 5.1
 - psycopg 3.2.1
 - psycopg-pool 3.2.2
 - Local docker image hosted postgresql database using image "postgres"

 **Logs**
 {{{
 [13/Aug/2024 00:50:41] "POST /api/instances/2/actions/move/ HTTP/1.1" 200
 91
 couldn't get a connection after 30.00 sec
 Traceback (most recent call last):
   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
 packages\django\db\backends\base\base.py", line 279, in ensure_connection
     self.connect()
   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
 packages\django\utils\asyncio.py", line 26, in inner
     return func(*args, **kwargs)
            ^^^^^^^^^^^^^^^^^^^^^
   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
 packages\django\db\backends\base\base.py", line 256, in connect
     self.connection = self.get_new_connection(conn_params)
                       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
 packages\django\utils\asyncio.py", line 26, in inner
     return func(*args, **kwargs)
            ^^^^^^^^^^^^^^^^^^^^^
   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
 packages\django\db\backends\postgresql\base.py", line 348, in
 get_new_connection
     connection = self.pool.getconn()
                  ^^^^^^^^^^^^^^^^^^^
   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
 packages\psycopg_pool\pool.py", line 202, in getconn
     raise PoolTimeout(
 psycopg_pool.PoolTimeout: couldn't get a connection after 30.00 sec

 The above exception was the direct cause of the following exception:

 Traceback (most recent call last):
   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
 packages\ninja\operation.py", line 192, in _run_authentication
     result = callback(request)
              ^^^^^^^^^^^^^^^^^
   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
 packages\ninja\security\apikey.py", line 23, in __call__
     return self.authenticate(request, key)
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
 packages\ninja\security\session.py", line 17, in authenticate
     if request.user.is_authenticated:
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
 packages\django\utils\functional.py", line 251, in inner
     self._setup()
   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
 packages\django\utils\functional.py", line 404, in _setup
     self._wrapped = self._setupfunc()
                     ^^^^^^^^^^^^^^^^^
   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
 packages\django\contrib\auth\middleware.py", line 37, in <lambda>
     request.user = SimpleLazyObject(lambda: get_user(request))
                                             ^^^^^^^^^^^^^^^^^
   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
 packages\django\contrib\auth\middleware.py", line 17, in get_user
     request._cached_user = auth.get_user(request)
                            ^^^^^^^^^^^^^^^^^^^^^^
   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
 packages\django\contrib\auth\__init__.py", line 209, in get_user
     user_id = _get_user_session_key(request)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
 packages\django\contrib\auth\__init__.py", line 62, in
 _get_user_session_key
     return
 get_user_model()._meta.pk.to_python(request.session[SESSION_KEY])
 ~~~~~~~~~~~~~~~^^^^^^^^^^^^^
   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
 packages\django\contrib\sessions\backends\base.py", line 55, in
 __getitem__
     return self._session[key]
            ^^^^^^^^^^^^^
   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
 packages\django\contrib\sessions\backends\base.py", line 249, in
 _get_session
     self._session_cache = self.load()
                           ^^^^^^^^^^^
   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
 packages\django\contrib\sessions\backends\db.py", line 55, in load
     s = self._get_session_from_db()
         ^^^^^^^^^^^^^^^^^^^^^^^^^^^
   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
 packages\django\contrib\sessions\backends\db.py", line 34, in
 _get_session_from_db
     return self.model.objects.get(
            ^^^^^^^^^^^^^^^^^^^^^^^
   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
 packages\django\db\models\manager.py", line 87, in manager_method
     return getattr(self.get_queryset(), name)(*args, **kwargs)
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
 packages\django\db\models\query.py", line 645, in get
     num = len(clone)
           ^^^^^^^^^^
   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
 packages\django\db\models\query.py", line 382, in __len__
     self._fetch_all()
   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
 packages\django\db\models\query.py", line 1928, in _fetch_all
     self._result_cache = list(self._iterable_class(self))
                          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
 packages\django\db\models\query.py", line 91, in __iter__
     results = compiler.execute_sql(
               ^^^^^^^^^^^^^^^^^^^^^
   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
 packages\cachalot\monkey_patch.py", line 37, in inner
     return original(compiler, *args, **kwargs)
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
 packages\cachalot\monkey_patch.py", line 94, in inner
     return execute_query_func()
            ^^^^^^^^^^^^^^^^^^^^
   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
 packages\cachalot\monkey_patch.py", line 80, in <lambda>
     execute_query_func = lambda: original(compiler, *args, **kwargs)
                                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
 packages\django\db\models\sql\compiler.py", line 1572, in execute_sql
     cursor = self.connection.cursor()
              ^^^^^^^^^^^^^^^^^^^^^^^^
   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
 packages\django\utils\asyncio.py", line 26, in inner
     return func(*args, **kwargs)
            ^^^^^^^^^^^^^^^^^^^^^
   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
 packages\django\db\backends\base\base.py", line 320, in cursor
     return self._cursor()
            ^^^^^^^^^^^^^^
   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
 packages\django\db\backends\base\base.py", line 296, in _cursor
     self.ensure_connection()
   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
 packages\django\utils\asyncio.py", line 26, in inner
     return func(*args, **kwargs)
            ^^^^^^^^^^^^^^^^^^^^^
   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
 packages\django\db\backends\base\base.py", line 278, in ensure_connection
     with self.wrap_database_errors:
   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
 packages\django\db\utils.py", line 91, in __exit__
     raise dj_exc_value.with_traceback(traceback) from exc_value
   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
 packages\django\db\backends\base\base.py", line 279, in ensure_connection
     self.connect()
   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
 packages\django\utils\asyncio.py", line 26, in inner
     return func(*args, **kwargs)
            ^^^^^^^^^^^^^^^^^^^^^
   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
 packages\django\db\backends\base\base.py", line 256, in connect
     self.connection = self.get_new_connection(conn_params)
                       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
 packages\django\utils\asyncio.py", line 26, in inner
     return func(*args, **kwargs)
            ^^^^^^^^^^^^^^^^^^^^^
   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
 packages\django\db\backends\postgresql\base.py", line 348, in
 get_new_connection
     connection = self.pool.getconn()
                  ^^^^^^^^^^^^^^^^^^^
   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
 packages\psycopg_pool\pool.py", line 202, in getconn
     raise PoolTimeout(
 django.db.utils.OperationalError: couldn't get a connection after 30.00
 sec
 Internal Server Error: /api/instances/2/actions/move/
 Traceback (most recent call last):
   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
 packages\django\db\backends\base\base.py", line 279, in ensure_connection
     self.connect()
   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
 packages\django\utils\asyncio.py", line 26, in inner
     return func(*args, **kwargs)
            ^^^^^^^^^^^^^^^^^^^^^
   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
 packages\django\db\backends\base\base.py", line 256, in connect
     self.connection = self.get_new_connection(conn_params)
                       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
 packages\django\utils\asyncio.py", line 26, in inner
     return func(*args, **kwargs)
            ^^^^^^^^^^^^^^^^^^^^^
   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
 packages\django\db\backends\postgresql\base.py", line 348, in
 get_new_connection
     connection = self.pool.getconn()
                  ^^^^^^^^^^^^^^^^^^^
   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
 packages\psycopg_pool\pool.py", line 202, in getconn
     raise PoolTimeout(
 psycopg_pool.PoolTimeout: couldn't get a connection after 30.00 sec

 The above exception was the direct cause of the following exception:

 Traceback (most recent call last):
   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
 packages\django\core\handlers\exception.py", line 55, in inner
     response = get_response(request)
                ^^^^^^^^^^^^^^^^^^^^^
   File "C:\Repos\untitledgame\backend\monitor\middleware.py", line 35, in
 __call__
     user_id=user_id_or_none(request.user),
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
   File "C:\Repos\untitledgame\backend\game\api\utils.py", line 9, in
 user_id_or_none
     if isinstance(user, AnonymousUser):
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
 packages\django\utils\functional.py", line 280, in __getattribute__
     value = super().__getattribute__(name)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
 packages\django\utils\functional.py", line 251, in inner
     self._setup()
   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
 packages\django\utils\functional.py", line 404, in _setup
     self._wrapped = self._setupfunc()
                     ^^^^^^^^^^^^^^^^^
   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
 packages\django\contrib\auth\middleware.py", line 37, in <lambda>
     request.user = SimpleLazyObject(lambda: get_user(request))
                                             ^^^^^^^^^^^^^^^^^
   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
 packages\django\contrib\auth\middleware.py", line 17, in get_user
     request._cached_user = auth.get_user(request)
                            ^^^^^^^^^^^^^^^^^^^^^^
   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
 packages\django\contrib\auth\__init__.py", line 209, in get_user
     user_id = _get_user_session_key(request)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
 packages\django\contrib\auth\__init__.py", line 62, in
 _get_user_session_key
     return
 get_user_model()._meta.pk.to_python(request.session[SESSION_KEY])
 ~~~~~~~~~~~~~~~^^^^^^^^^^^^^
   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
 packages\django\contrib\sessions\backends\base.py", line 55, in
 __getitem__
     return self._session[key]
            ^^^^^^^^^^^^^
   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
 packages\django\contrib\sessions\backends\base.py", line 249, in
 _get_session
     self._session_cache = self.load()
                           ^^^^^^^^^^^
   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
 packages\django\contrib\sessions\backends\db.py", line 55, in load
     s = self._get_session_from_db()
         ^^^^^^^^^^^^^^^^^^^^^^^^^^^
   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
 packages\django\contrib\sessions\backends\db.py", line 34, in
 _get_session_from_db
     return self.model.objects.get(
            ^^^^^^^^^^^^^^^^^^^^^^^
   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
 packages\django\db\models\manager.py", line 87, in manager_method
     return getattr(self.get_queryset(), name)(*args, **kwargs)
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
 packages\django\db\models\query.py", line 645, in get
     num = len(clone)
           ^^^^^^^^^^
   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
 packages\django\db\models\query.py", line 382, in __len__
     self._fetch_all()
   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
 packages\django\db\models\query.py", line 1928, in _fetch_all
     self._result_cache = list(self._iterable_class(self))
                          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
 packages\django\db\models\query.py", line 91, in __iter__
     results = compiler.execute_sql(
               ^^^^^^^^^^^^^^^^^^^^^
   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
 packages\cachalot\monkey_patch.py", line 37, in inner
     return original(compiler, *args, **kwargs)
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
 packages\cachalot\monkey_patch.py", line 94, in inner
     return execute_query_func()
            ^^^^^^^^^^^^^^^^^^^^
   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
 packages\cachalot\monkey_patch.py", line 80, in <lambda>
     execute_query_func = lambda: original(compiler, *args, **kwargs)
                                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
 packages\django\db\models\sql\compiler.py", line 1572, in execute_sql
     cursor = self.connection.cursor()
              ^^^^^^^^^^^^^^^^^^^^^^^^
   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
 packages\django\utils\asyncio.py", line 26, in inner
     return func(*args, **kwargs)
            ^^^^^^^^^^^^^^^^^^^^^
   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
 packages\django\db\backends\base\base.py", line 320, in cursor
     return self._cursor()
            ^^^^^^^^^^^^^^
   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
 packages\django\db\backends\base\base.py", line 296, in _cursor
     self.ensure_connection()
   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
 packages\django\utils\asyncio.py", line 26, in inner
     return func(*args, **kwargs)
            ^^^^^^^^^^^^^^^^^^^^^
   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
 packages\django\db\backends\base\base.py", line 278, in ensure_connection
     with self.wrap_database_errors:
   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
 packages\django\db\utils.py", line 91, in __exit__
     raise dj_exc_value.with_traceback(traceback) from exc_value
   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
 packages\django\db\backends\base\base.py", line 279, in ensure_connection
     self.connect()
   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
 packages\django\utils\asyncio.py", line 26, in inner
     return func(*args, **kwargs)
            ^^^^^^^^^^^^^^^^^^^^^
   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
 packages\django\db\backends\base\base.py", line 256, in connect
     self.connection = self.get_new_connection(conn_params)
                       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
 packages\django\utils\asyncio.py", line 26, in inner
     return func(*args, **kwargs)
            ^^^^^^^^^^^^^^^^^^^^^
   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
 packages\django\db\backends\postgresql\base.py", line 348, in
 get_new_connection
     connection = self.pool.getconn()
                  ^^^^^^^^^^^^^^^^^^^
   File "C:\Users\andre\.virtualenvs\backend-jnn8gBG-\Lib\site-
 packages\psycopg_pool\pool.py", line 202, in getconn
     raise PoolTimeout(
 django.db.utils.OperationalError: couldn't get a connection after 30.00
 sec
 [13/Aug/2024 00:56:42] "POST /api/instances/2/actions/move/ HTTP/1.1" 500
 235606
 }}}

--
-- 
Ticket URL: <https://code.djangoproject.com/ticket/35672#comment:7>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.

-- 
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-updates/01070191652f78ff-efb2df86-02a9-48d6-aecf-4c3bb5876971-000000%40eu-central-1.amazonses.com.

Reply via email to