Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | Add tests cases for recovery in wal2 mode. |
---|---|
Downloads: | Tarball | ZIP archive |
Timelines: | family | ancestors | descendants | both | wal2 |
Files: | files | file ages | folders |
SHA3-256: |
34f56f8a4239781071edf6317723d0a7 |
User & Date: | dan 2018-12-13 16:26:43.514 |
Context
2018-12-14
| ||
19:53 | Add further tests for wal2 mode. (check-in: 54e628f902 user: dan tags: wal2) | |
2018-12-13
| ||
16:26 | Add tests cases for recovery in wal2 mode. (check-in: 34f56f8a42 user: dan tags: wal2) | |
2018-12-12
| ||
20:39 | Add new test file wal2big.test. (check-in: e3e50bcdab user: dan tags: wal2) | |
Changes
Changes to src/wal.c.
︙ | ︙ | |||
1652 1653 1654 1655 1656 1657 1658 | if( rc==SQLITE_OK ){ volatile WalCkptInfo *pInfo; if( isOpen(pWal->apWalFd[1]) ){ /* The case where *-wal2 may follow *-wal */ if( nCkpt2<=0x0F && nCkpt2==nCkpt1+1 ){ if( sqlite3Get4byte((u8*)(&pWal->hdr.aSalt[0]))==hdr.aFrameCksum[0] | | | | 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 | if( rc==SQLITE_OK ){ volatile WalCkptInfo *pInfo; if( isOpen(pWal->apWalFd[1]) ){ /* The case where *-wal2 may follow *-wal */ if( nCkpt2<=0x0F && nCkpt2==nCkpt1+1 ){ if( sqlite3Get4byte((u8*)(&pWal->hdr.aSalt[0]))==hdr.aFrameCksum[0] && sqlite3Get4byte((u8*)(&pWal->hdr.aSalt[1]))==hdr.aFrameCksum[1] ){ walidxSetFile(&pWal->hdr, 1); walidxSetMxFrame(&pWal->hdr, 1, pWal->hdr.mxFrame); walidxSetMxFrame(&pWal->hdr, 0, hdr.mxFrame); }else{ pWal->hdr = hdr; } }else |
︙ | ︙ | |||
1711 1712 1713 1714 1715 1716 1717 | /* If more than one frame was recovered from the log file, report an ** event via sqlite3_log(). This is to help with identifying performance ** problems caused by applications routinely shutting down without ** checkpointing the log file. */ if( pWal->hdr.nPage ){ if( isWalMode2(pWal) ){ sqlite3_log(SQLITE_NOTICE_RECOVER_WAL, | | | | 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 | /* If more than one frame was recovered from the log file, report an ** event via sqlite3_log(). This is to help with identifying performance ** problems caused by applications routinely shutting down without ** checkpointing the log file. */ if( pWal->hdr.nPage ){ if( isWalMode2(pWal) ){ sqlite3_log(SQLITE_NOTICE_RECOVER_WAL, "recovered (%d,%d) frames from WAL files %s[2] (wal2 mode)", walidxGetMxFrame(&pWal->hdr, 0), walidxGetMxFrame(&pWal->hdr, 1), pWal->zWalName ); }else{ sqlite3_log(SQLITE_NOTICE_RECOVER_WAL, "recovered %d frames from WAL file %s", pWal->hdr.mxFrame, pWal->zWalName ); } |
︙ | ︙ |
Changes to test/wal2big.test.
︙ | ︙ | |||
39 40 41 42 43 44 45 | do_execsql_test 1.1 { WITH s(i) AS ( SELECT 1 UNION ALL SELECT i+1 FROM s WHERE i<200000 ) INSERT INTO t1 SELECT random(), random(), random() FROM s; } | | | > > > > > > > > > > > > | 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 | do_execsql_test 1.1 { WITH s(i) AS ( SELECT 1 UNION ALL SELECT i+1 FROM s WHERE i<200000 ) INSERT INTO t1 SELECT random(), random(), random() FROM s; } do_test 1.2 { list [expr [file size test.db-wal]>10000000] \ [expr [file size test.db-wal2]>10000000] } {1 1} do_test 1.3 { sqlite3 db2 test.db execsql { SELECT count(*) FROM t1; PRAGMA integrity_check; } db2 } {400000 ok} do_test 1.4 { db2 close forcecopy test.db test.db2 forcecopy test.db-wal test.db2-wal forcecopy test.db-wal2 test.db2-wal2 sqlite3 db2 test.db2 execsql { SELECT count(*) FROM t1; PRAGMA integrity_check; } } {400000 ok} finish_test |
Added test/wal2recover.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 84 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 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 | # 2018 December 13 # # 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. # #*********************************************************************** # This file implements regression tests for SQLite library. The # focus of this file is testing the operation of the library in # "PRAGMA journal_mode=WAL2" mode. # set testdir [file dirname $argv0] source $testdir/tester.tcl source $testdir/lock_common.tcl source $testdir/malloc_common.tcl source $testdir/wal_common.tcl set testprefix wal2recover ifcapable !wal {finish_test ; return } proc db_copy {from to} { forcecopy $from $to forcecopy ${from}-wal ${to}-wal forcecopy ${from}-wal2 ${to}-wal2 } do_execsql_test 1.0 { CREATE TABLE t1(a, b, c); CREATE INDEX t1a ON t1(a); CREATE INDEX t1b ON t1(b); CREATE INDEX t1c ON t1(c); PRAGMA journal_mode = wal2; PRAGMA journal_size_limit = 15000; PRAGMA wal_autocheckpoint = 0; } {wal2 15000 0} do_test 1.1 { for {set i 1} {$i <= 1000} {incr i} { execsql { INSERT INTO t1 VALUES(random(), random(), random()) } db_copy test.db test.db2 sqlite3 db2 test.db set res [execsql { SELECT count(*) FROM t1; PRAGMA integrity_check; } db2] db2 close if {$res != [list $i ok]} { error "failure on iteration $i" } } set {} {} } {} #-------------------------------------------------------------------------- reset_db do_execsql_test 2.0 { CREATE TABLE t1(x UNIQUE); CREATE TABLE t2(x UNIQUE); PRAGMA journal_mode = wal2; PRAGMA journal_size_limit = 10000; PRAGMA wal_autocheckpoint = 0; BEGIN; INSERT INTO t1 VALUES(randomblob(4000)); INSERT INTO t1 VALUES(randomblob(4000)); INSERT INTO t1 VALUES(randomblob(4000)); COMMIT; BEGIN; INSERT INTO t2 VALUES(randomblob(4000)); INSERT INTO t2 VALUES(randomblob(4000)); INSERT INTO t2 VALUES(randomblob(4000)); COMMIT; } {wal2 10000 0} do_test 2.0.1 { list [file size test.db] [file size test.db-wal] [file size test.db-wal2] } {5120 28328 28328} # Test recovery with both wal files intact. # do_test 2.1 { db_copy test.db test.db2 sqlite3 db2 test.db2 execsql { SELECT count(*) FROM t1; SELECT count(*) FROM t2; PRAGMA integrity_check; } db2 } {3 3 ok} do_test 2.2 { db2 close db_copy test.db test.db2 hexio_write test.db2-wal 16 12345678 sqlite3 db2 test.db2 execsql { SELECT count(*) FROM t1; SELECT count(*) FROM t2; } db2 } {0 3} do_test 2.3 { db2 close db_copy test.db test.db2 hexio_write test.db2-wal2 16 12345678 sqlite3 db2 test.db2 execsql { SELECT count(*) FROM t1; SELECT count(*) FROM t2; PRAGMA integrity_check; } db2 } {3 0 ok} do_test 2.4 { db2 close db_copy test.db test.db2 forcecopy test.db-wal test.db2-wal2 sqlite3 db2 test.db2 execsql { SELECT count(*) FROM t1; SELECT count(*) FROM t2; PRAGMA integrity_check; } db2 } {3 0 ok} do_test 2.5 { db2 close db_copy test.db test.db2 forcecopy test.db-wal test.db2-wal2 forcecopy test.db-wal2 test.db2-wal sqlite3 db2 test.db2 execsql { SELECT count(*) FROM t1; SELECT count(*) FROM t2; PRAGMA integrity_check; } db2 } {3 3 ok} do_test 2.6 { db2 close db_copy test.db test.db2 forcecopy test.db-wal test.db2-wal2 close [open test.db-wal w] sqlite3 db2 test.db2 execsql { SELECT count(*) FROM t1; SELECT count(*) FROM t2; PRAGMA integrity_check; } db2 } {3 0 ok} do_test 2.7 { db2 close db_copy test.db test.db2 forcedelete test.db2-wal sqlite3 db2 test.db2 execsql { SELECT count(*) FROM t1; SELECT count(*) FROM t2; PRAGMA integrity_check; } db2 } {0 0 ok} finish_test |