aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authordrh <drh@noemail.net>2014-10-21 21:56:06 +0000
committerdrh <drh@noemail.net>2014-10-21 21:56:06 +0000
commit442c5cd3cfc67d3e10aa64d9f180ef94fb3597cf (patch)
tree8e99c0680777c47f8922f67a211874864f549334 /src
parentf7f2e84a9c7d24fae4ac6fa3d3722039f2101e9c (diff)
downloadsqlite-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.c8
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