From 7204db1f61d017152f4f288d61934bea091715f1 Mon Sep 17 00:00:00 2001 From: dan Date: Fri, 13 Dec 2024 20:18:29 +0000 Subject: [PATCH 1/4] Fix a problem with the output of "PRAGMA wal_checkpoint" introduced long ago by [63483e22c775183e]. FossilOrigin-Name: c5f7bba8683a9aa503750abb7fd937566983dc1ca08361eca8b9b185294b909a --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/wal.c | 4 +--- test/wal2simple.test | 16 ++++++++++++++++ 4 files changed, 26 insertions(+), 12 deletions(-) diff --git a/manifest b/manifest index 7c531c605e..ed4b67285c 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Update\sthe\swal2\sbranch\swith\sthe\slatest\strunk\senhancements\sand\sfixes. -D 2024-12-07T23:24:17.824 +C Fix\sa\sproblem\swith\sthe\soutput\sof\s"PRAGMA\swal_checkpoint"\sintroduced\slong\sago\sby\s[63483e22c775183e]. +D 2024-12-13T20:18:29.915 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -860,7 +860,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 70d127be90923ec33cc53f7206d947173f1e4e4a98b34115d92861e1584e36ef +F src/wal.c c80108214438d8112963ac4a28e2ddfb92fc993b33bf25fdc77440e30ff6c268 F src/wal.h 97b8a9903387401377b59507e86b93a148ef1ad4e5ce0f23659a12dcdce56af2 F src/walker.c d5006d6b005e4ea7302ad390957a8d41ed83faa177e412f89bc5600a7462a014 F src/where.c b34adb09fdb2a4f57a0bafd4194b501047ef383976fef9f0ac3f395f4881694d @@ -2003,7 +2003,7 @@ F test/wal2recover3.test 4a91689e165a38bc401736e6518188c2b0ff4fa1566d1810b886753 F test/wal2rewrite.test 6ca6f631ffcf871240beab5f02608913fd075c6d0d31310b026c8383c65c9f9c F test/wal2rollback.test 23adc4a099b23f6aaea8b04fdca1c35861d887dd80f8be7da2d5273eb777e428 F test/wal2savepoint.test c380512ec1f97012cfc753e718bf3df38f51e7c319110e1cae25094a33b371c4 -F test/wal2simple.test 320a08927f307d0ead26fa3fcef4e3f64279f49be9504f918cb33294f75aeec8 +F test/wal2simple.test 2aaf8d81e889035e6021369bec45758f89ac3a13ae7bcefc111ea1aabe3f9cfd F test/wal2snapshot.test 7a5f4629a3c43a43c3440b8b2ea9f07de91a46b0b9eea5f08f62b5bf5b6468df F test/wal3.test 5de023bb862fd1eb9d2ad26fa8d9c43abb5370582e5b08b2ae0d6f93661bc310 F test/wal4.test 4744e155cd6299c6bd99d3eab1c82f77db9cdb3c @@ -2216,8 +2216,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 9591ab7c6b9bf70d33607c3dc8e319906d537c13c8e6b853b294e941581bcfe1 fc6904a508eb732b1cb5cc12321a0d637d97e1e066a022a2c93cb50595f3a86a -R 716accb182792985409c3e9a8fb0b506 -U drh -Z 936f7b3be32146f67ad3db2a80519bfd +P d3ce95f7e0335b8522a1805ab602b64856ced3007c507ba42039c6183ef9ac3d +R ee2cfb61cc5fc78106af5b84f79ac024 +U dan +Z 2ab193829137f4720a5ca440c0e08d93 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 32b54b3113..4d9fe6678e 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -d3ce95f7e0335b8522a1805ab602b64856ced3007c507ba42039c6183ef9ac3d +c5f7bba8683a9aa503750abb7fd937566983dc1ca08361eca8b9b185294b909a diff --git a/src/wal.c b/src/wal.c index 4bae7e1527..5f43689f8f 100644 --- a/src/wal.c +++ b/src/wal.c @@ -5175,8 +5175,6 @@ int sqlite3WalCheckpoint( /* Copy data from the log to the database file. */ if( rc==SQLITE_OK ){ - int iCkpt = walidxGetFile(&pWal->hdr); - if( (walPagesize(pWal)!=nBuf) && ((pWal->hdr.mxFrame2 & 0x7FFFFFFF) || pWal->hdr.mxFrame) ){ @@ -5195,7 +5193,7 @@ int sqlite3WalCheckpoint( if( pnCkpt ){ if( isWalMode2(pWal) ){ if( (int)(walCkptInfo(pWal)->nBackfill) ){ - *pnCkpt = walidxGetMxFrame(&pWal->hdr, iCkpt); + *pnCkpt = walidxGetMxFrame(&pWal->hdr,!walidxGetFile(&pWal->hdr)); }else{ *pnCkpt = 0; } diff --git a/test/wal2simple.test b/test/wal2simple.test index e63f4e1759..3ccd4b91a4 100644 --- a/test/wal2simple.test +++ b/test/wal2simple.test @@ -470,6 +470,22 @@ do_test 7.5.4 { list [file size test.db-wal] [file size test.db-wal2] [file size test.db] } {22040 12608 87040} +#------------------------------------------------------------------------- +reset_db +do_execsql_test 9.0 { + PRAGMA journal_size_limit = 10000; + PRAGMA journal_mode = wal2; + CREATE TABLE t1(x); + INSERT INTO t1 VALUES( hex( randomblob(5000) ) ); + INSERT INTO t1 VALUES( hex( randomblob(5000) ) ); + INSERT INTO t1 VALUES( hex( randomblob(5000) ) ); + INSERT INTO t1 VALUES( hex( randomblob(5000) ) ); +} {10000 wal2} + +do_execsql_test 9.1 { + PRAGMA wal_checkpoint; +} {0 50 13} + finish_test From 52660d4d37ea9d530a3867f12240e0fc1349904f Mon Sep 17 00:00:00 2001 From: dan Date: Sat, 14 Dec 2024 16:41:39 +0000 Subject: [PATCH 2/4] Do not attempt to switch wal files when writing if the current transaction read from both wal files. This fix is already on branch 'bedrock'. FossilOrigin-Name: 693cc8e8db6c00249211bdfc21be2bff169ca6b0c4560522dd404615e8ba3b76 --- manifest | 14 +++++------ manifest.uuid | 2 +- src/wal.c | 56 +++++++++++++++++++++++++++----------------- test/wal2simple.test | 27 ++++++++++++++++++++- 4 files changed, 69 insertions(+), 30 deletions(-) diff --git a/manifest b/manifest index ed4b67285c..658424d0a6 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sproblem\swith\sthe\soutput\sof\s"PRAGMA\swal_checkpoint"\sintroduced\slong\sago\sby\s[63483e22c775183e]. -D 2024-12-13T20:18:29.915 +C Do\snot\sattempt\sto\sswitch\swal\sfiles\swhen\swriting\sif\sthe\scurrent\stransaction\sread\sfrom\sboth\swal\sfiles.\sThis\sfix\sis\salready\son\sbranch\s'bedrock'. +D 2024-12-14T16:41:39.812 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -860,7 +860,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 c80108214438d8112963ac4a28e2ddfb92fc993b33bf25fdc77440e30ff6c268 +F src/wal.c 42f0823a65218643d213633b52e2a80ca70b193f6f7802c6edb040448860e9e8 F src/wal.h 97b8a9903387401377b59507e86b93a148ef1ad4e5ce0f23659a12dcdce56af2 F src/walker.c d5006d6b005e4ea7302ad390957a8d41ed83faa177e412f89bc5600a7462a014 F src/where.c b34adb09fdb2a4f57a0bafd4194b501047ef383976fef9f0ac3f395f4881694d @@ -2003,7 +2003,7 @@ F test/wal2recover3.test 4a91689e165a38bc401736e6518188c2b0ff4fa1566d1810b886753 F test/wal2rewrite.test 6ca6f631ffcf871240beab5f02608913fd075c6d0d31310b026c8383c65c9f9c F test/wal2rollback.test 23adc4a099b23f6aaea8b04fdca1c35861d887dd80f8be7da2d5273eb777e428 F test/wal2savepoint.test c380512ec1f97012cfc753e718bf3df38f51e7c319110e1cae25094a33b371c4 -F test/wal2simple.test 2aaf8d81e889035e6021369bec45758f89ac3a13ae7bcefc111ea1aabe3f9cfd +F test/wal2simple.test 471f6d404c19b94968ef4c74566914e544d31c5fa0afc8f1b31af117d7014a8b F test/wal2snapshot.test 7a5f4629a3c43a43c3440b8b2ea9f07de91a46b0b9eea5f08f62b5bf5b6468df F test/wal3.test 5de023bb862fd1eb9d2ad26fa8d9c43abb5370582e5b08b2ae0d6f93661bc310 F test/wal4.test 4744e155cd6299c6bd99d3eab1c82f77db9cdb3c @@ -2216,8 +2216,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P d3ce95f7e0335b8522a1805ab602b64856ced3007c507ba42039c6183ef9ac3d -R ee2cfb61cc5fc78106af5b84f79ac024 +P c5f7bba8683a9aa503750abb7fd937566983dc1ca08361eca8b9b185294b909a +R 9126283d88fd2ef1f08bb80d8fab9c01 U dan -Z 2ab193829137f4720a5ca440c0e08d93 +Z 875bffc535ab8b30264831dbcb04504f # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 4d9fe6678e..6c7c0600cb 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -c5f7bba8683a9aa503750abb7fd937566983dc1ca08361eca8b9b185294b909a +693cc8e8db6c00249211bdfc21be2bff169ca6b0c4560522dd404615e8ba3b76 diff --git a/src/wal.c b/src/wal.c index 5f43689f8f..987eed318d 100644 --- a/src/wal.c +++ b/src/wal.c @@ -4593,32 +4593,46 @@ static int walRestartLog(Wal *pWal){ int iApp = walidxGetFile(&pWal->hdr); u32 nWalSize = WAL_DEFAULT_WALSIZE; if( pWal->mxWalSize>0 ){ + /* mxWalSize is in bytes. Convert this to a number of frames. */ nWalSize = (pWal->mxWalSize-WAL_HDRSIZE+pWal->szPage+WAL_FRAME_HDRSIZE-1) / (pWal->szPage+WAL_FRAME_HDRSIZE); nWalSize = MAX(nWalSize, 1); } - if( walidxGetMxFrame(&pWal->hdr, iApp)>=nWalSize ){ - volatile WalCkptInfo *pInfo = walCkptInfo(pWal); - u32 mxFrame = walidxGetMxFrame(&pWal->hdr, !iApp); - if( mxFrame==0 || pInfo->nBackfill ){ - rc = wal2RestartOk(pWal, iApp); - if( rc==SQLITE_OK ){ - int iNew = !iApp; - pWal->nCkpt++; - walidxSetFile(&pWal->hdr, iNew); - walidxSetMxFrame(&pWal->hdr, iNew, 0); - sqlite3Put4byte((u8*)&pWal->hdr.aSalt[0], pWal->hdr.aFrameCksum[0]); - sqlite3Put4byte((u8*)&pWal->hdr.aSalt[1], pWal->hdr.aFrameCksum[1]); - walIndexWriteHdr(pWal); - pInfo->nBackfill = 0; - wal2RestartFinished(pWal, iApp); - walUnlockShared(pWal, WAL_READ_LOCK(pWal->readLock)); - pWal->readLock = iNew ? WAL_LOCK_PART2_FULL1 : WAL_LOCK_PART1_FULL2; - rc = walLockShared(pWal, WAL_READ_LOCK(pWal->readLock)); - }else if( rc==SQLITE_BUSY ){ - rc = SQLITE_OK; - } + assert( iApp==0 || pWal->readLock==WAL_LOCK_PART2 + || pWal->readLock==WAL_LOCK_PART2_FULL1 ); + assert( iApp==1 || pWal->readLock==WAL_LOCK_PART1 + || pWal->readLock==WAL_LOCK_PART1_FULL2 ); + + /* Switch to wal file !iApp if + ** + ** (a) Wal file iApp (the current wal file) contains >= nWalSize frames. + ** (b) This client is not reading from wal file !iApp. + ** (c) No other client is reading from wal file !iApp. + ** + ** Condition (b) guarantees that wal file !iApp is either empty or + ** completely checkpointed. + */ + if( (pWal->readLock==WAL_LOCK_PART1 || pWal->readLock==WAL_LOCK_PART2) + && walidxGetMxFrame(&pWal->hdr, iApp)>=nWalSize + ){ + rc = wal2RestartOk(pWal, iApp); + if( rc==SQLITE_OK ){ + volatile WalCkptInfo *pInfo = walCkptInfo(pWal); + int iNew = !iApp; + pWal->nCkpt++; + walidxSetFile(&pWal->hdr, iNew); + walidxSetMxFrame(&pWal->hdr, iNew, 0); + sqlite3Put4byte((u8*)&pWal->hdr.aSalt[0], pWal->hdr.aFrameCksum[0]); + sqlite3Put4byte((u8*)&pWal->hdr.aSalt[1], pWal->hdr.aFrameCksum[1]); + walIndexWriteHdr(pWal); + pInfo->nBackfill = 0; + wal2RestartFinished(pWal, iApp); + walUnlockShared(pWal, WAL_READ_LOCK(pWal->readLock)); + pWal->readLock = iNew ? WAL_LOCK_PART2_FULL1 : WAL_LOCK_PART1_FULL2; + rc = walLockShared(pWal, WAL_READ_LOCK(pWal->readLock)); + }else if( rc==SQLITE_BUSY ){ + rc = SQLITE_OK; } } }else if( pWal->readLock==0 ){ diff --git a/test/wal2simple.test b/test/wal2simple.test index 3ccd4b91a4..3d50d3e950 100644 --- a/test/wal2simple.test +++ b/test/wal2simple.test @@ -470,6 +470,32 @@ do_test 7.5.4 { list [file size test.db-wal] [file size test.db-wal2] [file size test.db] } {22040 12608 87040} +#------------------------------------------------------------------------- +reset_db +do_execsql_test 8.0 { + PRAGMA journal_size_limit = 10000; + PRAGMA journal_mode = wal2; + CREATE TABLE t1(x); + INSERT INTO t1 VALUES( hex( randomblob(5000) ) ); + INSERT INTO t1 VALUES( hex( randomblob(5000) ) ); + INSERT INTO t1 VALUES( hex( randomblob(5000) ) ); + INSERT INTO t1 VALUES( hex( randomblob(5000) ) ); + BEGIN; + INSERT INTO t1 VALUES( hex( randomblob(5000) ) ); +} {10000 wal2} + +sqlite3 db2 test.db +do_execsql_test -db db2 8.1 { + PRAGMA wal_checkpoint; +} {0 50 13} + +do_execsql_test 8.2 { + COMMIT; +} + +db2 close + + #------------------------------------------------------------------------- reset_db do_execsql_test 9.0 { @@ -486,6 +512,5 @@ do_execsql_test 9.1 { PRAGMA wal_checkpoint; } {0 50 13} - finish_test From 3d6fbe469b55644e1829a40b69a3f7a365578503 Mon Sep 17 00:00:00 2001 From: dan Date: Sat, 14 Dec 2024 16:50:29 +0000 Subject: [PATCH 3/4] Fix a problem with non-PASSIVE wal2 checkpoints sometimes taking the WRITER lock. FossilOrigin-Name: 11d7865a56c1fbb978e3ba70ddc03c2a16080e2992c580e00e4c6c1fa47c043c --- manifest | 15 ++++++++------- manifest.uuid | 2 +- src/wal.c | 2 +- test/wal2simple.test | 27 +++++++++++++++++++++++++++ 4 files changed, 37 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 658424d0a6..cf2fce9a5f 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Do\snot\sattempt\sto\sswitch\swal\sfiles\swhen\swriting\sif\sthe\scurrent\stransaction\sread\sfrom\sboth\swal\sfiles.\sThis\sfix\sis\salready\son\sbranch\s'bedrock'. -D 2024-12-14T16:41:39.812 +C Fix\sa\sproblem\swith\snon-PASSIVE\swal2\scheckpoints\ssometimes\staking\sthe\sWRITER\slock. +D 2024-12-14T16:50:29.177 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -860,7 +860,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 42f0823a65218643d213633b52e2a80ca70b193f6f7802c6edb040448860e9e8 +F src/wal.c 0d024a770c3f52baab91427a3a1b89cecfaefb492964da1a8e83f94187287f46 F src/wal.h 97b8a9903387401377b59507e86b93a148ef1ad4e5ce0f23659a12dcdce56af2 F src/walker.c d5006d6b005e4ea7302ad390957a8d41ed83faa177e412f89bc5600a7462a014 F src/where.c b34adb09fdb2a4f57a0bafd4194b501047ef383976fef9f0ac3f395f4881694d @@ -2003,7 +2003,7 @@ F test/wal2recover3.test 4a91689e165a38bc401736e6518188c2b0ff4fa1566d1810b886753 F test/wal2rewrite.test 6ca6f631ffcf871240beab5f02608913fd075c6d0d31310b026c8383c65c9f9c F test/wal2rollback.test 23adc4a099b23f6aaea8b04fdca1c35861d887dd80f8be7da2d5273eb777e428 F test/wal2savepoint.test c380512ec1f97012cfc753e718bf3df38f51e7c319110e1cae25094a33b371c4 -F test/wal2simple.test 471f6d404c19b94968ef4c74566914e544d31c5fa0afc8f1b31af117d7014a8b +F test/wal2simple.test d2d94fe1f30700c9f30e46c16f1c3d7d245b861a1be2bfe5ead701484c6dd38e F test/wal2snapshot.test 7a5f4629a3c43a43c3440b8b2ea9f07de91a46b0b9eea5f08f62b5bf5b6468df F test/wal3.test 5de023bb862fd1eb9d2ad26fa8d9c43abb5370582e5b08b2ae0d6f93661bc310 F test/wal4.test 4744e155cd6299c6bd99d3eab1c82f77db9cdb3c @@ -2216,8 +2216,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 c5f7bba8683a9aa503750abb7fd937566983dc1ca08361eca8b9b185294b909a -R 9126283d88fd2ef1f08bb80d8fab9c01 +P 693cc8e8db6c00249211bdfc21be2bff169ca6b0c4560522dd404615e8ba3b76 +Q +1a59cae3c31aea25cef3705cce2477e26515a0463cf9094bd29951899b758767 +R 5649ce79a264a23dcf9673f867edeff1 U dan -Z 875bffc535ab8b30264831dbcb04504f +Z 9ac7b2b52092771e4fcd759caab1f3c0 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 6c7c0600cb..c3512e7ef3 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -693cc8e8db6c00249211bdfc21be2bff169ca6b0c4560522dd404615e8ba3b76 +11d7865a56c1fbb978e3ba70ddc03c2a16080e2992c580e00e4c6c1fa47c043c diff --git a/src/wal.c b/src/wal.c index 987eed318d..ca53cf9c62 100644 --- a/src/wal.c +++ b/src/wal.c @@ -5158,7 +5158,7 @@ int sqlite3WalCheckpoint( ** writer lock retried until either the busy-handler returns 0 or the ** lock is successfully obtained. */ - if( eMode!=SQLITE_CHECKPOINT_PASSIVE ){ + if( eMode!=SQLITE_CHECKPOINT_PASSIVE && isWalMode2(pWal)==0 ){ rc = walBusyLock(pWal, xBusy2, pBusyArg, WAL_WRITE_LOCK, 1); if( rc==SQLITE_OK ){ pWal->writeLock = 1; diff --git a/test/wal2simple.test b/test/wal2simple.test index 3d50d3e950..1a8c1e63bd 100644 --- a/test/wal2simple.test +++ b/test/wal2simple.test @@ -512,5 +512,32 @@ do_execsql_test 9.1 { PRAGMA wal_checkpoint; } {0 50 13} + +#------------------------------------------------------------------------- +# Check that it is possible to do a non-PASSIVE checkpoint on a wal2 +# db without blocking writers. +# +reset_db +do_execsql_test 10.0 { + PRAGMA journal_size_limit = 10000; + PRAGMA journal_mode = wal2; + CREATE TABLE t1(x); + INSERT INTO t1 VALUES( hex( randomblob(5000) ) ); + INSERT INTO t1 VALUES( hex( randomblob(5000) ) ); + INSERT INTO t1 VALUES( hex( randomblob(5000) ) ); + INSERT INTO t1 VALUES( hex( randomblob(5000) ) ); + BEGIN; + INSERT INTO t1 VALUES( hex( randomblob(5000) ) ); +} {10000 wal2} + +sqlite3 db2 test.db +do_execsql_test -db db2 10.1 { + PRAGMA wal_checkpoint = FULL; +} {0 50 13} + +do_execsql_test 10.2 { + COMMIT; +} + finish_test From 686166eb32a9b4fbfdcf95d21b18bcb3bad349f9 Mon Sep 17 00:00:00 2001 From: dan Date: Sat, 14 Dec 2024 17:19:06 +0000 Subject: [PATCH 4/4] Update to walRestartLog() function to make it shorter easier to merge with branch "bedrock". FossilOrigin-Name: 88d7fb2aef882fc41a4f9c1bdd2f0162289e90d62df50af1b0eb6994c5c94c28 --- manifest | 13 ++++++------- manifest.uuid | 2 +- src/wal.c | 4 +++- 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index cf2fce9a5f..1c4be400ec 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sproblem\swith\snon-PASSIVE\swal2\scheckpoints\ssometimes\staking\sthe\sWRITER\slock. -D 2024-12-14T16:50:29.177 +C Update\sto\swalRestartLog()\sfunction\sto\smake\sit\sshorter\seasier\sto\smerge\swith\sbranch\s"bedrock". +D 2024-12-14T17:19:06.037 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -860,7 +860,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 0d024a770c3f52baab91427a3a1b89cecfaefb492964da1a8e83f94187287f46 +F src/wal.c 2ec54ef10bb354fc61424c4b65f407e795abe07059001d0d1c5f99be5bb8b7bf F src/wal.h 97b8a9903387401377b59507e86b93a148ef1ad4e5ce0f23659a12dcdce56af2 F src/walker.c d5006d6b005e4ea7302ad390957a8d41ed83faa177e412f89bc5600a7462a014 F src/where.c b34adb09fdb2a4f57a0bafd4194b501047ef383976fef9f0ac3f395f4881694d @@ -2216,9 +2216,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 693cc8e8db6c00249211bdfc21be2bff169ca6b0c4560522dd404615e8ba3b76 -Q +1a59cae3c31aea25cef3705cce2477e26515a0463cf9094bd29951899b758767 -R 5649ce79a264a23dcf9673f867edeff1 +P 11d7865a56c1fbb978e3ba70ddc03c2a16080e2992c580e00e4c6c1fa47c043c +R 4b3e1430220bd396f41d373fd3638959 U dan -Z 9ac7b2b52092771e4fcd759caab1f3c0 +Z 80dc095041f96e4782d4286427d7b68b # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index c3512e7ef3..50f2864eed 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -11d7865a56c1fbb978e3ba70ddc03c2a16080e2992c580e00e4c6c1fa47c043c +88d7fb2aef882fc41a4f9c1bdd2f0162289e90d62df50af1b0eb6994c5c94c28 diff --git a/src/wal.c b/src/wal.c index ca53cf9c62..ddb0b9dd62 100644 --- a/src/wal.c +++ b/src/wal.c @@ -4613,7 +4613,9 @@ static int walRestartLog(Wal *pWal){ ** Condition (b) guarantees that wal file !iApp is either empty or ** completely checkpointed. */ - if( (pWal->readLock==WAL_LOCK_PART1 || pWal->readLock==WAL_LOCK_PART2) + assert( (0*3)+1==WAL_LOCK_PART1 ); /* iApp==0 -> require WAL_LOCK_PART1 */ + assert( (1*3)+1==WAL_LOCK_PART2 ); /* iApp==1 -> require WAL_LOCK_PART2 */ + if( pWal->readLock==(iApp*3)+1 && walidxGetMxFrame(&pWal->hdr, iApp)>=nWalSize ){ rc = wal2RestartOk(pWal, iApp);