1
0
mirror of https://github.com/sqlite/sqlite.git synced 2025-08-08 14:02:16 +03:00

OPFS VFS: translate createSyncAccessHandle() exceptions which appear to be locking violations to SQLITE_BUSY. This seems to improve concurrency considerably even with a reduced retry count of 5 (was 6).

FossilOrigin-Name: 0d36021d107d3afca190ad61c3380536ad0cc2d493d345d48f9f9c1191741128
This commit is contained in:
stephan
2022-12-02 18:06:26 +00:00
parent d2603adf46
commit 95bc4d67bb
5 changed files with 35 additions and 29 deletions

View File

@@ -263,21 +263,18 @@ const installAsyncProxy = function(self){
} }
}; };
GetSyncHandleError.convertRc = (e,rc)=>{ GetSyncHandleError.convertRc = (e,rc)=>{
if(0){ if(1){
/* This approach makes the very wild assumption that such a return (
failure _is_ a locking error. In practice that appears to be e instanceof GetSyncHandleError
the most common error, by far, but we cannot unambiguously && ((e.cause.name==='NoModificationAllowedError')
distinguish that from other errors. /* Inconsistent exception.name from Chrome/ium with the
same exception.message text: */
This approach is highly questionable. || (e.cause.name==='DOMException'
&& 0===e.cause.message.indexOf('Access Handles cannot')))
Note that even if we return SQLITE_IOERR_LOCK from here, ) ? (
it bubbles up to the client as a plain I/O error. /*console.warn("SQLITE_BUSY",e),*/
*/ state.sq3Codes.SQLITE_BUSY
return (e instanceof GetSyncHandleError ) : rc;
&& e.cause.name==='NoModificationAllowedError')
? state.sq3Codes.SQLITE_IOERR_LOCK
: rc;
}else{ }else{
return rc; return rc;
} }
@@ -298,7 +295,7 @@ const installAsyncProxy = function(self){
if(!fh.syncHandle){ if(!fh.syncHandle){
const t = performance.now(); const t = performance.now();
log("Acquiring sync handle for",fh.filenameAbs); log("Acquiring sync handle for",fh.filenameAbs);
const maxTries = 6, msBase = state.asyncIdleWaitTime * 3; const maxTries = 5, msBase = state.asyncIdleWaitTime * 2;
let i = 1, ms = msBase; let i = 1, ms = msBase;
for(; true; ms = msBase * ++i){ for(; true; ms = msBase * ++i){
try { try {

View File

@@ -277,7 +277,7 @@ const installOpfsVfs = function callee(options){
of this value is also used for determining how long to wait on of this value is also used for determining how long to wait on
lock contention to free up. lock contention to free up.
*/ */
state.asyncIdleWaitTime = 100; state.asyncIdleWaitTime = 150;
/** /**
Whether the async counterpart should log exceptions to Whether the async counterpart should log exceptions to
the serialization channel. That produces a great deal of the serialization channel. That produces a great deal of
@@ -636,6 +636,12 @@ const installOpfsVfs = function callee(options){
a[i] = f._chars[ndx]; a[i] = f._chars[ndx];
} }
return a.join(""); return a.join("");
/*
An alternative impl. with an unpredictable length
but much simpler:
Math.floor(Math.random() * Number.MAX_SAFE_INTEGER).toString(36)
*/
}; };
/** /**
@@ -1159,7 +1165,7 @@ const installOpfsVfs = function callee(options){
"pragma journal_mode=persist;", "pragma journal_mode=persist;",
/* Set a default busy-timeout handler to help OPFS dbs /* Set a default busy-timeout handler to help OPFS dbs
deal with multi-tab/multi-worker contention. */ deal with multi-tab/multi-worker contention. */
"pragma busy_timeout=3000;", "pragma busy_timeout=5000;",
/* /*
This vfs benefits hugely from cache on moderate/large This vfs benefits hugely from cache on moderate/large
speedtest1 --size 50 and --size 100 workloads. We currently speedtest1 --size 50 and --size 100 workloads. We currently

View File

@@ -69,6 +69,7 @@
options.unlockAsap = ( options.unlockAsap = (
urlArgsHtml.has('unlock-asap') ? +urlArgsHtml.get('unlock-asap') : 0 urlArgsHtml.has('unlock-asap') ? +urlArgsHtml.get('unlock-asap') : 0
) || 0; ) || 0;
options.noUnlink = !!urlArgsHtml.has('no-unlink');
const workers = []; const workers = [];
workers.post = (type,...args)=>{ workers.post = (type,...args)=>{
for(const w of workers) w.postMessage({type, payload:args}); for(const w of workers) w.postMessage({type, payload:args});
@@ -124,7 +125,9 @@
for(let i = 0; i < options.workerCount; ++i){ for(let i = 0; i < options.workerCount; ++i){
stdout("Launching worker..."); stdout("Launching worker...");
workers.push(new Worker( workers.push(new Worker(
workers.uri+'&workerId='+(i+1)+(i ? '' : '&unlink-db') workers.uri+'&workerId='+(i+1)+(
(i || options.noUnlink) ? '' : '&unlink-db'
)
)); ));
} }
// Have to delay onmessage assignment until after the loop // Have to delay onmessage assignment until after the loop

View File

@@ -1,5 +1,5 @@
C For\sthe\ssqlite3_bind\sand\ssqlite3_result\sinterfaces\sfor\sUTF16\sstrings,\sround\nthe\snumber\sof\sbytes\sdown\sto\sthe\snext\seven\snumber,\sto\savoid\screating\sa\sUTF16\nstring\sthat\sis\san\sodd\snumber\sof\sbytes.\n[forum:/forumpost/411199488d065f83|Forum\spost\s411199488d065f83]. C OPFS\sVFS:\stranslate\screateSyncAccessHandle()\sexceptions\swhich\sappear\sto\sbe\slocking\sviolations\sto\sSQLITE_BUSY.\sThis\sseems\sto\simprove\sconcurrency\sconsiderably\seven\swith\sa\sreduced\sretry\scount\sof\s5\s(was\s6).
D 2022-12-02T17:52:52.611 D 2022-12-02T18:06:26.286
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -508,9 +508,9 @@ F ext/wasm/api/sqlite3-api-oo1.js c8b6c9ccb64cf93ca990ac689e98963735110aec21f98e
F ext/wasm/api/sqlite3-api-prologue.js 42d6b316b542cf8e086f2f272460deb72dff184f1438a3377383cab99b08070b F ext/wasm/api/sqlite3-api-prologue.js 42d6b316b542cf8e086f2f272460deb72dff184f1438a3377383cab99b08070b
F ext/wasm/api/sqlite3-api-worker1.js e94ba98e44afccfa482874cd9acb325883ade50ed1f9f9526beb9de1711f182f F ext/wasm/api/sqlite3-api-worker1.js e94ba98e44afccfa482874cd9acb325883ade50ed1f9f9526beb9de1711f182f
F ext/wasm/api/sqlite3-license-version-header.js a661182fc93fc2cf212dfd0b987f8e138a3ac98f850b1112e29b5fbdaecc87c3 F ext/wasm/api/sqlite3-license-version-header.js a661182fc93fc2cf212dfd0b987f8e138a3ac98f850b1112e29b5fbdaecc87c3
F ext/wasm/api/sqlite3-opfs-async-proxy.js 9963c78bf6e5ccb5ba28e8597851bd9d980e86803b6d341cc985e586aef10c82 F ext/wasm/api/sqlite3-opfs-async-proxy.js 132e27f2172411020bb3a35ce5897c6437a960b4d744e7b8bdf3c6e3e32369dd
F ext/wasm/api/sqlite3-vfs-helper.js 4ad4faf02e1524bf0296be8452c00b5708dce6faf649468d0377e26a0b299263 F ext/wasm/api/sqlite3-vfs-helper.js 4ad4faf02e1524bf0296be8452c00b5708dce6faf649468d0377e26a0b299263
F ext/wasm/api/sqlite3-vfs-opfs.c-pp.js 654f37fd6312d3bb0d067b21ad42f9dcfd629fd34ace892e67e06143a65dc6d0 F ext/wasm/api/sqlite3-vfs-opfs.c-pp.js 146fbdac3c2ffa006ad4e95430396496caca0584c70623ae64e6c452a82c0e7f
F ext/wasm/api/sqlite3-wasi.h 25356084cfe0d40458a902afb465df8c21fc4152c1d0a59b563a3fba59a068f9 F ext/wasm/api/sqlite3-wasi.h 25356084cfe0d40458a902afb465df8c21fc4152c1d0a59b563a3fba59a068f9
F ext/wasm/api/sqlite3-wasm.c 733bc939f93caef0df0b3ebfea14cbd528da580fdef1a35b1f69c2b3e044c7b7 F ext/wasm/api/sqlite3-wasm.c 733bc939f93caef0df0b3ebfea14cbd528da580fdef1a35b1f69c2b3e044c7b7
F ext/wasm/api/sqlite3-worker1-promiser.js 0c7a9826dbf82a5ed4e4f7bf7816e825a52aff253afbf3350431f5773faf0e4b F ext/wasm/api/sqlite3-worker1-promiser.js 0c7a9826dbf82a5ed4e4f7bf7816e825a52aff253afbf3350431f5773faf0e4b
@@ -557,7 +557,7 @@ F ext/wasm/tester1-worker.html ead6bdcc6cca221deb0dc9855a56f376351dbf2294fd7978c
F ext/wasm/tester1.c-pp.html 74aa9b31c75f12490653f814b53c3dd39f40cd3f70d6a53a716f4e8587107399 F ext/wasm/tester1.c-pp.html 74aa9b31c75f12490653f814b53c3dd39f40cd3f70d6a53a716f4e8587107399
F ext/wasm/tester1.c-pp.js e73a91eba4b59aaadd98f383c00a5101dbbbc52d937fff3162fc4761986f4a88 F ext/wasm/tester1.c-pp.js e73a91eba4b59aaadd98f383c00a5101dbbbc52d937fff3162fc4761986f4a88
F ext/wasm/tests/opfs/concurrency/index.html 86d8ac435074d1e7007b91105f4897f368c165e8cecb6a9aa3d81f5cf5dcbe70 F ext/wasm/tests/opfs/concurrency/index.html 86d8ac435074d1e7007b91105f4897f368c165e8cecb6a9aa3d81f5cf5dcbe70
F ext/wasm/tests/opfs/concurrency/test.js bfc3d7e27b207f0827f12568986b8d516a744529550b449314f5c21c9e9faf4a F ext/wasm/tests/opfs/concurrency/test.js 9315339ed27849e65890eda924a516562936525a4f3f162fa71aeb489b9dc707
F ext/wasm/tests/opfs/concurrency/worker.js 0a8c1a3e6ebb38aabbee24f122693f1fb29d599948915c76906681bb7da1d3d2 F ext/wasm/tests/opfs/concurrency/worker.js 0a8c1a3e6ebb38aabbee24f122693f1fb29d599948915c76906681bb7da1d3d2
F ext/wasm/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd72273503ae7d5 F ext/wasm/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd72273503ae7d5
F ext/wasm/wasmfs.make 7ab655788bf0b52dce4538acbd5b11cdbe77edd36a14af5dec6dfe1ec4ab25fc F ext/wasm/wasmfs.make 7ab655788bf0b52dce4538acbd5b11cdbe77edd36a14af5dec6dfe1ec4ab25fc
@@ -2065,8 +2065,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
P 5652154a8c93cf3b1ff6c2e55e94abbe995b0bb625f733461df20e006c2f13f8 P b57e3c3db00a6bc6db20c82530479f9eba7e37b731f0da6fe81682e84c7ac916
R abeafb6b0b2c2a0d499e07055ea2ac86 R 8232ca838233bb862b578dd17ef993c2
U drh U stephan
Z 85652852cafea1303e4df55e9d9dc80a Z a512e857bd2ba2b089c64ccfca3b82d0
# Remove this line to create a well-formed Fossil manifest. # Remove this line to create a well-formed Fossil manifest.

View File

@@ -1 +1 @@
b57e3c3db00a6bc6db20c82530479f9eba7e37b731f0da6fe81682e84c7ac916 0d36021d107d3afca190ad61c3380536ad0cc2d493d345d48f9f9c1191741128