Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | Test that if a corrupt wal-index header is encountered when attempting to commit a concurrent transaction, SQLITE_BUSY_SNAPSHOT is returned to the caller. |
---|---|
Downloads: | Tarball | ZIP archive |
Timelines: | family | ancestors | descendants | both | begin-concurrent |
Files: | files | file ages | folders |
SHA1: |
c746e0bd20cb136eed2b691f326657d2 |
User & Date: | dan 2015-08-25 16:01:04.106 |
Context
2015-08-25
| ||
17:16 | If "PRAGMA integrity_check" is run while the database is being written by a CONCURRENT transaction, do not consider unreferenced pages to be an error. They may be part of the free-page list, which is not visible at the b-tree layer when running a CONCURRENT transaction. (check-in: f32b57b493 user: dan tags: begin-concurrent) | |
16:01 | Test that if a corrupt wal-index header is encountered when attempting to commit a concurrent transaction, SQLITE_BUSY_SNAPSHOT is returned to the caller. (check-in: c746e0bd20 user: dan tags: begin-concurrent) | |
14:37 | Fix a segfault that could occur following an OOM condition in the concurrent transaction code. (check-in: 231b588022 user: dan tags: begin-concurrent) | |
Changes
Changes to test/concurrent2.test.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | # 2015 July 26 # # 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/lock_common.tcl set ::testprefix concurrent2 ifcapable !concurrent { finish_test return } | > > > | 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 | # 2015 July 26 # # 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. # #*********************************************************************** # # Miscellaneous tests for transactions started with BEGIN CONCURRENT. # set testdir [file dirname $argv0] source $testdir/tester.tcl source $testdir/lock_common.tcl source $testdir/wal_common.tcl set ::testprefix concurrent2 ifcapable !concurrent { finish_test return } |
︙ | ︙ | |||
292 293 294 295 296 297 298 299 300 | do_test 6.$tn.4 { list [catch { sql1 COMMIT } msg] $msg } {1 {database is locked}} do_test 6.$tn.5 { sql3 { PRAGMA integrity_check } } {ok} do_test 6.$tn.5 { sql3 { SELECT count(*) from t1 } } {3} } finish_test | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 | do_test 6.$tn.4 { list [catch { sql1 COMMIT } msg] $msg } {1 {database is locked}} do_test 6.$tn.5 { sql3 { PRAGMA integrity_check } } {ok} do_test 6.$tn.5 { sql3 { SELECT count(*) from t1 } } {3} } #------------------------------------------------------------------------- # Test that if a corrupt wal-index-header is encountered when attempting # to commit a CONCURRENT transaction, the transaction is not committed # (or rolled back) and that SQLITE_BUSY_SNAPSHOT is returned to the user. # catch { db close } forcedelete test.db testvfs tvfs sqlite3 db test.db -vfs tvfs do_execsql_test 7.1 { PRAGMA journal_mode = wal; BEGIN; CREATE TABLE t1(a, b, PRIMARY KEY(a)); INSERT INTO t1 VALUES(1, 2); INSERT INTO t1 VALUES(3, 4); COMMIT; BEGIN CONCURRENT; INSERT INTO t1 VALUES(5, 6); INSERT INTO t1 VALUES(7, 8); SELECT * FROM t1; } {wal 1 2 3 4 5 6 7 8} # Corrupt the wal-index header incr_tvfs_hdr test.db 11 1 do_catchsql_test 7.2.1 { COMMIT } {1 {database is locked}} do_test 7.2.2 { sqlite3_extended_errcode db } SQLITE_BUSY_SNAPSHOT do_execsql_test 7.3.1 { SELECT * FROM t1; ROLLBACK; } {1 2 3 4 5 6 7 8} do_execsql_test 7.3.2 { SELECT * FROM t1; } {1 2 3 4} finish_test |
Changes to test/wal2.test.
︙ | ︙ | |||
30 31 32 33 34 35 36 | incr sqlite_sync_count $adj } { ifcapable !dirsync { incr sqlite_sync_count $adj } } } | < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < | 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | incr sqlite_sync_count $adj } { ifcapable !dirsync { incr sqlite_sync_count $adj } } } #------------------------------------------------------------------------- # Test case wal2-1.*: # # Set up a small database containing a single table. The database is not # checkpointed during the test - all content resides in the log file. # |
︙ | ︙ |
Changes to test/wal_common.tcl.
︙ | ︙ | |||
85 86 87 88 89 90 91 92 93 | upvar $hdrvar hdr set c1 0 set c2 0 wal_cksum_intlist c1 c2 [lrange $hdr 0 9] lset hdr 10 $c1 lset hdr 11 $c2 } | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 | upvar $hdrvar hdr set c1 0 set c2 0 wal_cksum_intlist c1 c2 [lrange $hdr 0 9] lset hdr 10 $c1 lset hdr 11 $c2 } # This command assumes that $file is the name of a database file opened # in wal mode using a [testvfs] VFS. It returns a list of the 12 32-bit # integers that make up the wal-index-header for the named file. # proc set_tvfs_hdr {file args} { # Set $nHdr to the number of bytes in the wal-index header: set nHdr 48 set nInt [expr {$nHdr/4}] if {[llength $args]>2} { error {wrong # args: should be "set_tvfs_hdr fileName ?val1? ?val2?"} } set blob [tvfs shm $file] if {$::tcl_platform(byteOrder)=="bigEndian"} {set fmt I} {set fmt i} if {[llength $args]} { set ia [lindex $args 0] set ib $ia if {[llength $args]==2} { set ib [lindex $args 1] } binary scan $blob a[expr $nHdr*2]a* dummy tail set blob [binary format ${fmt}${nInt}${fmt}${nInt}a* $ia $ib $tail] tvfs shm $file $blob } binary scan $blob ${fmt}${nInt} ints return $ints } proc incr_tvfs_hdr {file idx incrval} { set ints [set_tvfs_hdr $file] set v [lindex $ints $idx] incr v $incrval lset ints $idx $v set_tvfs_hdr $file $ints } |