From: dan Date: Wed, 29 Jan 2025 15:11:07 +0000 (+0000) Subject: If SQLITE_ENABLE_WAL2NOCKSUM is defined, then SQLite calculates the frame checksums... X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=2a8768ad662ee6223b6d0ae1a3632bd41ef7cefe;p=thirdparty%2Fsqlite.git If SQLITE_ENABLE_WAL2NOCKSUM is defined, then SQLite calculates the frame checksums used in wal2 mode based on the previous checksum and the frame header only, not the frame body only. This risks corruption following a OS crash or power failure, but also speeds up writes in wal2 mode. FossilOrigin-Name: dc74bd8915a9e1a915fb4ff3229a7b5e8f89486fe1df812a7738f6627d379648 --- diff --git a/main.mk b/main.mk index 629d470e2e..b6916c2e85 100644 --- a/main.mk +++ b/main.mk @@ -836,8 +836,6 @@ TESTSRC2 = \ $(TOP)/ext/fts3/fts3_write.c \ $(TOP)/ext/misc/stmt.c \ $(TOP)/ext/session/sqlite3session.c \ - $(TOP)/ext/session/sqlite3changebatch.c \ - $(TOP)/ext/session/test_session.c \ fts5.c # Header files used by all library source files. diff --git a/manifest b/manifest index 35c554c0b9..fd35b17d9a 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Version\s3.48.0\sfor\sthe\sbedrock\sbranch -D 2025-01-14T12:28:43.665 +C If\sSQLITE_ENABLE_WAL2NOCKSUM\sis\sdefined,\sthen\sSQLite\scalculates\sthe\sframe\schecksums\sused\sin\swal2\smode\sbased\son\sthe\sprevious\schecksum\sand\sthe\sframe\sheader\sonly,\snot\sthe\sframe\sbody\sonly.\sThis\srisks\scorruption\sfollowing\sa\sOS\scrash\sor\spower\sfailure,\sbut\salso\sspeeds\sup\swrites\sin\swal2\smode. +D 2025-01-29T15:11:07.802 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -708,7 +708,7 @@ F ext/wasm/tests/opfs/concurrency/test.js d08889a5bb6e61937d0b8cbb78c9efbefbf65a F ext/wasm/tests/opfs/concurrency/worker.js 0a8c1a3e6ebb38aabbee24f122693f1fb29d599948915c76906681bb7da1d3d2 F ext/wasm/wasmfs.make bc8bb227f35d5bd3863a7bd2233437c37472a0d81585979f058f9b9b503bef35 F magic.txt 5ade0bc977aa135e79e3faaea894d5671b26107cc91e70783aa7dc83f22f3ba0 -F main.mk 8220d7e38f112841a908cc4a00a5e8ddbbe901cfc76dfd3e5ea3d63ca846d87e +F main.mk 246580165715eefcb0b063bd58d58e05f179a2c05009caa542f17b222b91fb78 F mptest/config01.test 3c6adcbc50b991866855f1977ff172eb6d901271 F mptest/config02.test 4415dfe36c48785f751e16e32c20b077c28ae504 F mptest/crash01.test 61e61469e257df0850df4293d7d4d6c2af301421 @@ -810,7 +810,7 @@ F src/test_backup.c bd901e3c116c7f3b3bbbd4aae4ce87d99b400c9cbb0a9e7b4610af451d97 F src/test_bestindex.c 3401bee51665cbf7f9ed2552b5795452a8b86365e4c9ece745b54155a55670c6 F src/test_blob.c bcdf6a6c22d0bcc13c41479d63692ef413add2a4d30e1e26b9f74ab85b9fb4d5 F src/test_btree.c 28283787d32b8fa953eb77412ad0de2c9895260e4e5bd5a94b3c7411664f90d5 -F src/test_config.c 872eb3cab4573b8b9512454bf11bc68092a2b61cffd9b16465414c70a3357d8a +F src/test_config.c a684b7c4b6fdf0da87dcd052bb93fa499e7859120b5963972923abd98f31a2e1 F src/test_delete.c e2fe07646dff6300b48d49b2fee2fe192ed389e834dd635e3b3bac0ce0bf9f8f F src/test_demovfs.c 3efa2adf4f21e10d95521721687d5ca047aea91fa62dd8cc22ac9e5a9c942383 F src/test_devsym.c 649434ed34d0b03fbd5a6b42df80f0f9a7e53f94dd1710aad5dd8831e91c4e86 @@ -867,7 +867,7 @@ F src/vdbetrace.c fe0bc29ebd4e02c8bc5c1945f1d2e6be5927ec12c06d89b03ef2a4def34bf8 F src/vdbevtab.c fc46b9cbd759dc013f0b3724549cc0d71379183c667df3a5988f7e2f1bd485f3 F src/vtab.c 316cd48e9320660db3047cd306cd056e4361180cebb4d0f10a39244e10c11422 F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 -F src/wal.c 964c785ac8324de1ae742c44aa72ddd4401d4abab11ef6999aec21d7221b3e67 +F src/wal.c f552156ce5f8392b224d56fe99a49e1667cab8429c2b430eed9deaa23abd1542 F src/wal.h 8d02ab8c2a93a941f5898eb3345bf711c1d3f8f86f4be8d5428fb6c074962d8a F src/walker.c d5006d6b005e4ea7302ad390957a8d41ed83faa177e412f89bc5600a7462a014 F src/where.c 604f17baed46f4997ffe79f25c07c4b51a4165a5938cc27fe165c7e1ca485d11 @@ -2020,7 +2020,7 @@ F test/wal2fault.test 2e8e60cacd5bcd451618aeffd05f676894d17202d3e2986e288d36e2c5 F test/wal2lock.test 0ef98d72dc6bcf7711dedd684760488400d9a9a6eec0dc5d3822060437793552 F test/wal2openclose.test 2b26be723ea7f4263c8d5d70b37efd1c359561a0526e39466c45fe8e6478daee F test/wal2recover.test 348a3f2a4c79359790f70fd692dcd0c8f04e42a85365e688778c945e10bae02b -F test/wal2recover2.test a7eece9892b125ef92343bba9e06edd5f6ad20c548dcbf79e3f2ab759f31ef84 +F test/wal2recover2.test e849fc5a202ae49dc561a3d47270accf159227c9e7663594fab0eac212480d28 F test/wal2recover3.test 4a91689e165a38bc401736e6518188c2b0ff4fa1566d1810b8867536db128177 F test/wal2rewrite.test 6ca6f631ffcf871240beab5f02608913fd075c6d0d31310b026c8383c65c9f9c F test/wal2rollback.test 23adc4a099b23f6aaea8b04fdca1c35861d887dd80f8be7da2d5273eb777e428 @@ -2242,8 +2242,9 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 4b9497cffa3397f6dd498b9a9145ebee6fcfcc175c75aa6f922ad635619f3e24 ef970ef037ed2271324593a46342547979ce31bcfbc8ca65930f0e51083a9e6a -R 512162a74cf573fb37124d22bab2f3c1 -U drh -Z dd3562b4e97e09b9d7d50446541cf947 +P fab341c8295545739cdce8b71e38ead68cb80a6f836f7ec0540b387f17b6cbe2 +Q +4d3706727005397c3c9006b9ad9a2645b09533b02735ea68974c4f2df4c2e853 +R 474ce037ad8c9757d8c8e66f75356bf2 +U dan +Z 363c756be7599a910bd16bdd6751a132 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 4665624774..513952cd5d 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -fab341c8295545739cdce8b71e38ead68cb80a6f836f7ec0540b387f17b6cbe2 +dc74bd8915a9e1a915fb4ff3229a7b5e8f89486fe1df812a7738f6627d379648 diff --git a/src/test_config.c b/src/test_config.c index cc233532f3..7167aaad3b 100644 --- a/src/test_config.c +++ b/src/test_config.c @@ -781,6 +781,12 @@ Tcl_SetVar2(interp, "sqlite_options", "mergesort", "1", TCL_GLOBAL_ONLY); Tcl_SetVar2(interp, "sqlite_options", "normalize", "0", TCL_GLOBAL_ONLY); #endif +#ifdef SQLITE_ENABLE_WAL2NOCKSUM + Tcl_SetVar2(interp, "sqlite_options", "wal2nocksum", "1", TCL_GLOBAL_ONLY); +#else + Tcl_SetVar2(interp, "sqlite_options", "wal2nocksum", "0", TCL_GLOBAL_ONLY); +#endif + #ifdef SQLITE_OMIT_WINDOWFUNC Tcl_SetVar2(interp, "sqlite_options", "windowfunc", "0", TCL_GLOBAL_ONLY); #else diff --git a/src/wal.c b/src/wal.c index fc0a24510f..0f4150cd97 100644 --- a/src/wal.c +++ b/src/wal.c @@ -461,6 +461,17 @@ int sqlite3WalTrace = 0; #define WAL_VERSION1 3007000 /* For "journal_mode=wal" */ #define WAL_VERSION2 3021000 /* For "journal_mode=wal2" */ +#ifdef SQLITE_ENABLE_WAL2NOCKSUM +# undef WAL_VERSION2 +# define WAL_VERSION2 3048000 /* For "journal_mode=wal2" sans checksums */ + +# define isNocksum(pWal) isWalMode2(pWal) +#else +# define isNocksum(pWal) 0 +#endif + + + /* ** Index numbers for various locking bytes. WAL_NREADER is the number @@ -1240,10 +1251,13 @@ static void walEncodeFrame( nativeCksum = (pWal->hdr.bigEndCksum==SQLITE_BIGENDIAN); walChecksumBytes(nativeCksum, aFrame, 8, aCksum, aCksum); - walChecksumBytes(nativeCksum, aData, pWal->szPage, aCksum, aCksum); + if( isNocksum(pWal)==0 ){ + walChecksumBytes(nativeCksum, aData, pWal->szPage, aCksum, aCksum); + } sqlite3Put4byte(&aFrame[16], aCksum[0]); sqlite3Put4byte(&aFrame[20], aCksum[1]); + }else{ memset(&aFrame[8], 0, 16); } @@ -1287,7 +1301,9 @@ static int walDecodeFrame( */ nativeCksum = (pWal->hdr.bigEndCksum==SQLITE_BIGENDIAN); walChecksumBytes(nativeCksum, aFrame, 8, aCksum, aCksum); - walChecksumBytes(nativeCksum, aData, pWal->szPage, aCksum, aCksum); + if( isNocksum(pWal)==0 ){ + walChecksumBytes(nativeCksum, aData, pWal->szPage, aCksum, aCksum); + } if( aCksum[0]!=sqlite3Get4byte(&aFrame[16]) || aCksum[1]!=sqlite3Get4byte(&aFrame[20]) ){ @@ -5110,10 +5126,21 @@ static int walWriteOneFrame( pData = pPage->pData; walEncodeFrame(p->pWal, pPage->pgno, nTruncate, pData, aFrame); - rc = walWriteToLog(p, aFrame, sizeof(aFrame), iOffset); - if( rc ) return rc; + + if( isNocksum(p->pWal)==0 ){ + /* Write the header in normal mode */ + rc = walWriteToLog(p, aFrame, sizeof(aFrame), iOffset); + if( rc ) return rc; + } + /* Write the page data */ rc = walWriteToLog(p, pData, p->szPage, iOffset+sizeof(aFrame)); + + if( isNocksum(p->pWal) ){ + /* Write the header in no-checksum mode */ + if( rc ) return rc; + rc = walWriteToLog(p, aFrame, sizeof(aFrame), iOffset); + } return rc; } diff --git a/test/wal2recover2.test b/test/wal2recover2.test index 50a2fcf083..6807612c95 100644 --- a/test/wal2recover2.test +++ b/test/wal2recover2.test @@ -85,8 +85,10 @@ proc fix_wal_cksums {file} { set e [hexio_read $file $off 8] set cksum [cksum $cksum $e] - set p [hexio_read $file [expr $off+24] $pgsz] - set cksum [cksum $cksum $p] + ifcapable !wal2nocksum { + set p [hexio_read $file [expr $off+24] $pgsz] + set cksum [cksum $cksum $p] + } hexio_write $file [expr $off+8] $salt hexio_write $file [expr $off+16] $cksum @@ -129,6 +131,11 @@ proc wal_set_follow {file prevfile} { fix_wal_cksums $file } +do_execsql_test 1.3.0 { + SELECT sum(x) FROM t1; + SELECT sum(x) FROM t2; +} [list $H $M] + foreach {tn file field} { 1 test.db2-wal salt0 2 test.db2-wal salt1 @@ -296,7 +303,15 @@ do_test 2.1 { forcecopy test.db-wal2 test.db2-wal forcecopy test.db-wal test.db2-wal2 - hexio_write test.db2-wal 5000 1234567890 + ifcapable wal2nocksum { + # With wal2nocksum set, each frame checksum is calculated based on the + # previous checksum and the contents of the first 8 bytes of the frame + # header. So to get the behaviour the test requires we need to mess up + # the frame header, not the body. Hence 4224 instead of 5000. + hexio_write test.db2-wal 4224 1234567890 + } else { + hexio_write test.db2-wal 5000 1234567890 + } } {5} do_test 2.2 {