Edgewall Software

Opened 8 years ago

Last modified 8 years ago

#12420 closed defect

Safety level may not be changed inside a transaction on SQLite with synchronous=normal if PySqlite 2.8.1 (3.8.2) — at Version 3

Reported by: Jun Omae Owned by: Jun Omae
Priority: normal Milestone: 1.0.11
Component: database backend Version: 1.0-stable
Severity: normal Keywords: pysqlite
Cc: Branch:
Release Notes:

Fix raising OperationalError when SQLite with journal_mode and synchronous parameters on pysqlite 2.8.0+.

API Changes:
Internal Changes:

Description

2016-03-28 00:56:58,865 Trac[pool] ERROR: Exception caught on create
Traceback (most recent call last):
  File "/home/jun66j5/src/tracdev/svn/branches/1.0-stable/trac/db/pool.py", line 105, in get_cnx
    cnx = connector.get_connection(**kwargs)
  File "/home/jun66j5/src/tracdev/svn/branches/1.0-stable/trac/db/sqlite_backend.py", line 190, in get_connection
    return SQLiteConnection(path, log, params)
  File "/home/jun66j5/src/tracdev/svn/branches/1.0-stable/trac/db/sqlite_backend.py", line 298, in __init__
    _set_synchronous(cursor, params.get('synchronous'))
  File "/home/jun66j5/src/tracdev/svn/branches/1.0-stable/trac/db/sqlite_backend.py", line 408, in _set_synchronous
    cursor.execute('PRAGMA synchronous = %s' % _quote(value))
OperationalError: Safety level may not be changed inside a transaction
2016-03-28 00:56:58,865 Trac[chrome] ERROR: Error during check of EMAIL_VIEW: TimeoutError: Unable to get database connection within 0 seconds. (OperationalError: Safety level may not be changed inside a transaction)

Change History (3)

comment:1 by Jun Omae, 8 years ago

Keywords: pysqlite added

After pysqlite 2.8.0, this issue is reproduced. Also, the same issue is raised with journal_mode=wal parameter.

======================================================================
ERROR: test_insert_empty (trac.db.tests.api.StringsTestCase)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/jun66j5/src/tracdev/git/trac/db/tests/api.py", line 311, in setUp
    self.env = EnvironmentStub()
  File "/home/jun66j5/src/tracdev/git/trac/core.py", line 124, in __call__
    self.__init__(*args, **kwargs)
  File "/home/jun66j5/src/tracdev/git/trac/test.py", line 405, in __init__
    self.reset_db(default_data)
  File "/home/jun66j5/src/tracdev/git/trac/test.py", line 452, in reset_db
    self.global_databasemanager.init_db()
  File "/home/jun66j5/src/tracdev/git/trac/db/api.py", line 253, in init_db
    connector.init_db(**args)
  File "/home/jun66j5/src/tracdev/git/trac/db/sqlite_backend.py", line 212, in init_db
    _set_journal_mode(cursor, params.get('journal_mode'))
  File "/home/jun66j5/src/tracdev/git/trac/db/sqlite_backend.py", line 392, in _set_journal_mode
    cursor.execute('PRAGMA journal_mode = %s' % _quote(value))
OperationalError: cannot change into wal mode from within a transaction

comment:2 by Christian Boos, 8 years ago

Patch (jomae.git@t12420) looks good to me. I tested it on trunk with PySqlite 2.8.1, SQLite 3.12, Python 2.7.10 Windows x64.

  • TRAC_TEST_DB_URL=sqlite:test.db
  • TRAC_TEST_DB_URL=sqlite:test.db?journal_mode=wal
  • TRAC_TEST_DB_URL=sqlite:test.db?journal_mode=wal&synchronous=normal

All tests pass.

comment:3 by Jun Omae, 8 years ago

Owner: set to Jun Omae
Release Notes: modified (diff)
Status: newassigned

Thanks for the reviewing and testing! I'm going to push it.

Note: See TracTickets for help on using tickets.