Dear all,
Please find attached (and below) a patch to disable the Write-Ahead
Log when the SQLite database is closed. This solves an issue with
reusing SQLite databases when they get copied around or remounted in a
docker container.
I signed the CLA and sent it out a few minutes ago, so that should go
through soon.
Kind regards
Sebastian
HG changeset patch
User Sebastian Höffner <info@sebastian-hoeffner.de>
Date 1657550727 -7200
Mon Jul 11 16:45:27 2022 +0200
Node ID c3d7bf3c56e0cc33df60db17ada4ae24b697c0aa
Parent 942eb3849d8d34bcd20967a97a1025bbdaf18f15
Disable Write-Ahead Logging in SQLiteDatabaseWrapper::Close
This allows network-drive / docker operation with a persisted database on
network mounts.
When running
podman run -p 4242:4242 -p 8042:8042 --name orthanc
-v orthanc_volume:/etc/orthanc/OrthancStorage
–rm sjodogne/orthanc-python
twice, the second run will fail with:
E0711 13:37:41.668864 StatementReference.cpp:88] SQLite: disk I/O error
(5386)
E0711 13:37:41.685738 main.cpp:2063] Uncaught exception, stopping now:
[SQLite: Cannot prepare a cached statement] (code 1012)
Error-code 5386 is SQLITE_IOERR_SHMMAP 1, which is a way the Write-Ahead Log
in SQLite is handled. The underlying issue is that the WAL does not work well
on network devices (see also 2).
In this particular case, it was possible to run
sqlite3 path-to-index <<< “PRAGMA journal_mode=DELETE;”
on the host system to allow a proper restart again, however, this does not work
from within the container, rendering the solution inapproriate.
Maybe different file permissions might solve it as well, but instead a good fix
seems to be to disable the WAL on close, so that no specific user intervention
is required.
I found a similar report 3, in which the solution was to switch to PostgreSQL
diff -r 942eb3849d8d -r c3d7bf3c56e0
OrthancServer/Sources/Database/SQLiteDatabaseWrapper.cpp
— a/OrthancServer/Sources/Database/SQLiteDatabaseWrapper.cpp Mon
Jul 11 12:17:15 2022 +0200
+++ b/OrthancServer/Sources/Database/SQLiteDatabaseWrapper.cpp Mon
Jul 11 16:45:27 2022 +0200
@@ -1371,6 +1371,8 @@
void SQLiteDatabaseWrapper::Close()
{
boost::mutex::scoped_lock lock(mutex_);
- // Disable Write-Ahead Logging to allow sqlite files in, e.g.,
docker containers - db_.Execute(“PRAGMA journal_mode=DELETE;”);
db_.Close();
}
disable-wal.patch (2.26 KB)