close_if_unusable_or_obsolete should skip connections in atomic block for autocommit check
Via https://github.com/django/channels/issues/1091#issuecomment-489488831 I have noticed that close_if_unusable_or_obsolete will close the DB connection used in tests, which has entered an atomic block (via TestCase).
channel's DatabaseSyncToAsync calls close_if_unusable_or_obsolete here.
The following patch might make sense:
diff --git c/django/db/backends/base/base.py i/django/db/backends/base/base.py
index 9fa03cc0ee..f9ca0f8464 100644
--- c/django/db/backends/base/base.py
+++ i/django/db/backends/base/base.py
@@ -497,7 +497,10 @@ def close_if_unusable_or_obsolete(self):
if self.connection is not None:
# If the application didn't restore the original autocommit setting,
# don't take chances, drop the connection.
- if self.get_autocommit() != self.settings_dict['AUTOCOMMIT']:
+ if (
+ not self.in_atomic_block and
+ self.get_autocommit() != self.settings_dict["AUTOCOMMIT"]
+ ):
self.close()
return
Change History
(11)
| Triage Stage: |
Unreviewed → Accepted
|
| Has patch: |
set
|
| Needs tests: |
set
|
| Owner: |
changed from nobody to Daniel Hahler
|
| Status: |
new → assigned
|
| Owner: |
Daniel Hahler removed
|
| Status: |
assigned → new
|
| Cc: |
Evstifeev Roman added
|
| Owner: |
set to Samriddha Kumar Tripathi
|
| Status: |
new → assigned
|
| Patch needs improvement: |
set
|
close_if_unusable_or_obsoleteis certainly an internal API but I agree that not consideringself.in_atomic_blockin the check againstsettings_dict["AUTOCOMMIT"]is way too naive to determine the connection is unusable or obsolete.