]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Enhance tests to ensure that blocking locks, and not calls to xSleep(), are being...
authordan <Dan Kennedy>
Mon, 9 Dec 2024 16:01:28 +0000 (16:01 +0000)
committerdan <Dan Kennedy>
Mon, 9 Dec 2024 16:01:28 +0000 (16:01 +0000)
FossilOrigin-Name: c892242bb642f7a6a961e310ed8b4f1e140f8ee32c00f50021c6011c6e7e1476

manifest
manifest.uuid
src/os_win.c
src/test_config.c
src/test_vfs.c
test/walsetlk.test

index 60d679c81ff4579e6e97bffeab795100e11b0f2a..76c631decd38b07109fcfc8d7f359058f2629062 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Fix\sfilectrl.test\sso\sthat\sit\sworks\swith\swinrt\sbuilds.
-D 2024-12-04T19:32:24.081
+C Enhance\stests\sto\sensure\sthat\sblocking\slocks,\sand\snot\scalls\sto\sxSleep(),\sare\sbeing\sused\sby\sSQLITE_ENABLE_SETLK_TIMEOUT\sbuilds\swhen\sthey\sshould\sbe.
+D 2024-12-09T16:01:28.611
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
 F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d
@@ -762,7 +762,7 @@ F src/os_common.h 6c0eb8dd40ef3e12fe585a13e709710267a258e2c8dd1c40b1948a1d14582e
 F src/os_kv.c 4d39e1f1c180b11162c6dc4aa8ad34053873a639bac6baae23272fc03349986a
 F src/os_setup.h 6011ad7af5db4e05155f385eb3a9b4470688de6f65d6166b8956e58a3d872107
 F src/os_unix.c d2edbd92b07a3f778c2defa8a2e9d75acceb6267bda56948c41e8cdda65224d6
-F src/os_win.c e9d334b8ef6e06ae61047d2bbbf129ecfd6e12a6bd94799792433fefb1eaead6
+F src/os_win.c 85c4d04e3d679a471c35172a58afa106040c26b9d6ba80be2efaf948c60be783
 F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a
 F src/pager.c 9656ad4e8331efb8a4f94f7a0c6440b98caea073950a367ea0c728a53b8e62c9
 F src/pager.h 4b1140d691860de0be1347474c51fee07d5420bd7f802d38cbab8ea4ab9f538a
@@ -801,7 +801,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 fa43522c0cea6b2ec189a8ffd10031ca5698b934fedf392e8576785e20ac9df1
+F src/test_config.c 7f412406592794636d6226268e26d413850a9f799bc5f3c01afc2820b165fca8
 F src/test_delete.c e2fe07646dff6300b48d49b2fee2fe192ed389e834dd635e3b3bac0ce0bf9f8f
 F src/test_demovfs.c 3efa2adf4f21e10d95521721687d5ca047aea91fa62dd8cc22ac9e5a9c942383
 F src/test_devsym.c 649434ed34d0b03fbd5a6b42df80f0f9a7e53f94dd1710aad5dd8831e91c4e86
@@ -832,7 +832,7 @@ F src/test_tclsh.c c01706ac60bd3176754d3ccd37da74c6ad97c2e14489f8ed71b497c1c0ac0
 F src/test_tclvar.c ae873248a0188459b1c16ca7cc431265dacce524399e8b46725c2b3b7e048424
 F src/test_thread.c d7a8bcea7445f37cc2a1f7f81dd6059634f45e0c61bfe80182b02872fb0328bb
 F src/test_vdbecov.c 5c426d9cd2b351f5f9ceb30cabf8c64a63bfcad644c507e0bd9ce2f6ae1a3bf3
-F src/test_vfs.c f298475e468c7e14945b20af885917181090c265aa3c4ade897849c9fbd396f2
+F src/test_vfs.c a19728c5930b5f5f415c664c57b029cba98c459fe70639aefcbfc4f70d544335
 F src/test_windirent.c a895e2c068a06644eef91a7f0a32182445a893b9a0f33d0cdb4283dca2486ac1
 F src/test_windirent.h da2e5b73c32d09905fbdd00f27cd802212a32a58ead882736fe4f5eb775ebc50
 F src/test_window.c 6d80e11fba89a1796525e6f0048ff0c7789aa2c6b0b11c80827dc1437bd8ea72
@@ -2021,7 +2021,7 @@ F test/walro.test cb438d05ba0d191f10b688e39c4f0cd5b71569a1d1f4440e5bdf3c6880e08c
 F test/walro2.test 33955a6fd874dd9724005e17f77fef89d334b3171454a1256fe4941a96766cdc
 F test/walrofault.test c70cb6e308c443867701856cce92ad8288cd99488fa52afab77cca6cfd51af68
 F test/walseh1.test bae700eb99519b6d5cd3f893c04759accc5a59c391d4189fe4dd6995a533442b
-F test/walsetlk.test 34c901443b31ab720afc463f5b236c86ca5c4134402573dce91aa0761de8db5a
+F test/walsetlk.test 18dcf274891bd93916ca4ba831078f89ef99388c6fdd495745443ed2c1b2f382
 F test/walshared.test 42e3808582504878af237ea02c42ca793e8a0efaa19df7df26ac573370dbc7a3
 F test/walslow.test 0c51843836c9dcf40a5ac05aa781bfb977b396ee2c872d92bd48b79d5dd9aa23
 F test/walthread.test 14b20fcfa6ae152f5d8e12f5dc8a8a724b7ef189f5d8ef1e2ceab79f2af51747
@@ -2202,8 +2202,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 22e4aeded0a6a691fc7026f3cd90836a289dfc994269f8576d01e28fa478902b
-R 0432cd81cc749bbfe4d694b5aab9fdf8
+P 70b0cfb0493e3fe56645648b462cb035d0d791f95b2913b7622f08c1090338c0
+R 9de6f4b05e49f722496a553eef28dd0a
 U dan
-Z 8a3542a0971ab31c1355fe946ed43a29
+Z b306d8cfc696ddcddaf2101fbec84ebb
 # Remove this line to create a well-formed Fossil manifest.
index 0ec8721a25d8bbdf4e413a9315af5dc267bf2921..84434c2dcfcf96db924c32f4c48649ed3d874030 100644 (file)
@@ -1 +1 @@
-70b0cfb0493e3fe56645648b462cb035d0d791f95b2913b7622f08c1090338c0
+c892242bb642f7a6a961e310ed8b4f1e140f8ee32c00f50021c6011c6e7e1476
index 739be79b5a146bebb881aa1e35c03e57f0023a27..c5342b2d03fc97893716233341d31b015a3cbf8f 100644 (file)
@@ -4044,10 +4044,13 @@ static void *winConvertFromUtf8Filename(const char *zFilename){
   return zConverted;
 }
 
-static int winOpenFile(
-  const char *zUtf8,
-  int *pbReadonly,
-  HANDLE *ph
+/*
+** This function is used to open a handle on a *-shm file.
+*/
+static int winHandleOpen(
+  const char *zUtf8,              /* File to open */
+  int *pbReadonly,                /* IN/OUT: True for readonly handle */
+  HANDLE *ph                      /* OUT: New HANDLE for file */
 ){
   int rc = SQLITE_OK;
   void *zConverted = 0;
@@ -4072,8 +4075,8 @@ static int winOpenFile(
   /* TODO: platforms.
   ** TODO: retry-on-ioerr.
   */
+  if( osIsNT() ){
 #if SQLITE_OS_WINRT
-  {
     CREATEFILE2_EXTENDED_PARAMETERS extendedParameters;
     memset(&extendedParameters, 0, sizeof(extendedParameters));
     extendedParameters.dwSize = sizeof(extendedParameters);
@@ -4086,21 +4089,35 @@ static int winOpenFile(
         OPEN_ALWAYS,                             /* dwCreationDisposition */
         &extendedParameters
     );
-  }
 #else
-  h = osCreateFileW((LPCWSTR)zConverted,         /* lpFileName */
-      (GENERIC_READ | (bReadonly ? 0 : GENERIC_WRITE)),  /* dwDesiredAccess */
-      FILE_SHARE_READ | FILE_SHARE_WRITE,        /* dwShareMode */
-      NULL,                                      /* lpSecurityAttributes */
-      OPEN_ALWAYS,                               /* dwCreationDisposition */
-      FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED,
-      NULL
-  );
+    h = osCreateFileW((LPCWSTR)zConverted,         /* lpFileName */
+        (GENERIC_READ | (bReadonly ? 0 : GENERIC_WRITE)),  /* dwDesiredAccess */
+        FILE_SHARE_READ | FILE_SHARE_WRITE,        /* dwShareMode */
+        NULL,                                      /* lpSecurityAttributes */
+        OPEN_ALWAYS,                               /* dwCreationDisposition */
+        FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED,
+        NULL
+    );
 #endif
+  }else{
+    /* Due to pre-processor directives earlier in this file, 
+    ** SQLITE_WIN32_HAS_ANSI is always defined if osIsNT() is false. */
+#ifdef SQLITE_WIN32_HAS_ANSI
+    h = osCreateFileA((LPCSTR)zConverted,
+        (GENERIC_READ | (bReadonly ? 0 : GENERIC_WRITE)),  /* dwDesiredAccess */
+        FILE_SHARE_READ | FILE_SHARE_WRITE,        /* dwShareMode */
+        NULL,                                      /* lpSecurityAttributes */
+        OPEN_ALWAYS,                               /* dwCreationDisposition */
+        FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED,
+        NULL
+    );
+#endif
+  }
+
   if( h==INVALID_HANDLE_VALUE ){
     if( bReadonly==0 ){
       bReadonly = 1;
-      rc = winOpenFile(zUtf8, &bReadonly, &h);
+      rc = winHandleOpen(zUtf8, &bReadonly, &h);
     }else{
       rc = SQLITE_CANTOPEN_BKPT;
     }
@@ -4143,10 +4160,10 @@ static int winOpenSharedMemory(winFile *pDbFd){
   sqlite3FileSuffix3(pDbFd->zPath, pNew->zFilename);
 
   /* Open a file-handle on the *-shm file for this connection. This file-handle
-  ** is only used for locking. The mapping of the *-shm file is created using the
-  ** shared file handle in winShmNode.hSharedShm.  */
+  ** is only used for locking. The mapping of the *-shm file is created using
+  ** the shared file handle in winShmNode.hSharedShm.  */
   p->bReadonly = sqlite3_uri_boolean(pDbFd->zPath, "readonly_shm", 0);
-  rc = winOpenFile(pNew->zFilename, &p->bReadonly, &p->hShm);
+  rc = winHandleOpen(pNew->zFilename, &p->bReadonly, &p->hShm);
 
   /* Look to see if there is an existing winShmNode that can be used.
   ** If no matching winShmNode currently exists, then create a new one.  */
@@ -4169,7 +4186,7 @@ static int winOpenSharedMemory(winFile *pDbFd){
     if( rc==SQLITE_OK ){
       HANDLE h = INVALID_HANDLE_VALUE;
       pShmNode->isReadonly = p->bReadonly;
-      rc = winOpenFile(pNew->zFilename, &pShmNode->isReadonly, &h);
+      rc = winHandleOpen(pNew->zFilename, &pShmNode->isReadonly, &h);
       pShmNode->hSharedShm = h;
     }
 
index 6ad7a90755ee7ab6cdd6b4ab6aa2c23c0e41af6a..bdfb31e7d8b22b77df5c92424b4a1f8ee2925f62 100644 (file)
@@ -787,6 +787,13 @@ Tcl_SetVar2(interp, "sqlite_options", "mergesort", "1", TCL_GLOBAL_ONLY);
   Tcl_SetVar2(interp, "sqlite_options", "windowfunc", "1", TCL_GLOBAL_ONLY);
 #endif
 
+#if !defined(SQLITE_ENABLE_SETLK_TIMEOUT)
+  Tcl_SetVar2(interp, "sqlite_options", "setlk_timeout", "0", TCL_GLOBAL_ONLY);
+#else
+  Tcl_SetVar2(interp, "sqlite_options", "setlk_timeout", 
+      STRINGVALUE(SQLITE_ENABLE_SETLK_TIMEOUT), TCL_GLOBAL_ONLY);
+#endif
+
 #define LINKVAR(x) { \
     static const int cv_ ## x = SQLITE_ ## x; \
     Tcl_LinkVar(interp, "SQLITE_" #x, (char *)&(cv_ ## x), \
index 9f84b4f80106a8d9f25ffc816c61fd69bbb92360..f75ef956b6a6868b4b8d452dbbec843d104494a9 100644 (file)
@@ -130,8 +130,9 @@ struct Testvfs {
 #define TESTVFS_LOCK_MASK         0x00040000
 #define TESTVFS_CKLOCK_MASK       0x00080000
 #define TESTVFS_FCNTL_MASK        0x00100000
+#define TESTVFS_SLEEP_MASK        0x00200000
 
-#define TESTVFS_ALL_MASK          0x001FFFFF
+#define TESTVFS_ALL_MASK          0x003FFFFF
 
 
 #define TESTVFS_MAX_PAGES 1024
@@ -813,6 +814,10 @@ static int tvfsRandomness(sqlite3_vfs *pVfs, int nByte, char *zBufOut){
 ** actually slept.
 */
 static int tvfsSleep(sqlite3_vfs *pVfs, int nMicro){
+  Testvfs *p = (Testvfs *)pVfs->pAppData;
+  if( p->pScript && (p->mask&TESTVFS_SLEEP_MASK) ){
+    tvfsExecTcl(p, "xSleep", Tcl_NewIntObj(nMicro), 0, 0, 0);
+  }
   return sqlite3OsSleep(PARENTVFS(pVfs), nMicro);
 }
 
@@ -1197,6 +1202,7 @@ static int SQLITE_TCLAPI testvfs_obj_cmd(
         { "xLock",              TESTVFS_LOCK_MASK },
         { "xCheckReservedLock", TESTVFS_CKLOCK_MASK },
         { "xFileControl",       TESTVFS_FCNTL_MASK },
+        { "xSleep",             TESTVFS_SLEEP_MASK },
       };
       Tcl_Obj **apElem = 0;
       Tcl_Size nElem = 0;
index 1e092382265e1babc944eaa99d0c105004e76aab..23fcac59d27eb2d821a9caaf6eef8584faf331cd 100644 (file)
@@ -80,6 +80,19 @@ db2 close
 #-------------------------------------------------------------------------
 
 do_multiclient_test tn {
+
+  testvfs tvfs -fullshm 1
+  db close
+  sqlite3 db test.db -vfs tvfs
+  tvfs script xSleep_callback
+  tvfs filter xSleep
+
+  set ::sleep_count 0
+  proc xSleep_callback {xSleep nMs} {
+    after [expr $nMs / 1000]
+    incr ::sleep_count
+  }
+
   do_test 2.$tn.1 {
     sql1 {
       PRAGMA journal_mode = wal;
@@ -132,7 +145,6 @@ do_multiclient_test tn {
     set us [lindex [time { catch {db eval "PRAGMA wal_checkpoint=RESTART"} }] 0]
     expr $us>1000000 && $us<4000000
   } {1}
-
   do_test 2.$tn.9 {
     sql3 {
       INSERT INTO t1 VALUES(11, 12);
@@ -178,7 +190,31 @@ do_multiclient_test tn {
     set us [lindex [time { catch {db eval "PRAGMA wal_checkpoint=RESTART"} }] 0]
     expr $us>1000000 && $us<4000000
   } {1}
-  
+
+  db close
+  tvfs delete
+
+  # Set bSleep to true if it is expected that the above used xSleep() to
+  # wait for locks. bSleep is true unless SQLITE_ENABLE_SETLK_TIMEOUT is
+  # set to 1 and either:
+  #
+  #   * the OS is windows, or
+  #   * the OS is unix and the tests were run with each connection 
+  #     in a separate process.
+  #
+  set bSleep 1
+  if {$::sqlite_options(setlk_timeout)==1} {
+    if {$::tcl_platform(platform)=="windows"} {
+      set bSleep 0
+    }
+    if {$::tcl_platform(platform)=="unix"} {
+      set bSleep [expr $tn==2]
+    }
+  }
+
+  do_test 2.$tn.15.$bSleep {
+    expr $::sleep_count > 0
+  } $bSleep
 }
 
 #-------------------------------------------------------------------------