1
0
mirror of https://github.com/sqlite/sqlite.git synced 2026-01-06 08:01: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)=>{
if(0){
/* This approach makes the very wild assumption that such a
failure _is_ a locking error. In practice that appears to be
the most common error, by far, but we cannot unambiguously
distinguish that from other errors.
This approach is highly questionable.
Note that even if we return SQLITE_IOERR_LOCK from here,
it bubbles up to the client as a plain I/O error.
*/
return (e instanceof GetSyncHandleError
&& e.cause.name==='NoModificationAllowedError')
? state.sq3Codes.SQLITE_IOERR_LOCK
: rc;
if(1){
return (
e instanceof GetSyncHandleError
&& ((e.cause.name==='NoModificationAllowedError')
/* Inconsistent exception.name from Chrome/ium with the
same exception.message text: */
|| (e.cause.name==='DOMException'
&& 0===e.cause.message.indexOf('Access Handles cannot')))
) ? (
/*console.warn("SQLITE_BUSY",e),*/
state.sq3Codes.SQLITE_BUSY
) : rc;
}else{
return rc;
}
@@ -298,7 +295,7 @@ const installAsyncProxy = function(self){
if(!fh.syncHandle){
const t = performance.now();
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;
for(; true; ms = msBase * ++i){
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
lock contention to free up.
*/
state.asyncIdleWaitTime = 100;
state.asyncIdleWaitTime = 150;
/**
Whether the async counterpart should log exceptions to
the serialization channel. That produces a great deal of
@@ -636,6 +636,12 @@ const installOpfsVfs = function callee(options){
a[i] = f._chars[ndx];
}
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;",
/* Set a default busy-timeout handler to help OPFS dbs
deal with multi-tab/multi-worker contention. */
"pragma busy_timeout=3000;",
"pragma busy_timeout=5000;",
/*
This vfs benefits hugely from cache on moderate/large
speedtest1 --size 50 and --size 100 workloads. We currently