1
0
mirror of https://github.com/sqlite/sqlite.git synced 2025-07-30 19:03:16 +03:00

Add return value checks to kvstorageWrite(), necessary for recognizing storage-full errors in the JS binding. speedtest1-kvvfs.html runs successfully on localStorage with --size 1 to 6 and starts failing with storage shortage at --size 7.

FossilOrigin-Name: 13839759f8f45e4eb0aa6a5052801f3964d5b2dc2e427e5e91ee6692176381eb
This commit is contained in:
stephan
2022-09-16 01:05:19 +00:00
parent 28ef9bddb3
commit 0144a8482a
7 changed files with 80 additions and 32 deletions

View File

@ -330,6 +330,7 @@ all: batch
# speedtest1.eflags = emcc flags used by main build of speedtest1
speedtest1-common.eflags := -g $(emcc_opt)
speedtest1.eflags :=
speedtest1.eflags += -sENVIRONMENT=web
speedtest1-common.eflags += -sINVOKE_RUN=0
#speedtest1-common.eflags += --no-entry
speedtest1-common.eflags += -flto
@ -342,7 +343,24 @@ speedtest1-common.eflags += -sEXPORTED_FUNCTIONS=_main,_malloc,_free
speedtest1-common.eflags += -sDYNAMIC_EXECUTION=0
speedtest1-common.eflags += --minify 0
speedtest1-common.eflags += -sEXPORT_NAME=sqlite3Speedtest1InitModule
speedtest1.eflags += -sENVIRONMENT=web
speedtest1.exit-runtime0 := -sEXIT_RUNTIME=0
speedtest1.exit-runtime1 := -sEXIT_RUNTIME=1
# Re -sEXIT_RUNTIME=1 vs 0: if it's 1 and speedtest1 crashes, we get
# this error from emscripten:
#
# > native function `free` called after runtime exit (use
# NO_EXIT_RUNTIME to keep it alive after main() exits))
#
# If it's 0 and it crashes, we get:
#
# > stdio streams had content in them that was not flushed. you should
# set EXIT_RUNTIME to 1 (see the FAQ), or make sure to emit a newline
# when you printf etc.
#
# and pending output is not flushed because it didn't end with a
# newline (by design). The lesser of the two evils seems to be
# -sEXIT_RUNTIME=1 but we need EXIT_RUNTIME=0 for the worker-based app
# which runs speedtest1 multiple times.
speedtest1.js := speedtest1.js
speedtest1.wasm := $(subst .js,.wasm,$(speedtest1.js))
@ -360,6 +378,7 @@ $(speedtest1.js): $(speedtest1.c) $(sqlite3-wasm.c) $(MAKEFILE) $(sqlite3.c)
$(emcc.bin) \
$(speedtest1.eflags) $(speedtest1-common.eflags) $(speedtest1.cflags) \
$(SQLITE_OPT) \
$(speedtest1.exit-runtime0) \
'-DSQLITE_DEFAULT_UNIX_VFS="unix-none"' \
-o $@ $(speedtest1.c) $(sqlite3-wasm.c) -lm
$(maybe-wasm-strip) $(speedtest1.wasm)

View File

@ -103,7 +103,7 @@ $(speedtest1-kvvfs.js): $(speedtest1.c) $(sqlite3-wasm.c) $(sqlite3.c) $(MAKEFIL
$(emcc.bin) \
$(speedtest1.eflags) $(speedtest1-common.eflags) $(speedtest1.cflags) \
$(SQLITE_OPT) \
-sEXIT_RUNTIME=1 \
$(speedtest1.exit-runtime1) \
$(kvvfs.cflags) \
-o $@ $(speedtest1.c) $(sqlite3-wasm.c) -lm
$(maybe-wasm-strip) $(speedtest1-kvvfs.wasm)

View File

@ -6,10 +6,10 @@
<link rel="shortcut icon" href="data:image/x-icon;," type="image/x-icon">
<link rel="stylesheet" href="common/emscripten.css"/>
<link rel="stylesheet" href="common/testing.css"/>
<title>speedtest1.wasm</title>
<title>speedtest1-kvvfs.wasm</title>
</head>
<body>
<header id='titlebar'><span>speedtest1.wasm</span></header>
<header id='titlebar'><span>speedtest1-kvvfs.wasm</span></header>
<div>See also: <a href='speedtest1-worker.html'>A Worker-thread variant of this page.</a></div>
<!-- emscripten bits -->
<figure id="module-spinner">
@ -63,12 +63,28 @@
console.error(...args);
logList.push('ERROR: '+args.join(' '));
};
const guessStorageSize = function(which=''){
let sz = 0;
const prefix = 'kvvfs-'+which;
[localStorage,sessionStorage].forEach((s)=>{
let i;
for(i = 0; i < s.length; ++i){
const k = s.key(i);
if(k.startsWith(prefix)){
sz += k.length;
sz += s.getItem(k).length;
}
}
});
return sz;
};
const clearStorage = function(){
sessionStorage.clear();
localStorage.clear();
};
const runTests = function(EmscriptenModule){
console.log("Module inited.",EmscriptenModule);
console.log("Module inited.",EmscriptenModule);
const wasm = {
exports: EmscriptenModule.asm,
@ -83,7 +99,7 @@
const scope = wasm.scopedAllocPush();
const dbFile = 0 ? "session" : "local";
const urlArgs = self.SqliteTestUtil.processUrlArgs();
const argv = ["speedtest1", "--size", "1"];
const argv = ["speedtest1", "--size", "5"];
if(urlArgs.flags){
// transform flags=a,b,c to ["--a", "--b", "--c"]
argv.push(...(urlArgs.flags.split(',').map((v)=>'--'+v)));
@ -93,10 +109,14 @@
"--nomutex",
"--nosync",
"--nomemstat"
//"--sqlonly"
);
//argv.push("--memdb" /* note that memdb trumps the filename arg */);
argv.push("--big-transactions"/*important for tests 410 and 510!*/,
dbFile);
}
argv.push("--big-transactions"/*important for tests 410 and 510!*/,
dbFile);
if(argv.indexOf('--memdb')>=0){
log2('error',"WARNING: --memdb flag trumps db filename.");
}
console.log("argv =",argv);
// These log messages are not emitted to the UI until after main() returns. Fixing that
@ -119,8 +139,9 @@
wasm.scopedAllocPop(scope);
logList.unshift("Done running native main(). Output:");
dumpLogList();
log2('warning',"Clearing session/local storage.");
clearStorage();
log2('',"Approximate",dbFile,"storage usage:",guessStorageSize(),"bytes");
log2('warning',"Clearing",dbFile,"storage.");
clearStorage(dbFile);
});
}/*runTests()*/;

View File

@ -41,6 +41,9 @@
<span>&rarr; <a id='link-wasmfs' href='#' target='speedtest-wasmfs'
title='Start speedtest1-wasmfs.html with the selected flags'>speedtest1-wasmfs.html</a>
</span>
<span>&rarr; <a id='link-kvvfs' href='#' target='speedtest-kvvfs'
title='Start speedtest1-kvvfs.html with the selected flags'>speedtest1-kvvfs.html</a>
</span>
</div>
</div>
<div class='toolbar-inner-vertical' id='toolbar-runner-controls'>
@ -173,6 +176,7 @@
const eSelectedFlags = E('#toolbar-selected-flags');
const eLinkMainThread = E('#link-main-thread');
const eLinkWasmfs = E('#link-wasmfs');
const eLinkKvvfs = E('#link-kvvfs');
const getSelectedFlags = ()=>Array.prototype.map.call(eFlags.selectedOptions, (v)=>v.value);
const updateSelectedFlags = function(){
eSelectedFlags.innerText = '';
@ -188,6 +192,8 @@
eLinkMainThread.href = 'speedtest1.html?flags='+comma;
eLinkWasmfs.setAttribute('target', 'speedtest1-wasmfs-'+comma);
eLinkWasmfs.href = 'speedtest1-wasmfs.html?flags='+comma;
eLinkKvvfs.setAttribute('target', 'speedtest1-kvvfs-'+comma);
eLinkKvvfs.href = 'speedtest1-kvvfs.html?flags='+comma;
};
eFlags.addEventListener('change', updateSelectedFlags );
{