Project

General

Profile

[Solved] webdav module cannot open sqlite.db file.

Added by tokohito 11 months ago

Hello

I'm testing lighttpd on embedded Linux where armel(armv5) is implemented.

# cat /proc/version
Linux version 2.6.32.28 (root@ubuntu-desktop) (gcc version 4.5.2 (Sourcery G++ Lite 2011.03-42) ) #125 PREEMPT Fri Dec 14 14:40:11 CST 2012

# cat /etc/version.txt
Product Name     : PQI Air card
Firmware Version : V147 DEC202012 M
Build Date       : 20 DEC 2012
Revision         : 2
WiFi Model       : Atheros AR6003 11n
Linux Kernel     : 2.6.32.28
Busybox          : 1.18.5

# lighttpd -v
lighttpd/1.4.39 (ssl) - a light and fast webserver
Build-Date: Oct 28 2022 13:37:19

I want to use the function of Webdav, so I tried to enable the module, but then lighttpd cannot start.
https://github.com/lighttpd/lighttpd1.4/blob/lighttpd-1.4.39/src/mod_webdav.c#L224
2012-01-01 00:01:46: (mod_webdav.c.224) can't open transaction: database is locked

I used strace command and found that the Permission denied event happened when lighttpd process exec a fcntl64() system call.

# /mnt/sd/DCIM/122_TREK/usr/bin/strace -ffff -tttt lighttpd -f /etc/lighttpd/lighttpd.conf
...
1325553933.160880 clone(/mnt/sd/DCIM/122_TREK/usr/bin/strace: Process 371 attached
child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x40007068) = 371
[pid   370] 1325553933.171192 munmap(0x404eb000, 77824 <unfinished ...>
[pid   371] 1325553933.176349 setsid()  = 371
[pid   371] 1325553933.176349 rt_sigaction(SIGHUP, {SIG_IGN, [HUP], SA_RESTORER|SA_RESTART, 0x40213b1c}, {SIG_DFL, [], 0}, 8) = 0
[pid   371] 1325553933.186662 clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x40007068) = 372
/mnt/sd/DCIM/122_TREK/usr/bin/strace: Process 372 attached
...
[pid   372] 1325553933.351667 lstat64("/tmp/webdav.db", {st_mode=S_IFREG|0644, st_size=0, ...}) = 0
[pid   370] 1325553933.361980 <... munmap resumed> ) = 0
[pid   372] 1325553933.361980 stat64("/tmp/webdav.db",  <unfinished ...>
[pid   370] 1325553933.361980 munmap(0x4045c000, 135168) = 0
[pid   370] 1325553933.367136 munmap(0x4047d000, 143360) = 0
[pid   372] 1325553933.372292 <... stat64 resumed> {st_mode=S_IFREG|0644, st_size=0, ...}) = 0
[pid   372] 1325553933.377449 open("/tmp/webdav.db", O_RDWR|O_CREAT|O_LARGEFILE|O_CLOEXEC, 0644) = 5
[pid   372] 1325553933.377449 fstat64(5, {st_mode=S_IFREG|0644, st_size=0, ...}) = 0
[pid   372] 1325553933.382605 fstat64(5, {st_mode=S_IFREG|0644, st_size=0, ...}) = 0
[pid   372] 1325553933.387762 stat64("/tmp/webdav.db", {st_mode=S_IFREG|0644, st_size=0, ...}) = 0
[pid   372] 1325553933.398074 brk(0x8b000) = 0x8b000
[pid   372] 1325553933.398074 brk(0x8c000) = 0x8c000
[pid   372] 1325553933.403231 _llseek(5, 0, [0], SEEK_SET) = 0
[pid   372] 1325553933.403231 read(5, "", 100) = 0
[pid   370] 1325553933.408387 munmap(0x40276000, 69632) = 0
[pid   370] 1325553933.408387 munmap(0x40264000, 73728) = 0
[pid   370] 1325553933.413544 exit_group(0) = ?
[pid   372] 1325553933.418700 brk(0x9b000) = 0x9b000
[pid   372] 1325553933.418700 brk(0x9c000) = 0x9c000
[pid   370] 1325553933.423856 +++ exited with 0 +++
1325553933.423856 brk(0x9d000)          = 0x9d000
1325553933.429013 fcntl64(5, F_SETLK64, {l_type=F_RDLCK, l_whence=SEEK_SET, l_start=1073741824, l_len=1}) = -1 EACCES (Permission denied)
1325553933.434169 write(3, "2012-01-03 01:25:31: (mod_webdav"..., 84) = 84
1325553933.439326 write(3, "2012-01-03 01:25:31: (server.c.1"..., 83) = 83
1325553933.439326 fstat64(5, {st_mode=S_IFREG|0644, st_size=0, ...}) = 0
1325553933.444482 stat64("/tmp/webdav.db", {st_mode=S_IFREG|0644, st_size=0, ...}) = 0
1325553933.454795 close(5)              = 0
...

The target file where Permission denied event occurred is sqlight3 database.
This system has 3 filesystems(ramfs/jffs2/fat32), but I get the same error no matter which environment I try.
Also, sqlite3 originally included the function of In-memory DB, but it was not possible to use it at webdav module.

Please tell me the essential cause of the above error and how to deal with it
Best regards.


Replies (5)

RE: webdav module cannot open sqlite.db file. - Added by gstrauss 11 months ago

It appears that you are using lighttpd/1.4.39. STOP. Do not pass go. That is such a fantastic failure that you should not continue troubleshooting until upgrading lighttpd. lighttpd 1.4.39 was released Dec 2015. lighttpd mod_webdav was completely rewritten in lighttpd 1.4.54. Latest version of lighttpd is lighttpd 1.4.67.

As you identified fcntl64(5, F_SETLK64, {l_type=F_RDLCK, l_whence=SEEK_SET, l_start=1073741824, l_len=1}) = -1 EACCES (Permission denied) is a problem. You need to figure out why that is occurring. Did you try sqlite3 commands directly against the database? Did you try putting the database on a different filesystem? e.g. test with the sqlite database in an in-memory filesystem like /tmp or /dev/shm.

You're not going to get further help here with such an ancient version of lighttpd 1.4.39.

RE: webdav module cannot open sqlite.db file. - Added by tokohito 11 months ago

Hi

I try the same test with the latest buildroot and got the same result (please check attached log file for details).

# lighttpd -v
lighttpd/1.4.65 (ssl) - a light and fast webserver

The product I'm testing is very niche and comes in the form of an SD card, so there's no external interface.

# mount
proc on /proc type proc (0)
/dev/mtdblock0 on /mnt/mtd type jffs2 (0)
/dev/mmcblk0p1 on /mnt/sd type vfat (shortname=winnt,iocharset=utf8,rw)
none on /dev/pts type devpts (mode=0622)

The / mount point not displayed in the command output results is the ramfs.
The results were the same no matter which ramfs/jffs2/vfat(fat32) was tested.

The tests with sqlite3 command had similar results, with the exception that the In-memory DB feature did not cause any problems.

# sqlite3
SQLite version 3.39.2 2022-07-21 15:24:47
Enter ".help" for usage hints.
Connected to a transient in-memory database.
Use ".open FILENAME" to reopen on a persistent database.
sqlite> .open /tmp/webdav.db
sqlite> .databases
main: /tmp/webdav.db r/w
sqlite> .tables
Error: database is locked

# sqlite3 :memory:
SQLite version 3.39.2 2022-07-21 15:24:47
Enter ".help" for usage hints.
sqlite> .databases
main: "" r/w
sqlite> .tables
sqlite>

RE: webdav module cannot open sqlite.db file. - Added by gstrauss 11 months ago

The tests with sqlite3 command had similar results, with the exception that the In-memory DB feature did not cause any problems.

This is not a lighttpd issue.

If you can not get sqlite3 working on your system, then you can not get lighttpd mod_webdav using sqlite3 working on your system.

If you run lighttpd mod_webdav without webdav.sqlite-db-name then lighttpd mod_webdav will not be able to provide LOCK/UNLOCK or PROPPATCH, but lighttpd will serve other WebDAV commands. lighttpd mod_webdav will still serve standard "live properties" on the file for PROPFIND, but will not be able to PROPPATCH additional properties (or subsequently PROPFIND those additional properties) without a working sqlite3 database.

RE: webdav module cannot open sqlite.db file. - Added by gstrauss 11 months ago

If your system is slow, then you can try tuning sqlite3. Again, this is an issue with sqlite3 on your system, not lighttpd.
https://dba.stackexchange.com/questions/47919/how-do-i-specify-a-timeout-in-sqlite3-from-the-command-line/47920#47920

    (1-5/5)