]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Fix a problem with non-PASSIVE wal2 checkpoints sometimes taking the WRITER lock.
authordan <Dan Kennedy>
Mon, 9 Dec 2024 21:26:21 +0000 (21:26 +0000)
committerdan <Dan Kennedy>
Mon, 9 Dec 2024 21:26:21 +0000 (21:26 +0000)
FossilOrigin-Name: 1a59cae3c31aea25cef3705cce2477e26515a0463cf9094bd29951899b758767

manifest
manifest.uuid
src/wal.c
test/wal2simple.test

index 591c2be415c5b8db93ed1655ce83e265cd09b294..5a9f0a3821379f940cc7cb28af35869d7177ef71 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Update\slogging\s(now\sv=16)\sto\smore\sclosely\sanalyze\sall\sattempts\sto\sload\sthe\smain\sdb\sschema.
-D 2024-12-06T17:52:38.851
+C Fix\sa\sproblem\swith\snon-PASSIVE\swal2\scheckpoints\ssometimes\staking\sthe\sWRITER\slock.
+D 2024-12-09T21:26:21.182
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
 F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -857,7 +857,7 @@ F src/vdbetrace.c fe0bc29ebd4e02c8bc5c1945f1d2e6be5927ec12c06d89b03ef2a4def34bf8
 F src/vdbevtab.c fc46b9cbd759dc013f0b3724549cc0d71379183c667df3a5988f7e2f1bd485f3
 F src/vtab.c 5fb499d20494b7eecaadb7584634af9afcb374cb0524912b475fcb1712458a1b
 F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9
-F src/wal.c 704794b1e89dd6c1bef36086253f94ffd2abb16f71f23d5240d811d96c27bb99
+F src/wal.c 5d071c855cac887f5bbf190ab3fee31ad7ee06237229dda00b11bc93f3352656
 F src/wal.h 8c59ee7a835574396d7cbd04626d11fd849613e361a46e7e9519091ab03bdb29
 F src/walker.c d5006d6b005e4ea7302ad390957a8d41ed83faa177e412f89bc5600a7462a014
 F src/where.c c046dd58c3410f7b7528e1e6317cb876398557bad346d568ed8562321a7d002d
@@ -2019,7 +2019,7 @@ F test/wal2recover3.test 4a91689e165a38bc401736e6518188c2b0ff4fa1566d1810b886753
 F test/wal2rewrite.test 6ca6f631ffcf871240beab5f02608913fd075c6d0d31310b026c8383c65c9f9c
 F test/wal2rollback.test 23adc4a099b23f6aaea8b04fdca1c35861d887dd80f8be7da2d5273eb777e428
 F test/wal2savepoint.test 3793a0ae97011fca358f79775f5d7d9f85da75c8e67686e2e19713da0cb0d99c
-F test/wal2simple.test 320a08927f307d0ead26fa3fcef4e3f64279f49be9504f918cb33294f75aeec8
+F test/wal2simple.test 19183491dc05799abe51b4bdce2bc73d2be84209e50357f4b0774673cd979e73
 F test/wal2snapshot.test f6c3945bea572fd8745774e95b8dca1e5832c696e2251bb0db33391ee567fe60
 F test/wal3.test 5de023bb862fd1eb9d2ad26fa8d9c43abb5370582e5b08b2ae0d6f93661bc310
 F test/wal4.test 4744e155cd6299c6bd99d3eab1c82f77db9cdb3c
@@ -2250,8 +2250,8 @@ F vsixtest/vsixtest.tcl 6195aba1f12a5e10efc2b8c0009532167be5e301abe5b31385638080
 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
 F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
 F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P 5fa1699e31856a6585cc59183641c4cc99e1ccd99c384d13e9c4442e9c07f41a
-R 52059697f6646241ab7617b1a870a41c
+P 65b753735b8e8fb70d2b522d527426f1eb5c09339fb4b15cf69cbd2e595b160f
+R a34340bb9b605af414e2a372f2fb6d2a
 U dan
-Z 24925713dc7dc01632d224dd295c2b53
+Z 802a1f821ec59c877226c308eb1a6952
 # Remove this line to create a well-formed Fossil manifest.
index c568f4a8181abe33b1a3d81114a9a60c601da852..1ea95eecf87f74ec63733a631351433cc306222e 100644 (file)
@@ -1 +1 @@
-65b753735b8e8fb70d2b522d527426f1eb5c09339fb4b15cf69cbd2e595b160f
+1a59cae3c31aea25cef3705cce2477e26515a0463cf9094bd29951899b758767
index 9af30beb66f93b993213783562c2124ec042f500..e136407c4d8f15768687333832c2be4bf14e16ba 100644 (file)
--- a/src/wal.c
+++ b/src/wal.c
@@ -5644,7 +5644,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;
index e63f4e175944ed9ec6550f74e15d6ad11de847c2..370d3433d94a6997412a215712fa5388cf17d348 100644 (file)
@@ -470,6 +470,33 @@ do_test 7.5.4 {
   list [file size test.db-wal] [file size test.db-wal2] [file size test.db]
 } {22040 12608 87040}
 
+#-------------------------------------------------------------------------
+# Check that it is possible to do a non-PASSIVE checkpoint on a wal2
+# db without blocking writers.
+#
+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 = FULL;
+} {0 50 13}
+
+do_execsql_test 8.2 {
+  COMMIT;
+}
+
+
 
 finish_test