diff options
author | drh <drh@noemail.net> | 2014-10-21 21:56:06 +0000 |
---|---|---|
committer | drh <drh@noemail.net> | 2014-10-21 21:56:06 +0000 |
commit | 442c5cd3cfc67d3e10aa64d9f180ef94fb3597cf (patch) | |
tree | 8e99c0680777c47f8922f67a211874864f549334 /src | |
parent | f7f2e84a9c7d24fae4ac6fa3d3722039f2101e9c (diff) | |
download | sqlite-442c5cd3cfc67d3e10aa64d9f180ef94fb3597cf.tar.gz sqlite-442c5cd3cfc67d3e10aa64d9f180ef94fb3597cf.zip |
Call fsync() right after ftruncate() when in journal_mode=TRUNCATE and
when synchronous=FULL in order to ensure that transactions are durable
across a power loss that happens moments after the commit. Proposed
fix for [https://bugzilla.mozilla.org/show_bug.cgi?id=1072773].
FossilOrigin-Name: 3e922208b68563489c7766abb9afb4885113e7b8
Diffstat (limited to 'src')
-rw-r--r-- | src/pager.c | 8 |
1 files changed, 8 insertions, 0 deletions
diff --git a/src/pager.c b/src/pager.c index d3a36ef48..d840a39a1 100644 --- a/src/pager.c +++ b/src/pager.c @@ -1941,6 +1941,14 @@ static int pager_end_transaction(Pager *pPager, int hasMaster, int bCommit){ rc = SQLITE_OK; }else{ rc = sqlite3OsTruncate(pPager->jfd, 0); + if( rc==SQLITE_OK && pPager->fullSync ){ + /* Make sure the new file size is written into the inode right away. + ** Otherwise the journal might resurrect following a power loss and + ** cause the last transaction to roll back. See + ** https://bugzilla.mozilla.org/show_bug.cgi?id=1072773 + */ + rc = sqlite3OsSync(pPager->jfd, pPager->syncFlags); + } } pPager->journalOff = 0; }else if( pPager->journalMode==PAGER_JOURNALMODE_PERSIST |