#15542: When postgres autocommit is set contenttype test cause sites tests
failures
-------------------------------------+-------------------------------------
Reporter: | Owner: nobody
jasonculverhouse | Status: new
Type: Bug | Component:
Milestone: 1.3 | contrib.contenttypes
Version: 1.2 | Severity: Normal
Resolution: | Keywords:
Triage Stage: Accepted | Has patch: 0
Needs documentation: 0 | Needs tests: 0
Patch needs improvement: 0 | Easy pickings: 0
UI/UX: 0 |
-------------------------------------+-------------------------------------
Changes (by ramiro):
* ui_ux: => 0
* easy: => 0
Old description:
> It seems that the contenttype framework and the sites contribs
> conflict with using the autocommit:True database option. I'm not
> really sure what happens but here is a simple test case that shows
> that the order of the tests causes a failure. It looks like from the
> SQL that the save point is being rolled back in a new transaction, not
> the transaction that the savepoint was created.
>
> If I create a new django tests site
> with
> {{{
> django-admin-2.6.py startproject sitecontenttypebug
> }}}
>
> Modify settings.py to use postgres autocommit
>
> {{{
> DATABASES = {
> 'default': {
> 'ENGINE': 'django.db.backends.postgresql_psycopg2',
> ...
> 'OPTIONS': {
> "autocommit": True,
> }
> }
> }
> }}}
>
> The minimum required to have the django tests fail is:
> {{{
> python manage.py test contenttypes
> sites.SitesFrameworkTests.test_get_current_site
> }}}
>
> Switching the order causes no failure
> {{{
> python manage.py test sites.SitesFrameworkTests.test_get_current_site
> contenttypes
> }}}
>
> Stack trace from the failure
> {{{
> ======================================================================
> ERROR: test_get_current_site
> (django.contrib.sites.tests.SitesFrameworkTests)
> ----------------------------------------------------------------------
> Traceback (most recent call last):
> File "/opt/local/Library/Frameworks/Python.framework/Versions/2.6/
> lib/python2.6/site-packages/django/test/testcases.py", line 257, in
> __call__
> self._pre_setup()
> File "/opt/local/Library/Frameworks/Python.framework/Versions/2.6/
> lib/python2.6/site-packages/django/test/testcases.py", line 224, in
> _pre_setup
> self._fixture_setup()
> File "/opt/local/Library/Frameworks/Python.framework/Versions/2.6/
> lib/python2.6/site-packages/django/test/testcases.py", line 515, in
> _fixture_setup
> return super(TestCase, self)._fixture_setup()
> File "/opt/local/Library/Frameworks/Python.framework/Versions/2.6/
> lib/python2.6/site-packages/django/test/testcases.py", line 236, in
> _fixture_setup
> call_command('flush', verbosity=0, interactive=False, database=db)
> File "/opt/local/Library/Frameworks/Python.framework/Versions/2.6/
> lib/python2.6/site-packages/django/core/management/__init__.py", line
> 166, in call_command
> return klass.execute(*args, **defaults)
> File "/opt/local/Library/Frameworks/Python.framework/Versions/2.6/
> lib/python2.6/site-packages/django/core/management/base.py", line 220,
> in execute
> output = self.handle(*args, **options)
> File "/opt/local/Library/Frameworks/Python.framework/Versions/2.6/
> lib/python2.6/site-packages/django/core/management/base.py", line 351,
> in handle
> return self.handle_noargs(**options)
> File "/opt/local/Library/Frameworks/Python.framework/Versions/2.6/
> lib/python2.6/site-packages/django/core/management/commands/flush.py",
> line 75, in handle_noargs
> emit_post_sync_signal(all_models, verbosity, interactive, db)
> File "/opt/local/Library/Frameworks/Python.framework/Versions/2.6/
> lib/python2.6/site-packages/django/core/management/sql.py", line 182,
> in emit_post_sync_signal
> interactive=interactive, db=db)
> File "/opt/local/Library/Frameworks/Python.framework/Versions/2.6/
> lib/python2.6/site-packages/django/dispatch/dispatcher.py", line 172,
> in send
> response = receiver(signal=self, sender=sender, **named)
> File "/opt/local/Library/Frameworks/Python.framework/Versions/2.6/
> lib/python2.6/site-packages/django/contrib/auth/management/
> __init__.py", line 28, in create_permissions
> defaults={'name': name, 'content_type': ctype})
> File "/opt/local/Library/Frameworks/Python.framework/Versions/2.6/
> lib/python2.6/site-packages/django/db/models/manager.py", line 135, in
> get_or_create
> return self.get_query_set().get_or_create(**kwargs)
> File "/opt/local/Library/Frameworks/Python.framework/Versions/2.6/
> lib/python2.6/site-packages/django/db/models/query.py", line 387, in
> get_or_create
> transaction.savepoint_rollback(sid, using=self.db)
> File "/opt/local/Library/Frameworks/Python.framework/Versions/2.6/
> lib/python2.6/site-packages/django/db/transaction.py", line 242, in
> savepoint_rollback
> connection._savepoint_rollback(sid)
> File "/opt/local/Library/Frameworks/Python.framework/Versions/2.6/
> lib/python2.6/site-packages/django/db/backends/__init__.py", line 61,
> in _savepoint_rollback
> self.cursor().execute(self.ops.savepoint_rollback_sql(sid))
> File "/opt/local/Library/Frameworks/Python.framework/Versions/2.6/
> lib/python2.6/site-packages/django/db/backends/postgresql_psycopg2/
> base.py", line 44, in execute
> return self.cursor.execute(query, args)
> DatabaseError: no such savepoint
>
> ----------------------------------------------------------------------
> Ran 2 tests in 0.478s
>
> FAILED (errors=1)
> Destroying test database 'default'...
> }}}
>
> Offending SQL
> {{{
> LOG: statement: BEGIN; SET TRANSACTION ISOLATION LEVEL READ COMMITTED
> LOG: statement: SELECT "auth_permission"."id",
> "auth_permission"."name", "auth_permission"."content_type_id",
> "auth_permission"."codename" FROM "auth_permission" WHERE
> ("auth_permission"."codename" = E'add_user' AND
> "auth_permission"."content_type_id" = 3 )
> LOG: statement: SAVEPOINT s140735080041632_x1
> LOG: statement: INSERT INTO "auth_permission" ("name",
> "content_type_id", "codename") VALUES (E'Can add user', 3,
> E'add_user') RETURNING "auth_permission"."id"
> LOG: statement: COMMIT
> ERROR: insert or update on table "auth_permission" violates foreign
> key constraint "content_type_id_refs_id_728de91f"
> DETAIL: Key (content_type_id)=(3) is not present in table
> "django_content_type".
> STATEMENT: COMMIT
> LOG: statement: BEGIN; SET TRANSACTION ISOLATION LEVEL READ COMMITTED
> LOG: statement: ROLLBACK TO SAVEPOINT s140735080041632_x1
> ERROR: no such savepoint
> STATEMENT: ROLLBACK TO SAVEPOINT s140735080041632_x1
> LOG: statement: SHOW default_transaction_isolation
> LOG: statement: BEGIN; SET TRANSACTION ISOLATION LEVEL READ COMMITTED
> LOG: statement: SET TIME ZONE E'America/Chicago'
> LOG: statement: ROLLBACK
> LOG: statement: DROP DATABASE "test_jason_db"
>
> }}}
New description:
It seems that the contenttype framework and the sites contribs
conflict with using the autocommit:True database option. I'm not
really sure what happens but here is a simple test case that shows
that the order of the tests causes a failure. It looks like from the
SQL that the save point is being rolled back in a new transaction, not
the transaction that the savepoint was created.
If I create a new django tests site
with
{{{
django-admin-2.6.py startproject sitecontenttypebug
}}}
Modify settings.py to use postgres autocommit
{{{
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
...
'OPTIONS': {
"autocommit": True,
}
}
}
}}}
The minimum required to have the django tests fail is:
{{{
python manage.py test contenttypes
sites.SitesFrameworkTests.test_get_current_site
}}}
Switching the order causes no failure
{{{
python manage.py test sites.SitesFrameworkTests.test_get_current_site
contenttypes
}}}
Stack trace from the failure
{{{
======================================================================
ERROR: test_get_current_site
(django.contrib.sites.tests.SitesFrameworkTests)
----------------------------------------------------------------------
Traceback (most recent call last):
File
"/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6
/site-packages/django/test/testcases.py", line 257, in __call__
self._pre_setup()
File
"/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6
/site-packages/django/test/testcases.py", line 224, in _pre_setup
self._fixture_setup()
File
"/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6
/site-packages/django/test/testcases.py", line 515, in _fixture_setup
return super(TestCase, self)._fixture_setup()
File
"/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6
/site-packages/django/test/testcases.py", line 236, in _fixture_setup
call_command('flush', verbosity=0, interactive=False, database=db)
File
"/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6
/site-packages/django/core/management/__init__.py", line 166, in
call_command
return klass.execute(*args, **defaults)
File
"/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6
/site-packages/django/core/management/base.py", line 220, in execute
output = self.handle(*args, **options)
File
"/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6
/site-packages/django/core/management/base.py", line 351, in handle
return self.handle_noargs(**options)
File
"/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6
/site-packages/django/core/management/commands/flush.py", line 75, in
handle_noargs
emit_post_sync_signal(all_models, verbosity, interactive, db)
File
"/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6
/site-packages/django/core/management/sql.py", line 182, in
emit_post_sync_signal
interactive=interactive, db=db)
File
"/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6
/site-packages/django/dispatch/dispatcher.py", line 172, in send
response = receiver(signal=self, sender=sender, **named)
File
"/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6
/site-packages/django/contrib/auth/management/__init__.py", line 28, in
create_permissions
defaults={'name': name, 'content_type': ctype})
File
"/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6
/site-packages/django/db/models/manager.py", line 135, in get_or_create
return self.get_query_set().get_or_create(**kwargs)
File
"/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6
/site-packages/django/db/models/query.py", line 387, in get_or_create
transaction.savepoint_rollback(sid, using=self.db)
File
"/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6
/site-packages/django/db/transaction.py", line 242, in savepoint_rollback
connection._savepoint_rollback(sid)
File
"/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6
/site-packages/django/db/backends/__init__.py", line 61, in
_savepoint_rollback
self.cursor().execute(self.ops.savepoint_rollback_sql(sid))
File
"/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6
/site-packages/django/db/backends/postgresql_psycopg2/base.py", line 44,
in execute
return self.cursor.execute(query, args)
DatabaseError: no such savepoint
----------------------------------------------------------------------
Ran 2 tests in 0.478s
FAILED (errors=1)
Destroying test database 'default'...
}}}
Offending SQL
{{{
LOG: statement: BEGIN; SET TRANSACTION ISOLATION LEVEL READ COMMITTED
LOG: statement: SELECT "auth_permission"."id", "auth_permission"."name",
"auth_permission"."content_type_id", "auth_permission"."codename" FROM
"auth_permission"
WHERE ("auth_permission"."codename" = E'add_user' AND
"auth_permission"."content_type_id" = 3 )
LOG: statement: SAVEPOINT s140735080041632_x1
LOG: statement: INSERT INTO "auth_permission" ("name", "content_type_id",
"codename") VALUES (E'Can add user', 3, E'add_user') RETURNING
"auth_permission"."id"
LOG: statement: COMMIT
ERROR: insert or update on table "auth_permission" violates foreign key
constraint "content_type_id_refs_id_728de91f"
DETAIL: Key (content_type_id)=(3) is not present in table
"django_content_type".
STATEMENT: COMMIT
LOG: statement: BEGIN; SET TRANSACTION ISOLATION LEVEL READ COMMITTED
LOG: statement: ROLLBACK TO SAVEPOINT s140735080041632_x1
ERROR: no such savepoint
STATEMENT: ROLLBACK TO SAVEPOINT s140735080041632_x1
LOG: statement: SHOW default_transaction_isolation
LOG: statement: BEGIN; SET TRANSACTION ISOLATION LEVEL READ COMMITTED
LOG: statement: SET TIME ZONE E'America/Chicago'
LOG: statement: ROLLBACK
LOG: statement: DROP DATABASE "test_jason_db"
}}}
--
--
Ticket URL: <https://code.djangoproject.com/ticket/15542#comment:5>
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 post to this group, send email to [email protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/django-updates?hl=en.