Hi Larry, thanks for you reply. Indeed, readers are long-lived processes on a Linux system. They're threads of a Pyhon Flask application to export data, which uses uses peewee as a wrapper for SQLite. Theoretically, once a request is served, the transaction should be terminated. However, I suspect there is some issue there (it's a pretty complex pipeline to build files to be served on the fly), and for some reason cleanup is not performed correctly. For one thing, I did not program it explicitly. I can of course investigate further, but I was wondering if there was some way of ascertaining whether my suspicion is correct (and later, whether I've fixed the bug or not). In other words, if there's a way of getting a list of the current transactions or locks. I believe this information is stored somewhere in the WAL-index file (.db-shm), because that's the kind of information SQLite needs to decide it can't run a checkpoint (which is believe is what happening).
If would also like to know if killing (possibly with -9) a process with an open handle might accidentally leave the DB locked. Thank you, Gerlando On Sun, Mar 24, 2019 at 12:56 PM Larry Brasfield <brasfield.la...@gmail.com> wrote: > > Gerlando Falauto writes: > > I'm using SQLite in WAL mode in the following scenario: > > - One writer which continuously writes new rows and deletes older ones > > - Multiple readers performing queries > > > > Writer and readers are running each in a separate process. > > The (Inactive) Journal Size limit is set to 100MB by pragmas and in > > normal usage this request seems to be honoured (i.e. the file does not > > grow bigger than that). > > I've however run into a situation where the .db-wal grows up to > > several Gigabytes, and the main .db file stays small. > > I believe this can be explained by some stale transaction in the > > system preventing the WAL pages from getting discarded (after being > > copied to the main database file). > > > > Any suggestion on how I can diagnose this situation, i.e. identify the > > offending process? > > > > If the various readers are short-lived processes (relative to the writer), > you could treat this similarly to a memory leak. The diagnostic method > used for those [a] can be adapted where you would wrap the transaction > begin and end operations with registration/deregistration and see whether > registrations exceed deregistrations upon program exit. > > > > [a. Generally, it is to record, in some kind of set or associative > container, each allocated memory pointer upon the allocation, and upon > corresponding frees, to remove the pointer from the set. Once that is > setup, leaks are diagnosed by examining the set as main() exits (or > whatever corresponds to main() in non-C derived languages.) If the set is > not empty then, there is a leak. ] > > > > If the reader processes are long-lived and running on the Windows OS, > another approach is viable. There is a handy set of system utilities which > allow developers to look at (Windows) OS system objects ( > https://docs.microsoft.com/en-us/sysinternals/downloads/winobj ) and see > what handles are held by a process to such objects ( > https://docs.microsoft.com/en-us/sysinternals/downloads/handle ). Since > SQLite uses various system objects (the DB file and associated handles, and > mutexes and associated handles) to coordinate DB access among processes, > these utilities would be helpful for figuring out which process is failing > to relinquish its claim to DB access. You could still use a registration > system to narrow the problem further by attaching a debugger to the > identified laggard process and examining its pending transaction registry. > (Often, resource registration associates the allocation code file and line > number with the handle or pointer representing resource.) > _______________________________________________ > sqlite-users mailing list > sqlite-users@mailinglists.sqlite.org > http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users _______________________________________________ sqlite-users mailing list sqlite-users@mailinglists.sqlite.org http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users