#35577: runserver leaves a database connection infinitely unclosed as a result 
of
its migration check
------------------------------------+--------------------------------------
     Reporter:  Klaas van Schelven  |                    Owner:  (none)
         Type:  Uncategorized       |                   Status:  new
    Component:  Uncategorized       |                  Version:  4.2
     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
------------------------------------+--------------------------------------
Description changed by Klaas van Schelven:

Old description:

> When starting the "Debug server" (runserver command), Django does a check
> on the migrations ("check_migrations").
>
> This check touches the DB (to see which migrations have run)
>
> However, after the call there's no call to `connection.close()`. (or some
> conditional form thereof).
>
> This means that for the debugserver one connection will remain
> permanently open. The name of the thread on which this connection is
> created is `django-main-thread`.
>
>  Looking at  [https://docs.djangoproject.com/en/5.0/ref/databases
> /#persistent-connections the documentation] the per-request model of
> connection lifetimes is clear. Other than that the following caveat is
> documented:
>
> > If a connection is created in a long-running process, outside of
> Django’s request-response cycle, the connection will remain open until
> explicitly closed, or timeout occurs.
>
> But one would assume that this caveat applies to connections opened by
> the developers themselves, not by what Django does internally.
>
> Here's the call to `check_migrations`:
> https://github.com/django/django/blob/stable/4.2.x/django/core/management/commands/runserver.py#L136
>
> I've seen this behavior on Django 4.2, have not tested it with a more
> recent version yet, but I don't have a reason to think it's been solved
> in the meantime.

New description:

 When starting the "Debug server" (runserver command), Django does a check
 on the migrations ("check_migrations").

 This check touches the DB (to see which migrations have run)

 However, after the call there's no call to `connection.close()`. (or some
 conditional form thereof).

 This means that for the debugserver one connection will remain permanently
 open. The name of the thread on which this connection is created is
 `django-main-thread`.

 Looking at  [https://docs.djangoproject.com/en/5.0/ref/databases
 /#persistent-connections the documentation] the per-request model of
 connection lifetimes is clear. Other than that the following caveat is
 documented:

 > If a connection is created in a long-running process, outside of
 Django’s request-response cycle, the connection will remain open until
 explicitly closed, or timeout occurs.

 But one would assume that this caveat applies to connections opened by the
 developers themselves, not by what Django does internally.

 Here's the call to `check_migrations`:
 
https://github.com/django/django/blob/stable/4.2.x/django/core/management/commands/runserver.py#L136

 I've seen this behavior on Django 4.2, have not tested it with a more
 recent version yet, but I don't have a reason to think it's been solved in
 the meantime.

--
-- 
Ticket URL: <https://code.djangoproject.com/ticket/35577#comment:1>
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/0107019082063735-480b2e5f-6564-43fe-b838-d45260432c42-000000%40eu-central-1.amazonses.com.

Reply via email to