From 4ab343cb7cb672290bb7e35cca6ccb5cce2ffed8 Mon Sep 17 00:00:00 2001 From: dan Date: Mon, 9 Dec 2024 16:01:28 +0000 Subject: [PATCH] Enhance tests to ensure that blocking locks, and not calls to xSleep(), are being used by SQLITE_ENABLE_SETLK_TIMEOUT builds when they should be. FossilOrigin-Name: c892242bb642f7a6a961e310ed8b4f1e140f8ee32c00f50021c6011c6e7e1476 --- manifest | 18 +++++++-------- manifest.uuid | 2 +- src/os_win.c | 55 ++++++++++++++++++++++++++++++---------------- src/test_config.c | 7 ++++++ src/test_vfs.c | 8 ++++++- test/walsetlk.test | 40 +++++++++++++++++++++++++++++++-- 6 files changed, 98 insertions(+), 32 deletions(-) diff --git a/manifest b/manifest index 60d679c81f..76c631decd 100644 --- 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. diff --git a/manifest.uuid b/manifest.uuid index 0ec8721a25..84434c2dcf 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -70b0cfb0493e3fe56645648b462cb035d0d791f95b2913b7622f08c1090338c0 +c892242bb642f7a6a961e310ed8b4f1e140f8ee32c00f50021c6011c6e7e1476 diff --git a/src/os_win.c b/src/os_win.c index 739be79b5a..c5342b2d03 100644 --- a/src/os_win.c +++ b/src/os_win.c @@ -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; } diff --git a/src/test_config.c b/src/test_config.c index 6ad7a90755..bdfb31e7d8 100644 --- a/src/test_config.c +++ b/src/test_config.c @@ -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), \ diff --git a/src/test_vfs.c b/src/test_vfs.c index 9f84b4f801..f75ef956b6 100644 --- a/src/test_vfs.c +++ b/src/test_vfs.c @@ -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; diff --git a/test/walsetlk.test b/test/walsetlk.test index 1e09238226..23fcac59d2 100644 --- a/test/walsetlk.test +++ b/test/walsetlk.test @@ -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 } #------------------------------------------------------------------------- -- 2.47.2