#30424: Queries within AppConfig.ready() can cause issues with some Django db commands --------------------------------+-------------------------------------- Reporter: Rich Rauenzahn | Owner: nobody Type: Uncategorized | Status: new Component: Uncategorized | Version: 1.11 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 Rich Rauenzahn:
Old description: > I can recreate this in my `AppConfig` simply with the following inside of > `ready()`: > > {{{ > list(MyModel.objects.all()) > }}} > > If you then run `manage dbshell` you can see the connection still > existing after invoking `psql`: > > {{{ > $ manage dbshell > Settings: myproj.config.rich.DevelopmentSettings > Expanded display is used automatically. > Null display is "¤". > psql (9.2.24) > Type "help" for help. > > myproj=> SELECT * > FROM pg_stat_activity; > -[ RECORD 1 > ]----+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- > datid | 4855283 > datname | myproj > pid | 2590 > usesysid | 16384 > usename | myproj > application_name | psql > client_addr | 10.20.72.150 > client_hostname | ¤ > client_port | 53364 > backend_start | 2019-04-29 09:53:14.044483-07 > xact_start | 2019-04-29 09:53:15.280585-07 > query_start | 2019-04-29 09:53:15.280585-07 > state_change | 2019-04-29 09:53:15.28059-07 > waiting | f > state | active > query | SELECT * > | FROM pg_stat_activity; > -[ RECORD 2 > ]----+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- > datid | 4855283 > datname | myproj > pid | 2589 > usesysid | 16384 > usename | myproj > application_name | > client_addr | 10.20.72.150 > client_hostname | ¤ > client_port | 53362 > backend_start | 2019-04-29 09:53:14.013457-07 > xact_start | ¤ > query_start | 2019-04-29 09:53:14.018469-07 > state_change | 2019-04-29 09:53:14.020801-07 > waiting | f > state | idle > query | SELECT ... > myproj=> > }}} > > This can cause problems with trying to drop the database from the manage > command as the database in still in use by another connection. > > Work around seems to be adding this to the end of `ready()`: > > {{{ > from django.db import connections > connections.close_all() > }}} > > My guess is the underlying fork to `psql` isn't closing all file handles > and `psql` is inheriting (but not managing) them. New description: I can recreate this in my `AppConfig` simply with the following inside of `ready()`: {{{ list(MyModel.objects.all()) }}} If you then run `manage dbshell` you can see the connection still existing after invoking `psql`: {{{ $ manage dbshell Settings: myproj.config.rich.DevelopmentSettings Expanded display is used automatically. Null display is "¤". psql (9.2.24) Type "help" for help. myproj=> SELECT * FROM pg_stat_activity; -[ RECORD 1 ]----+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- datid | 4855283 datname | myproj pid | 2590 usesysid | 16384 usename | myproj application_name | psql client_addr | 10.20.72.150 client_hostname | ¤ client_port | 53364 backend_start | 2019-04-29 09:53:14.044483-07 xact_start | 2019-04-29 09:53:15.280585-07 query_start | 2019-04-29 09:53:15.280585-07 state_change | 2019-04-29 09:53:15.28059-07 waiting | f state | active query | SELECT * | FROM pg_stat_activity; -[ RECORD 2 ]----+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- datid | 4855283 datname | myproj pid | 2589 usesysid | 16384 usename | myproj application_name | client_addr | 10.20.72.150 client_hostname | ¤ client_port | 53362 backend_start | 2019-04-29 09:53:14.013457-07 xact_start | ¤ query_start | 2019-04-29 09:53:14.018469-07 state_change | 2019-04-29 09:53:14.020801-07 waiting | f state | idle query | SELECT ... myproj=> }}} This can cause problems with trying to drop the database from the manage command as the database in still in use by another connection. Work around seems to be adding this to the end of `ready()`: {{{ from django.db import connections connections.close_all() }}} My guess is the underlying fork to `psql` isn't closing all file handles and `psql` is inheriting (but not managing) them. -- -- Ticket URL: <https://code.djangoproject.com/ticket/30424#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 django-updates+unsubscr...@googlegroups.com. To post to this group, send email to django-updates@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/django-updates/066.8ede551a5a1817123ac488c53e876246%40djangoproject.com. For more options, visit https://groups.google.com/d/optout.