... and here is the solution!

I daemonize my programs using

    daemon (1, 1);

If I do that, before I open the DB, then everything is alright,
locks are held - fine!

In the other case I was first opening the DB to fetch some configuration
options from it before I took care of program args and then possibly
daemonize, if the "do not run in background"-option is not set.

And so, if I use this foreground option, my process wild hold the locks
just fine! -> Never use daemon() with open DB.

Thanks for the hints to how to have a look at locks and that it is
worth taking that look!

I think, this problem is solved - I have to change the order of the
startup. Maybe I even open the DB, read the configuration and close
it again, before opening it again after being daemonized.

Andreas

Am 16.07.2019 um 12:21 schrieb Andreas Kretzer:
> Interessting insights!
>
> Dan pointed out, that I should check the locks on the DB files and report
> that information back. Unluckily, my 'lsof' just reports PIDs,
> executable name
> and open file. It is a Busybox multicall binary.
>
> The good thing is: I have 'lslocks' on my system, which gives me exactly
> the information I need. It turns out, that one of the two main processes
> doesn't apply a lock at all (still under investigation why). The
> process, that
> uses exactly the same procedure to open the DB helds locks on the DB itself
> and the '-shm' file, the other does not:
>
> root:~> lsof |fgrep ecc.db   
> 698    /usr/bin/lcd_manager    /data/ecc/ecc.db
> 698    /usr/bin/lcd_manager    /data/ecc/ecc.db-wal
> 698    /usr/bin/lcd_manager    /data/ecc/ecc.db-shm
> 706    /usr/bin/ecc_core    /data/ecc/ecc.db
> 706    /usr/bin/ecc_core    /data/ecc/ecc.db-wal
> 706    /usr/bin/ecc_core    /data/ecc/ecc.db-shm
> root:~> lslocks              
> COMMAND           PID  TYPE   SIZE MODE  M      START        END PATH
> lcd_manager       698 POSIX 146.2M READ  0 1073741826 1073742335
> /data/ecc/ecc.db
> lcd_manager       698 POSIX    32K READ  0        128        128
> /data/ecc/ecc.db-shm
> root:~>
>
> At least, this explains why closing the second process (lcd_manager)
> will close
> the DB completely,  removing the '-shm' and '-wal' file.
>
> I will now investigate, why the first process doesn't acquire the locks.
>
> I will report back, when I know more!
>
> Andreas
>
> Am 11.07.2019 um 18:07 schrieb Andreas Kretzer:
>> I'm using SQLITE3 (V3.29.0) on an arm embedded linux (2.6.39) on an ext3
>> filesystem.
>>
>> Several processes hold the DB open and the "-wal" and "-shm" files exist.
>> if I use 'lsof | fgrep <name of DB>' I can see all processes having all
>> three
>> files open. At least one of the processes uses threads, but every process
>> has just one single DB connection active which is shared among all
>> threads.
>>
>> The compilation of sqlite3 is done with multithreading in mind:
>>
>> sqlite> pragma compile_options;
>> COMPILER=gcc-6.2.0
>> ENABLE_DBSTAT_VTAB
>> ENABLE_FTS4
>> ENABLE_JSON1
>> ENABLE_RTREE
>> ENABLE_STAT3
>> ENABLE_STMTVTAB
>> ENABLE_UNKNOWN_SQL_FUNCTION
>> ENABLE_UPDATE_DELETE_LIMIT
>> HAVE_ISNAN
>> THREADSAFE=1
>>
>> I can check, that the database is threadsafe (mode == 1) and is switched
>> to WAL-mode.
>>
>> So far I never noticed any problems dealing with concurrent updates or so.
>> The only thing (tested in depth with V3.15.2 and V3.29.0) is when one
>> process stops and closes the database using sqlite3_close(). This may even
>> be the sqlite3 CLI. That process closes DB (lsof shows that this
>> process has
>> closed its filedescriptors and is not in the listing anymore). Right
>> at the
>> next write access to the DB in the still running process (at least I
>> think that
>> this is exactly the point) the "-wal" and "-shm" files are removed.
>> The sqlite3_exec() function still returns SQLITE3_OK on all following
>> actions,
>> but 'lsof' reports, that this process has opened the "-wal" and "-shm"
>> files,
>> but marked as "deleted". And they are really deleted and none of the
>> upcoming
>> DB changes will ever reach the real DB.
>>
>> What is wrong? I already checked, that my kernel supports POSIX file
>> locking
>> (CONFIG_FILE_LOCKING=yes). What else can I check? Two or more sqlite3 CLI
>> processes started in parallel don't exhibit this behavior.
>>
>> Thanks
>>
>> Andreas
>


-- 

Mit freundlichen Grüßen

Andreas Kretzer

 

ETB Electronic Team

Beratungs- und Vertriebs GmbH

 

Berliner Straße 8a

15537 Erkner

 

FON   +49 3362 889349-12

FAX   +49 3362 889349-23

 

 

email: a.kret...@etb-electronic.de

 

AG Potsdam HRB 16532; Sitz der Gesellschaft: Am Mellensee 

Geschäftsführer: Marco Runge, Jürgen Gentzsch

 

_______________________________________________
sqlite-users mailing list
sqlite-users@mailinglists.sqlite.org
http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users

Reply via email to