#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.

Reply via email to