Dan, are there any plans to merge the wal2 branch into the trunk?
> On Mar 29, 2019, at 7:10 AM, Dan Kennedy <danielk1...@gmail.com> wrote: > > > There's code here, if you want to experiment with it: > > https://sqlite.org/src/timeline?r=wal2 > > Docs: > > https://sqlite.org/src/artifact/a807405a05e19a49 > > Dan. > > > > On 29/3/62 01:33, Florian Uekermann wrote: >> Hi, >> >> A very simple reproducer bash script using the sqlite3 CLI is appended at >> the end. >> >> I am using WAL mode in a setting with sequential writes and many concurrent >> reads. Due to WAL mode the readers don't get blocked, which is great and >> since writes are sequential, they never get blocked either. >> However, I am seeing the WAL grow on every write without ever restarting at >> the beginning of the file if there is a constant influx of new reads (with >> limited lifetime). >> This causes the WAL file to grow to many GB within minutes, even if the >> database state fits into a few MB or even kB after closing all connections. >> >> The output of "PRAGMA wal_checkpoint(PASSIVE);" usually looks like this: >> "0|123|123", which I interpret as the checkpointer being caught up on the >> current state. I believe the reason that new writes are appended at the end, >> instead of restarting the WAL, is that while reads are short-lived, there is >> always at least one going on, so the log of the last write has to be kept, >> which in turn prevents a reset of the WAL. >> >> An example read (r) write (w) pattern could look like this (b: begin, e: >> end): >> r1_b; w1; r2b; r1e; w2; r2b; w3; r3b; r2e ... >> >> A solution could be to start a second WAL when the first one exceeds some >> size threshold, which would allow resetting the first one after all readers >> finish that started before the wal_checkpoint finished, even if there are >> new writes in the second WAL. Then the roles/order of the two WALs flipped, >> allowing the second WAL to be reset regardless of read/write frequency. >> I believe that would limit the total WAL size to about 2 times of the size >> of writes happening within the timespan of a single read. >> >> This solution has been suggested previously on this list by Mark Hamburg, >> but the threads lack a simple reproducer and detailed problem description. >> >> Best regards, >> Florian >> >> Test script: >> >> rm -f test.sqlite >> ./sqlite3 test.sqlite <<< " >> PRAGMA journal_mode=WAL; >> CREATE TABLE t (value INTEGER); >> REPLACE into t (rowid, value) VALUES (1,0); >> " >> >> for i in {1..1000} >> do >> >> ./sqlite3 test.sqlite <<< " >> BEGIN; >> SELECT value FROM t WHERE rowid=1; >> .system sleep 0.2 >> SELECT value FROM t WHERE rowid=1; >> COMMIT; >> " & >> >> sleep 0.1 >> ./sqlite3 test.sqlite <<< " >> BEGIN; >> REPLACE into t (rowid, value) VALUES (1,$i); >> .print inc >> COMMIT; >> " >> wc -c test.sqlite-wal >> done >> >> _______________________________________________ >> 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 _______________________________________________ sqlite-users mailing list sqlite-users@mailinglists.sqlite.org http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users