]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Add the pause/unpause capability to the opfs-sahpool VFS, as discussed in [forum...
authorstephan <stephan@noemail.net>
Thu, 20 Feb 2025 04:14:26 +0000 (04:14 +0000)
committerstephan <stephan@noemail.net>
Thu, 20 Feb 2025 04:14:26 +0000 (04:14 +0000)
FossilOrigin-Name: b5dbd521951e129b4dec69f191a872500dbf387b34a8479ad58b053ffcccbab9

1  2 
ext/wasm/GNUmakefile
ext/wasm/api/sqlite3-vfs-opfs-sahpool.c-pp.js
ext/wasm/index.html
ext/wasm/tester1.c-pp.js
manifest
manifest.uuid

index c9852e389c51b4b1969453bdf8c8f1f089991485,3e9621c6d23c0f3b8668bfa9dc9eab46bf7997a8..572a3cd3386fbe228209c26b2f8b3c4ef24becf4
@@@ -103,7 -103,7 +103,7 @@@ els
    ifeq (,$(filter $(OPTIMIZED_TARGETS),$(MAKECMDGOALS)))
      $(info ==============================================================)
      $(info == Development build. Make one of (dist, snapshot) for a)
--    $(info == smaller release build.)
++    $(info == smaller and faster release build.)
      $(info ==============================================================)
    endif
  endif
index 6551b5c89c0b679818ad6ac17d65204b333dafcf,39094a6f8090522cf268757cfc21ec6161f61d70..e1e7b45b8a86404420384328c3add6ea304cb20b
@@@ -860,6 -859,70 +859,70 @@@ globalThis.sqlite3ApiBootstrap.initiali
      }
  
  
 -       Undefined Behavior by closing file handles out from under any
 -       the library. Similarly, automatically closing any database
 -       handles opened by this VFS would invoke Undefined Behavior in
+     /**
+        "Pauses" this VFS by unregistering it from SQLite and
+        relinquishing all open SAHs, leaving the associated files
+        intact. If this object is already paused, this is a
+        no-op. Returns this object.
+        This function throws if SQLite has any opened file handles
+        hosted by this VFS, as the alternative would be to invoke
++       Undefined Behavior by closing file handles out from under the
++       library. Similarly, automatically closing any database handles
++       opened by this VFS would invoke Undefined Behavior in
+        downstream code which is holding those pointers.
+        If this function throws due to open file handles then it has
+        no side effects. If the OPFS API throws while closing handles
+        then the VFS is left in an undefined state.
+        @see isPaused()
+        @see unpauseVfs()
+     */
+     pauseVfs(){
+       if(this.#mapS3FileToOFile_.size>0){
+         sqlite3.SQLite3Error.toss(
+           capi.SQLITE_MISUSE, "Cannot pause VFS",
+           this.vfsName,"because it has opened files."
+         );
+       }
+       if(this.#mapSAHToName.size>0){
+         capi.sqlite3_vfs_unregister(this.vfsName);
+         this.releaseAccessHandles();
+       }
+       return this;
+     }
+     /**
+        Returns true if this pool is currently paused else false.
+        @see pauseVfs()
+        @see unpauseVfs()
+     */
+     isPaused(){
+       return 0===this.#mapSAHToName.size;
+     }
+     /**
+        "Unpauses" this VFS, reacquiring all SAH's and (if successful)
+        re-registering it with SQLite. This is a no-op if the VFS is
+        not currently paused.
+        The returned Promise resolves to this object. See
+        acquireAccessHandles() for how it behaves if it throws due to
+        SAH acquisition failure.
+        @see isPaused()
+        @see pauseVfs()
+     */
+     async unpauseVfs(){
+       if(0===this.#mapSAHToName.size){
+         return this.acquireAccessHandles(false).
+           then(()=>capi.sqlite3_vfs_register(this.#cVfs, 0),this);
+       }
+       return this;
+     }
      //! Documented elsewhere in this file.
      exportFile(name){
        const sah = this.#mapFilenameToSAH.get(name) || toss("File not found:",name);
       Clears all client-defined state of all SAHs and makes all of them
       available for re-use by the pool. Results are undefined if any such
       handles are currently in use, e.g. by an sqlite3 db.
 -     since been removed). Generically speaking, there is recovery
+      APIs specific to the "pause" capability (added in version 3.49):
+      Summary: "pausing" the VFS disassociates it from SQLite and
+      relinquishes its SAHs so that they may be opened by another
+      instance of this VFS (running in a separate tab/page or Worker).
+      "Unpausing" it takes back control, if able.
+      - pauseVfs()
+      "Pauses" this VFS by unregistering it from SQLite and
+      relinquishing all open SAHs, leaving the associated files intact.
+      This enables pages/tabs to coordinate semi-concurrent usage of
+      this VFS.  If this object is already paused, this is a
+      no-op. Returns this object. Throws if SQLite has any opened file
+      handles hosted by this VFS. If this function throws due to open
+      file handles then it has no side effects. If the OPFS API throws
+      while closing handles then the VFS is left in an undefined state.
+      - isPaused()
+      Returns true if this VFS is paused, else false.
+      - [async] unpauseVfs()
+      Restores the VFS to an active state after having called
+      pauseVfs() on it.  This is a no-op if the VFS is not paused. The
+      returned Promise resolves to this object on success. A rejected
+      Promise means there was a problem reacquiring the SAH handles
+      (possibly because they're in use by another instance or have
++     since been removed). Generically speaking, there is no recovery
+      strategy for that type of error, but if the problem is simply
+      that the OPFS files are locked, then a later attempt to unpause
+      it, made after the concurrent instance releases the SAHs, may
+      recover from the situation.
    */
    sqlite3.installOpfsSAHPoolVfs = async function(options=Object.create(null)){
      options = Object.assign(Object.create(null), optionDefaults, (options||{}));
Simple merge
Simple merge
diff --cc manifest
index 820f3bc2dc7ddee120193df5142302691bd3fb58,eef00b8912daafd4cec8ba43f35b5d081be8d1ff..aa980f3b58a2531c1435e509072c502db8565b4e
+++ b/manifest
@@@ -1,5 -1,5 +1,5 @@@
- C configure:\swhen\srunning\sproj-check-function-in-lib,\sstrip\s-Werror\sfrom\sCFLAGS\sfor\sthe\sduration\sof\sthe\stest.\sThis\senables\sCFLAGS='-Wall\s-Werror'\sand\sthe\slike\sto\sbe\spassed\sto\sconfigure\swithout\sbreaking\sthese\sconfigure-time\schecks.
- D 2025-02-20T03:27:47.397
 -C Minor\scleanups\sin\sthe\sopfs-sahpool\spause/unpause\sAPI\sdemo.
 -D 2025-01-31T17:47:47.173
++C Add\sthe\spause/unpause\scapability\sto\sthe\sopfs-sahpool\sVFS,\sas\sdiscussed\sin\s[forum:fe8cdb8431c|forum\sthread\sfe8cdb8431c].\sSummary:\sthis\sgives\sclients\sa\sway\sto\seke\ssome\sdegree\sof\smulti-page/tab/Worker\sconcurrency\sout\sof\sthis\sVFS\sbut\srequires\sthat\scoordination\sto\sbe\simplemented\sclient-side,\se.g.\svia\sa\sSharedWorker\sor\sWebLocks.
++D 2025-02-20T04:14:26.736
  F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
  F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
  F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d
@@@ -615,11 -615,11 +615,11 @@@ F ext/session/sessionrowid.test 85187c2
  F ext/session/sessionsize.test 8fcf4685993c3dbaa46a24183940ab9f5aa9ed0d23e5fb63bfffbdb56134b795
  F ext/session/sessionstat1.test 5e718d5888c0c49bbb33a7a4f816366db85f59f6a4f97544a806421b85dc2dec
  F ext/session/sessionwor.test 6fd9a2256442cebde5b2284936ae9e0d54bde692d0f5fd009ecef8511f4cf3fc
 -F ext/session/sqlite3session.c 01e321269fe21982b79336c8b7a4b83ef0779f5c1644a04c8bb7c1174c8c71ae
 -F ext/session/sqlite3session.h 683ccbf16e2c2521661fc4c1cf918ce57002039efbcabcd8097fa4bca569104b
 +F ext/session/sqlite3session.c 52a680dbb03c4734748b215d95987fb4d95ab23baaf053a01ac2626610963b58
 +F ext/session/sqlite3session.h aa5de3ec8ef0e5313e9f65dafd69e8ba292d170f07b57da9200c040068dab061
  F ext/session/test_session.c 12e0a2c15fd60f92da4bb29c697c9177ff0c0dbcdc5129a54c47e999f147937a
  F ext/wasm/EXPORTED_FUNCTIONS.fiddle.in 27450c8b8c70875a260aca55435ec927068b34cef801a96205adb81bdcefc65c
- F ext/wasm/GNUmakefile 06e0556e9840fd3d8870997025c2507ace9ba7bf11195f770295fc7947dfc1b5
 -F ext/wasm/GNUmakefile 47f121d057c08ba49443c06c1c51ba2572e3d5d28a06c968cf0b2ccd5878c3d3
++F ext/wasm/GNUmakefile 7889f9c5bab69233a65109e2bd00d627cab7470060e1b13b37781ac1b127f6c6
  F ext/wasm/README-dist.txt f01081a850ce38a56706af6b481e3a7878e24e42b314cfcd4b129f0f8427066a
  F ext/wasm/README.md b89605f65661cf35bf034ff6d43e448cc169b8017fc105d498e33b81218b482c
  F ext/wasm/SQLTester/GNUmakefile e0794f676d55819951bbfae45cc5e8d7818dc460492dc317ce7f0d2eca15caff
@@@ -645,11 -645,11 +645,11 @@@ F ext/wasm/api/sqlite3-api-worker1.c-pp
  F ext/wasm/api/sqlite3-license-version-header.js 0c807a421f0187e778dc1078f10d2994b915123c1223fe752b60afdcd1263f89
  F ext/wasm/api/sqlite3-opfs-async-proxy.js 3774befd97cd1a5e2895c8225a894aad946848c6d9b4028acc988b5d123475af
  F ext/wasm/api/sqlite3-vfs-helper.c-pp.js 3f828cc66758acb40e9c5b4dcfd87fd478a14c8fb7f0630264e6c7fa0e57515d
- F ext/wasm/api/sqlite3-vfs-opfs-sahpool.c-pp.js bb5e96cd0fd6e1e54538256433f1c60a4e3095063c4d1a79a8a022fc59be9571
 -F ext/wasm/api/sqlite3-vfs-opfs-sahpool.c-pp.js 4878cf2a19577093ea82b505f0b052147ca11d27575106c1bb30d2f58efc80a4
++F ext/wasm/api/sqlite3-vfs-opfs-sahpool.c-pp.js ce59229719220d64f491081bb2b423cea61cff171abcc7ac4ffc2f3687d27788
  F ext/wasm/api/sqlite3-vfs-opfs.c-pp.js 9b86ca2d8276cf919fbc9ba2a10e9786033b64f92c2db844d951804dee6c4b4e
  F ext/wasm/api/sqlite3-vtab-helper.c-pp.js e809739d71e8b35dfe1b55d24d91f02d04239e6aef7ca1ea92a15a29e704f616
 -F ext/wasm/api/sqlite3-wasm.c 83f5e9f998e9fa4261eb84e9f092210e3ffe03895119f5ded0429eb34ab9d2be
 +F ext/wasm/api/sqlite3-wasm.c 6f9d8529072d072359cd22dc5dfb0572c524684686569cfbd0f9640d7619fc10
- F ext/wasm/api/sqlite3-worker1-promiser.c-pp.js 46f303ba8ddd1b2f0a391798837beddfa72e8c897038c8047eda49ce7d5ed46b
+ F ext/wasm/api/sqlite3-worker1-promiser.c-pp.js bc65debfe43b81fc39fb25c40ad0cc1946bd82580fbf644351107b544d6177ee
  F ext/wasm/api/sqlite3-worker1.c-pp.js 5e8706c2c4af2a57fbcdc02f4e7ef79869971bc21bb8ede777687786ce1c92d5
  F ext/wasm/batch-runner-sahpool.html e9a38fdeb36a13eac7b50241dfe7ae066fe3f51f5c0b0151e7baee5fce0d07a7
  F ext/wasm/batch-runner-sahpool.js 54a3ac228e6c4703fe72fb65c897e19156263a51fe9b7e21d2834a45e876aabd
@@@ -677,10 -677,10 +677,10 @@@ F ext/wasm/fiddle/fiddle-worker.js 850e
  F ext/wasm/fiddle/fiddle.js b444a5646a9aac9f3fc06c53d78af5e1912eb235d69a8e6010723e4eb0e9d4a1
  F ext/wasm/fiddle/index.html c79b1741cbeba78f88af0a84cf5ec7de87a909a6a8d10a369b1f4824c66c2088
  F ext/wasm/index-dist.html 56132399702b15d70c474c3f1952541e25cb0922942868f70daf188f024b3730
- F ext/wasm/index.html e4bbffdb3d40eff12b3f9c7abedef91787e2935620b7f8d40f2c774b80ad8fa9
 -F ext/wasm/index.html fd3b5185ae5c436626c939b40c274110f7a1d0c1d7c50588c1f449f9a038a9d8
++F ext/wasm/index.html bcaa00eca521b372a6a62c7e7b17a870b0fcdf3e418a5921df1fd61e5344080d
  F ext/wasm/jaccwabyt/jaccwabyt.js 1264710db3cfbcb6887d95665b7aeba60c1126eaef789ca4cf1a4a17d5bc7f54
  F ext/wasm/jaccwabyt/jaccwabyt.md 59a20df389abcc3606eb4eaea7fb7ba14504beb3e345dbea9b99a0618ba3bec8
 -F ext/wasm/mkwasmbuilds.c d5885bacf2253bed913cdc7eb16b44f9c9e782133e10600652d1a78841c337af
 +F ext/wasm/mkwasmbuilds.c baf6636e139e2c1e3b56e8dc26073ec80f6d14ae1876b023985315f43ccf312b
  F ext/wasm/module-symbols.html dc476b403369b26a1a23773e13b80f41b9a49f0825e81435fe3600a7cfbbe337
  F ext/wasm/scratchpad-wasmfs.html a3d7388f3c4b263676b58b526846e9d02dfcb4014ff29d3a5040935286af5b96
  F ext/wasm/scratchpad-wasmfs.mjs 66034b9256b218de59248aad796760a1584c1dd842231505895eff00dbd57c63
@@@ -696,13 -696,16 +696,16 @@@ F ext/wasm/test-opfs-vfs.html 1f2d672f3
  F ext/wasm/test-opfs-vfs.js 1618670e466f424aa289859fe0ec8ded223e42e9e69b5c851f809baaaca1a00c
  F ext/wasm/tester1-worker.html ebc4b820a128963afce328ecf63ab200bd923309eb939f4110510ab449e9814c
  F ext/wasm/tester1.c-pp.html 1c1bc78b858af2019e663b1a31e76657b73dc24bede28ca92fbe917c3a972af2
- F ext/wasm/tester1.c-pp.js 05a0143c44a4114aad0ed40ce73c528febc3e0d6b69f48a51c895d7030015b74
 -F ext/wasm/tester1.c-pp.js 0cda9a3180e743f4a42500cbcde1a14da920b34697eb4b05adedac0dab5381de
++F ext/wasm/tester1.c-pp.js f3a3cbf0207287c4caa9f84b4e2934804e4b5720c71eaf143f33c8122bd3c9f2
  F ext/wasm/tests/opfs/concurrency/index.html 657578a6e9ce1e9b8be951549ed93a6a471f4520a99e5b545928668f4285fb5e
  F ext/wasm/tests/opfs/concurrency/test.js d08889a5bb6e61937d0b8cbb78c9efbefbf65ad09f510589c779b7cc6a803a88
  F ext/wasm/tests/opfs/concurrency/worker.js 0a8c1a3e6ebb38aabbee24f122693f1fb29d599948915c76906681bb7da1d3d2
+ F ext/wasm/tests/opfs/sahpool/index.html be736567fd92d3ecb9754c145755037cbbd2bca01385e2732294b53f4c842328
+ F ext/wasm/tests/opfs/sahpool/sahpool-pausing.js f264925cfc82155de38cecb3d204c36e0f6991460fff0cb7c15079454679a4e2
+ F ext/wasm/tests/opfs/sahpool/sahpool-worker.js bd25a43fc2ab2d1bafd8f2854ad3943ef673f7c3be03e95ecf1612ff6e8e2a61
  F ext/wasm/wasmfs.make 68999f5bd8c489239592d59a420f8c627c99169bbd6fa16a404751f757b9f702
  F magic.txt 5ade0bc977aa135e79e3faaea894d5671b26107cc91e70783aa7dc83f22f3ba0
 -F main.mk 043987843e8365dbaf74dce60c11683b62e2bcfcb3122574c14a0324d37a72f3
 +F main.mk 323e71cd79e49c9e33d39b6558694a71c08973d9ac3ee4f211aa32e58bd876f5
  F mptest/config01.test 3c6adcbc50b991866855f1977ff172eb6d901271
  F mptest/config02.test 4415dfe36c48785f751e16e32c20b077c28ae504
  F mptest/crash01.test 61e61469e257df0850df4293d7d4d6c2af301421
@@@ -2207,8 -2212,8 +2210,9 @@@ F tool/version-info.c 3b36468a90faf1bbd
  F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7
  F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139
  F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
- P 628407f03d4bfb7499f0e6e2197089edf859380a3c4e6fecc517390327718141
- R 0566dfd2338327afb5cc1d164e7ce94d
 -P f7c3026b0d2e33cc4e3b906810d860b155b1ff714bbe4e1eb9ee392122217efa
 -R d3225c8561b09d79116dc329da2feefd
++P 4ae9d6c642295e3a0c1732dacf7c18ecacd39d3e74e38381ac5531c8396f5f1c e205cdc468e02eefdeb8d391d921aa2d4d28a8b7b87036d6d937a9928261a413
++R 224600d4f738e50568ab6b26e5819abb
++T +closed e205cdc468e02eefdeb8d391d921aa2d4d28a8b7b87036d6d937a9928261a413 Closed\sby\sintegrate-merge.
  U stephan
- Z b470bbb1231ec7883dd8df58ba06834f
 -Z 1cb85d7c9b9ce473d92184ec221c275c
++Z 8b67a5570124816c376abd5faa1b9b7a
  # Remove this line to create a well-formed Fossil manifest.
diff --cc manifest.uuid
index d915946f6d9c795edc7d57af01214642270995be,abe785492ffa46832ac43460d30ab58e4e408c77..5a2129b963c3f69a58b15b3497d897b3406b535e
@@@ -1,1 -1,1 +1,1 @@@
- 4ae9d6c642295e3a0c1732dacf7c18ecacd39d3e74e38381ac5531c8396f5f1c
 -e205cdc468e02eefdeb8d391d921aa2d4d28a8b7b87036d6d937a9928261a413
++b5dbd521951e129b4dec69f191a872500dbf387b34a8479ad58b053ffcccbab9