summaryrefslogtreecommitdiff
path: root/ironic/db/sqlalchemy/__init__.py
diff options
context:
space:
mode:
Diffstat (limited to 'ironic/db/sqlalchemy/__init__.py')
-rw-r--r--ironic/db/sqlalchemy/__init__.py19
1 files changed, 19 insertions, 0 deletions
diff --git a/ironic/db/sqlalchemy/__init__.py b/ironic/db/sqlalchemy/__init__.py
index 173b91fcc..c656ed227 100644
--- a/ironic/db/sqlalchemy/__init__.py
+++ b/ironic/db/sqlalchemy/__init__.py
@@ -10,9 +10,28 @@
# License for the specific language governing permissions and limitations
# under the License.
+from oslo_config import cfg
from oslo_db.sqlalchemy import enginefacade
+from sqlalchemy.engine import Engine
+from sqlalchemy import event
+
+CONF = cfg.CONF
# FIXME(stephenfin): we need to remove reliance on autocommit semantics ASAP
# since it's not compatible with SQLAlchemy 2.0
# NOTE(dtantsur): we want sqlite as close to a real database as possible.
enginefacade.configure(sqlite_fk=True, __autocommit=True)
+
+
+# NOTE(TheJulia): Setup a listener to trigger the sqlite write-ahead
+# log to be utilized to permit concurrent access, which is needed
+# as we can get read requests while we are writing via the API
+# surface *when* we're using sqlite as the database backend.
+@event.listens_for(Engine, "connect")
+def _setup_journal_mode(dbapi_connection, connection_record):
+ # NOTE(TheJulia): The string may not be loaded in some unit
+ # tests so handle whatever the output is as a string so we
+ # can lower/compare it and send the appropriate command to
+ # the database.
+ if 'sqlite' in str(CONF.database.connection).lower():
+ dbapi_connection.execute("PRAGMA journal_mode=WAL")