Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | On atomic-write capable systems, if copying the contents of an in-memory journal to disk fails, close the (on disk) journal file before returning the error to the caller. This causes the subsequent rollback operation to use the in-memory journal. Fix for [df678d738adb]. |
---|---|
Downloads: | Tarball | ZIP archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA1: |
8183d8d7ae1ff4bad2fcc01adb923b96 |
User & Date: | dan 2012-12-18 11:59:39.046 |
Context
2012-12-18
| ||
13:12 | Remove old commented-out code from parse.y. Fix some over-length source lines in parse.y. No logical changes. (check-in: 7e30c021ab user: drh tags: trunk) | |
11:59 | On atomic-write capable systems, if copying the contents of an in-memory journal to disk fails, close the (on disk) journal file before returning the error to the caller. This causes the subsequent rollback operation to use the in-memory journal. Fix for [df678d738adb]. (check-in: 8183d8d7ae user: dan tags: trunk) | |
2012-12-14
| ||
17:54 | Optimize IN operators in the WHERE clause of queries using virtual tables. (check-in: 3d65c70343 user: drh tags: trunk) | |
Changes
Changes to src/journal.c.
︙ | ︙ | |||
54 55 56 57 58 59 60 61 62 63 64 65 66 67 | sqlite3_file *pReal = (sqlite3_file *)&p[1]; rc = sqlite3OsOpen(p->pVfs, p->zJournal, pReal, p->flags, 0); if( rc==SQLITE_OK ){ p->pReal = pReal; if( p->iSize>0 ){ assert(p->iSize<=p->nBuf); rc = sqlite3OsWrite(p->pReal, p->zBuf, p->iSize, 0); } } } return rc; } /* | > > > > > > > > | 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 | sqlite3_file *pReal = (sqlite3_file *)&p[1]; rc = sqlite3OsOpen(p->pVfs, p->zJournal, pReal, p->flags, 0); if( rc==SQLITE_OK ){ p->pReal = pReal; if( p->iSize>0 ){ assert(p->iSize<=p->nBuf); rc = sqlite3OsWrite(p->pReal, p->zBuf, p->iSize, 0); } if( rc!=SQLITE_OK ){ /* If an error occurred while writing to the file, close it before ** returning. This way, SQLite uses the in-memory journal data to ** roll back changes made to the internal page-cache before this ** function was called. */ sqlite3OsClose(pReal); p->pReal = 0; } } } return rc; } /* |
︙ | ︙ |
Added test/ioerr6.test.
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 | # 2012 December 18 # # The author disclaims copyright to this source code. In place of # a legal notice, here is a blessing: # # May you do good and not evil. # May you find forgiveness for yourself and forgive others. # May you share freely, never taking more than you give. # #*********************************************************************** # set testdir [file dirname $argv0] source $testdir/tester.tcl source $testdir/malloc_common.tcl set ::testprefix ioerr6 ifcapable !atomicwrite { puts "skipping tests - not compiled with SQLITE_ENABLE_ATOMIC_WRITE..." finish_test return } faultsim_save_and_close do_test 1.1 { testvfs shmfault -default true shmfault devchar atomic sqlite3 db test.db execsql { CREATE TABLE t1(a, b); CREATE INDEX i1 ON t1(a, b); INSERT INTO t1 VALUES(1, 2); INSERT INTO t1 VALUES(2, 4); INSERT INTO t1 VALUES(3, 6); INSERT INTO t1 VALUES(4, 8); } # Cause the first call to xWrite() to fail with SQLITE_FULL. shmfault full 2 1 catchsql { INSERT INTO t1 VALUES(5, 10) } } {1 {database or disk is full}} do_test 1.2 { execsql { PRAGMA integrity_check } } {ok} db close shmfault delete do_faultsim_test 2 -faults full* -prep { shmfault devchar atomic faultsim_restore sqlite3 db test.db } -body { db eval { CREATE TABLE t1(x PRIMARY KEY); INSERT INTO t1 VALUES('abc'); } } -test { set res [db one { PRAGMA integrity_check }] if {$res != "ok"} { error "integrity check: $res" } } do_faultsim_test 2 -faults full* -prep { shmfault devchar atomic faultsim_restore sqlite3 db test.db } -body { db eval { CREATE TABLE t1(x); CREATE TABLE t2(x); } } -test { db eval { CREATE TABLE t3(x) } if {[db one { PRAGMA integrity_check }] != "ok"} { error "integrity check failed" } } finish_test |