]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Reinstate the assert() removed by [0f6223b8]. Avoid holding a wal-mode write lock...
authordan <Dan Kennedy>
Tue, 25 Feb 2025 15:27:55 +0000 (15:27 +0000)
committerdan <Dan Kennedy>
Tue, 25 Feb 2025 15:27:55 +0000 (15:27 +0000)
FossilOrigin-Name: 277e150d6ab75de2407f6761aa2359df80a4e1dbce30788df06621dee05b2ef1

manifest
manifest.uuid
src/pager.c
src/wal.c

index c451680461dda77ac3b0ebac47f3b1c8fdc03f75..f7f2544ed6905e8760618cb1b2a84008b3f8b92c 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Fix\sa\stest\sscript\sproblem\scausing\serrors\swith\sTcl\s9.
-D 2025-02-25T13:33:43.248
+C Reinstate\sthe\sassert()\sremoved\sby\s[0f6223b8].\sAvoid\sholding\sa\swal-mode\swrite\slock\safter\sthe\stransaction\shas\sbeen\srolled\sback\sif\san\sIO\serror\soccurs\swhile\srestarting\sthe\swal\sfile.
+D 2025-02-25T15:27:55.533
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
 F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d
@@ -769,7 +769,7 @@ F src/os_setup.h 6011ad7af5db4e05155f385eb3a9b4470688de6f65d6166b8956e58a3d87210
 F src/os_unix.c 1e887f1f926a76a65ebcef79aa6da76e369ad7f899fa211c6ee56ff953c098a2
 F src/os_win.c ab9912a2c1cb39a6429b8de919a5b63ad1c7775e511d748391c57bf9ad03bd29
 F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a
-F src/pager.c 8d73e7a0ebbecd8bb4996ff285cc055cec56b7e3edb5a4609d0748e0fa39d28a
+F src/pager.c 9fbb541b46125dfa8914827575e6bb4d15048caa008073b1709112d495d7983b
 F src/pager.h 6137149346e6c8a3ddc1eeb40aee46381e9bc8b0fcc6dda8a1efde993c2275b8
 F src/parse.y 4e62b0b301673d404b8aff7c9d84ee8636e5ff59f45c90cdce4c8845a1289837
 F src/pcache.c 588cc3c5ccaaadde689ed35ce5c5c891a1f7b1f4d1f56f6cf0143b74d8ee6484
@@ -862,7 +862,7 @@ F src/vdbetrace.c fe0bc29ebd4e02c8bc5c1945f1d2e6be5927ec12c06d89b03ef2a4def34bf8
 F src/vdbevtab.c fc46b9cbd759dc013f0b3724549cc0d71379183c667df3a5988f7e2f1bd485f3
 F src/vtab.c 828221bdbeaaa6d62126ee6d07fd4ec0d09dcaea846f87ad01944d8b7e548859
 F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9
-F src/wal.c a9924069336c4658b2edca78329dfa882625d9994abd3ddb0844f01d367bbd43
+F src/wal.c 2c69a5f92270429db72d853691b0640c76c671d5b2465396dadb9d9873e1efce
 F src/wal.h ba252daaa94f889f4b2c17c027e823d9be47ce39da1d3799886bbd51f0490452
 F src/walker.c d5006d6b005e4ea7302ad390957a8d41ed83faa177e412f89bc5600a7462a014
 F src/where.c 12cca5dfbe96e2589f951c43c0720fc58e52611787c37d85a0d9c10376202e8b
@@ -2212,8 +2212,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 46909fe3348976448d6a0d9e9aacaeaccdf0978c9e9d10742a96842418ab3a08
-R 526cf0a0be1bc6e2b85addf701939bc4
+P dbec2c47d09027f2458036f675c8af3f8f152c0530799582eeac231649eba501
+R 2312fa300fbaf4183adcc761394fc806
 U dan
-Z 52df1a59d6f0cdd2cab89227f5c1e86d
+Z a3a3c0f73073583ca8fc9c0889051cbf
 # Remove this line to create a well-formed Fossil manifest.
index 8f4a3e4879fc66e1064a7cc4bba23dfd9026ba94..19e81632af96c4f08746573c553516f3985393b4 100644 (file)
@@ -1 +1 @@
-dbec2c47d09027f2458036f675c8af3f8f152c0530799582eeac231649eba501
+277e150d6ab75de2407f6761aa2359df80a4e1dbce30788df06621dee05b2ef1
index 5d279001e76e981251f1183197861431134fa4df..21f3ac5f6765f4c1f8d7c48cda37e1fc2d2eaf80 100644 (file)
@@ -1846,6 +1846,15 @@ static void pager_unlock(Pager *pPager){
 
   if( pagerUseWal(pPager) ){
     assert( !isOpen(pPager->jfd) );
+    if( pPager->eState==PAGER_ERROR ){
+      /* If an IO error occurs in wal.c while attempting to wrap the wal file,
+      ** then the Wal object may be holding a write-lock but no read-lock.
+      ** This call ensures that the write-lock is dropped as well. We cannot
+      ** have sqlite3WalEndReadTransaction() drop the write-lock, as it once
+      ** did, because this would break "BEGIN EXCLUSIVE" handling for
+      ** SQLITE_ENABLE_SETLK_TIMEOUT builds.  */
+      sqlite3WalEndWriteTransaction(pPager->pWal);
+    }
     sqlite3WalEndReadTransaction(pPager->pWal);
     pPager->eState = PAGER_OPEN;
   }else if( !pPager->exclusiveMode ){
index a6287a408101be1b4687914db5af8e867e8f58d8..d374d6eb4dab828abe191b78a2d6644375dbdbdc 100644 (file)
--- a/src/wal.c
+++ b/src/wal.c
@@ -3482,6 +3482,9 @@ int sqlite3WalBeginReadTransaction(Wal *pWal, int *pChanged){
 ** read-lock.
 */
 void sqlite3WalEndReadTransaction(Wal *pWal){
+#ifndef SQLITE_ENABLE_SETLK_TIMEOUT
+  assert( pWal->writeLock==0 || pWal->readLock<0 );
+#endif
   if( pWal->readLock>=0 ){
     sqlite3WalEndWriteTransaction(pWal);
     walUnlockShared(pWal, WAL_READ_LOCK(pWal->readLock));