From: danielk1977 Date: Thu, 20 Mar 2008 04:45:49 +0000 (+0000) Subject: Write the page-size into the first journal-header of each journal file. (CVS 4894) X-Git-Tag: version-3.6.10~1283 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=67c007bf4b549bf42d252241d62f35111a75c503;p=thirdparty%2Fsqlite.git Write the page-size into the first journal-header of each journal file. (CVS 4894) FossilOrigin-Name: 79f573cc7be89b3dd5540c45ef132b5cedc98e9b --- diff --git a/manifest b/manifest index 2d3b9900e8..9aaa3fc904 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Make\sout-of-tree\sbuilds\swork\sas\sexpected\swhen\susing\sconfigure\sscript\s(CVS\s4893) -D 2008-03-20T02:25:35 +C Write\sthe\spage-size\sinto\sthe\sfirst\sjournal-header\sof\seach\sjournal\sfile.\s(CVS\s4894) +D 2008-03-20T04:45:49 F Makefile.arm-wince-mingw32ce-gcc ac5f7b2cef0cd850d6f755ba6ee4ab961b1fadf7 F Makefile.in cf434ce8ca902e69126ae0f94fc9f7dc7428a5fa F Makefile.linux-gcc d53183f4aa6a9192d249731c90dbdffbd2c68654 @@ -129,7 +129,7 @@ F src/os_unix.c fdec4e5ee5dd555a6ad4a69f38ab35f0788536b4 F src/os_unix.h 5768d56d28240d3fe4537fac08cc85e4fb52279e F src/os_win.c 3a60bddd07ea6f8adb2314dd5996ac97b988f403 F src/os_win.h 41a946bea10f61c158ce8645e7646b29d44f122b -F src/pager.c ed2fc0ff7297001d17e299f976e9167f265ad2a6 +F src/pager.c d3448e060afc840be75b09c83501e5f8c13bac54 F src/pager.h 8174615ffd14ccc2cad2b081b919a398fa95e3f9 F src/parse.y 00f2698c8ae84f315be5e3f10b63c94f531fdd6d F src/pragma.c 09128fe3e2b5108d322a66b19a6f2974dac64479 @@ -254,6 +254,7 @@ F test/crash2.test 26d7a4c5520201e5de2c696ea51ab946b59dc0e9 F test/crash3.test 0b09687ae1a3ccbcefdfaeb4b963e26e36255d76 F test/crash4.test 02ff4f15c149ca1e88a5c299b4896c84d9450c3b F test/crash5.test c7ddcf7ca83abc19901b977732144234ac72a938 +F test/crash6.test 873d851c5ba2a46e0f9974c54e1d4a77d9a587d5 F test/crashtest1.c 09c1c7d728ccf4feb9e481671e29dda5669bbcc2 F test/createtab.test 199cf68f44e5d9e87a0b8afc7130fdeb4def3272 F test/date.test 8db95a0ba2c8f4c8762ce66859a036c51959a6be @@ -419,7 +420,7 @@ F test/pragma2.test 5364893491b9231dd170e3459bfc2e2342658b47 F test/printf.test c3405535b418d454e8a52196a0fc592ec9eec58d F test/progress.test 5b075c3c790c7b2a61419bc199db87aaf48b8301 x F test/ptrchng.test 83150cb7b513e33cce90fdc68f4b1817551857c0 -F test/quick.test 771a6b3a88fdd0e7e813ce013ceda29037bc9462 +F test/quick.test 3626d353162d0cfbe0959a73c5f9cf171c126091 F test/quote.test 215897dbe8de1a6f701265836d6601cc6ed103e6 F test/rdonly.test b34db316525440d3b42c32e83942c02c37d28ef0 F test/reindex.test 38b138abe36bf9a08c791ed44d9f76cd6b97b78b @@ -624,7 +625,7 @@ F www/tclsqlite.tcl 8be95ee6dba05eabcd27a9d91331c803f2ce2130 F www/vdbe.tcl 87a31ace769f20d3627a64fa1fade7fed47b90d0 F www/version3.tcl 890248cf7b70e60c383b0e84d77d5132b3ead42b F www/whentouse.tcl fc46eae081251c3c181bd79c5faef8195d7991a5 -P bee38c2dda50592fef5fedab01311d5486240b95 -R 04225780a6551fd57e8d1ce57e5e35c1 -U mlcreech -Z fbdd87a89edb04e0bf69569a65fa198b +P e2d05ea3c3e4a11bc1c0cc4c4403a445b9c2b64d +R d9620fbfa7ae750a021d54c765dbeee0 +U danielk1977 +Z 293afa007eb6b6cbc79715bcc09819d5 diff --git a/manifest.uuid b/manifest.uuid index 1c13b7a8f7..1d04a6ca07 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -e2d05ea3c3e4a11bc1c0cc4c4403a445b9c2b64d \ No newline at end of file +79f573cc7be89b3dd5540c45ef132b5cedc98e9b \ No newline at end of file diff --git a/src/pager.c b/src/pager.c index f9350673f3..5313404ccb 100644 --- a/src/pager.c +++ b/src/pager.c @@ -18,7 +18,7 @@ ** file simultaneously, or one process from reading the database while ** another is writing. ** -** @(#) $Id: pager.c,v 1.418 2008/03/19 14:15:35 drh Exp $ +** @(#) $Id: pager.c,v 1.419 2008/03/20 04:45:49 danielk1977 Exp $ */ #ifndef SQLITE_OMIT_DISKIO #include "sqliteInt.h" @@ -971,11 +971,12 @@ static void seekJournalHdr(Pager *pPager){ ** - 4 bytes: Random number used for page hash. ** - 4 bytes: Initial database page count. ** - 4 bytes: Sector size used by the process that wrote this journal. +** - 4 bytes: Database page size. ** -** Followed by (JOURNAL_HDR_SZ - 24) bytes of unused space. +** Followed by (JOURNAL_HDR_SZ - 28) bytes of unused space. */ static int writeJournalHdr(Pager *pPager){ - char zHeader[sizeof(aJournalMagic)+16]; + char zHeader[sizeof(aJournalMagic)+20]; int rc; if( pPager->stmtHdrOff==0 ){ @@ -1023,6 +1024,10 @@ static int writeJournalHdr(Pager *pPager){ put32bits(&zHeader[sizeof(aJournalMagic)+8], pPager->dbSize); /* The assumed sector size for this process */ put32bits(&zHeader[sizeof(aJournalMagic)+12], pPager->sectorSize); + if( pPager->journalHdr==0 ){ + /* The page size */ + put32bits(&zHeader[sizeof(aJournalMagic)+16], pPager->pageSize); + } IOTRACE(("JHDR %p %lld %d\n", pPager, pPager->journalHdr, sizeof(zHeader))) rc = sqlite3OsWrite(pPager->jfd, zHeader, sizeof(zHeader),pPager->journalOff); pPager->journalOff += JOURNAL_HDR_SZ(pPager); @@ -1062,6 +1067,7 @@ static int readJournalHdr( int rc; unsigned char aMagic[8]; /* A buffer to hold the magic header */ i64 jrnlOff; + int iPageSize; seekJournalHdr(pPager); if( pPager->journalOff+JOURNAL_HDR_SZ(pPager) > journalSize ){ @@ -1086,6 +1092,17 @@ static int readJournalHdr( rc = read32bits(pPager->jfd, jrnlOff+8, pDbSize); if( rc ) return rc; + rc = read32bits(pPager->jfd, jrnlOff+16, (u32 *)&iPageSize); + if( rc==SQLITE_OK + && iPageSize>=512 + && iPageSize<=SQLITE_MAX_PAGE_SIZE + && ((iPageSize-1)&iPageSize)==0 + ){ + u16 pagesize = iPageSize; + rc = sqlite3PagerSetPagesize(pPager, &pagesize); + } + if( rc ) return rc; + /* Update the assumed sector-size to match the value used by ** the process that created this journal. If this journal was ** created by a process other than this one, then this routine diff --git a/test/crash6.test b/test/crash6.test new file mode 100644 index 0000000000..1ebad58f42 --- /dev/null +++ b/test/crash6.test @@ -0,0 +1,115 @@ +# 2001 September 15 +# +# 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 tests that rollback journals for databases that use a +# page-size other than the default page-size can be rolled back Ok. +# +# $Id: crash6.test,v 1.1 2008/03/20 04:45:49 danielk1977 Exp $ + +set testdir [file dirname $argv0] +source $testdir/tester.tcl + +ifcapable !crashtest { + finish_test + return +} + +for {set ii 0} {$ii < 10} {incr ii} { + catch {db close} + file delete -force test.db test.db-journal + crashsql -delay 2 -file test.db { + PRAGMA auto_vacuum=OFF; + PRAGMA page_size=4096; + BEGIN; + CREATE TABLE abc AS SELECT 1 AS a, 2 AS b, 3 AS c; + COMMIT; + BEGIN; + CREATE TABLE def AS SELECT 1 AS d, 2 AS e, 3 AS f; + COMMIT; + } + sqlite3 db test.db + integrity_check crash6-1.$ii +} + +for {set ii 0} {$ii < 10} {incr ii} { + catch {db close} + file delete -force test.db test.db-journal + sqlite3 db test.db + execsql { + PRAGMA auto_vacuum=OFF; + PRAGMA page_size=2048; + BEGIN; + CREATE TABLE abc AS SELECT 1 AS a, 2 AS b, 3 AS c; + COMMIT; + } + db close + crashsql -delay 1 -file test.db { + INSERT INTO abc VALUES(5, 6, 7); + } + sqlite3 db test.db + integrity_check crash6-2.$ii +} + +proc signature {} { + return [db eval {SELECT count(*), md5sum(a), md5sum(b), md5sum(c) FROM abc}] +} + +# Test case for crashing during database sync with page-size values +# from 1024 to 8192. +# +for {set ii 0} {$ii < 30} {incr ii} { + db close + file delete -force test.db + sqlite3 db test.db + + set pagesize [expr 1024 << ($ii % 4)] + do_test crash6-3.$ii.0 { + execsql "pragma page_size = $pagesize" + execsql "pragma page_size" + } $pagesize + + do_test crash6-3.$ii.1 { + + execsql BEGIN + execsql {CREATE TABLE abc(a, b, c)} + for {set n 0} {$n < 1000} {incr n} { + execsql "INSERT INTO abc VALUES($n, [expr 2*$n], [expr 3*$n])" + } + execsql { + INSERT INTO abc SELECT * FROM abc; + INSERT INTO abc SELECT * FROM abc; + INSERT INTO abc SELECT * FROM abc; + INSERT INTO abc SELECT * FROM abc; + INSERT INTO abc SELECT * FROM abc; + } + execsql COMMIT + expr ([file size test.db] / 1024) > 450 + } {1} + + set sig [signature] + db close + + do_test crash6-3.$ii.2 { + crashsql -file test.db " + BEGIN; + SELECT random() FROM abc LIMIT $ii; + INSERT INTO abc SELECT randstr(10,10), 0, 0 FROM abc WHERE random()%2==0; + DELETE FROM abc WHERE random()%2!=0; + COMMIT; + " + } {1 {child process exited abnormally}} + + do_test crash6-3.$ii.3 { + sqlite3 db test.db + signature + } $sig +} + +finish_test diff --git a/test/quick.test b/test/quick.test index 7c4f371d06..5f8937a3dc 100644 --- a/test/quick.test +++ b/test/quick.test @@ -6,7 +6,7 @@ #*********************************************************************** # This file runs all tests. # -# $Id: quick.test,v 1.69 2008/01/16 18:20:42 danielk1977 Exp $ +# $Id: quick.test,v 1.70 2008/03/20 04:45:49 danielk1977 Exp $ proc lshift {lvar} { upvar $lvar l @@ -49,6 +49,7 @@ set EXCLUDE { crash2.test crash3.test crash4.test + crash6.test exclusive3.test fts3.test fuzz.test