I'm using SQLCipher in my main app and it's using SQLite 3.15.2. However, my little sample app where I could also easily demonstrate the problem, is using whatever the built-in SQLite version is in macOS Sierra 10.12.4. I couldn't find SQLITE_MMAP_READWRITE in the Couchbase Lite source anywhere, so I'm sure it's not setting it. All I know now is with mmap I/O on, I get the corruption when the power goes out. With it off, I don't.
On Wed, Apr 19, 2017 at 12:21 AM, Dan Kennedy <danielk1...@gmail.com> wrote: > On 04/19/2017 02:42 AM, Jens Alfke wrote: > >> On Apr 18, 2017, at 2:20 AM, Deon Brewis <de...@outlook.com> wrote: >>> >>> It's not like it was subtle - it's a dead on repro. I was able to repro >>> this by doing a power cycle 2 hours after shutting the app down. OSX didn't >>> seem to have any interest in flushing mmap files until you soft reboot the >>> machine. >>> >> OK, hang on — I just reread the docs on memory-mapped I/O in SQLite. >> Memory-mapping is *only used for reads*, never for writes: >> > > It was used for writes in versions before 3.10.0 (January 2016). And still > is if SQLITE_MMAP_READWRITE is defined (not the default). > > Dan. > > > > > > > >> When updating the database file, SQLite always makes a copy of the page >>>> content into heap memory before modifying the page. This is necessary for >>>> two reasons. First, changes to the database are not supposed to be visible >>>> to other processes until after the transaction commits and so the changes >>>> must occur in private memory. Second, SQLite uses a read-only memory map to >>>> prevent stray pointers in the application from overwriting and corrupting >>>> the database file. >>>> >>> — https://www.sqlite.org/mmap.html >> >> Therefore I can’t imagine how using it could trigger database corruption. >> It doesn’t affect the way data is written at all! >> >> I accept that both of you have experimentally seen that memory-mapping >> leads to corruption, so I can only assume that either the above >> documentation is wrong, or that there’s some subtle bug in SQLite that >> alters the way data is written when memory-mapping is enabled. >> >> —Jens >> _______________________________________________ >> 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