Add tests for handling errors returned by xShm VFS methods.
FossilOrigin-Name: fbbcacb137e8f5246b88ad09331236aaa1900f60
This commit is contained in:
parent
5def0843f1
commit
8f6097c244
28
manifest
28
manifest
@ -1,8 +1,5 @@
|
||||
-----BEGIN PGP SIGNED MESSAGE-----
|
||||
Hash: SHA1
|
||||
|
||||
C Change\sthe\sbehavior\sof\sthe\ssqlite3_wal_hook()\scallback.\s\sIt\sshould\snow\sreturn\nSQLITE_OK\sor\san\serror\scode\sand\sthe\serror\scode\sis\spropagated\sback\sup\sthe\s\nstack.\s\sIf\sa\scheckpoint\sis\sdesired,\sthe\scallback\sshould\sinvoke\nsqlite3_wal_callback()\sitself.
|
||||
D 2010-05-05T20:00:26
|
||||
C Add\stests\sfor\shandling\serrors\sreturned\sby\sxShm\sVFS\smethods.
|
||||
D 2010-05-06T07:43:58
|
||||
F Makefile.arm-wince-mingw32ce-gcc fcd5e9cd67fe88836360bb4f9ef4cb7f8e2fb5a0
|
||||
F Makefile.in d83a0ffef3dcbfb08b410a6c6dd6c009ec9167fb
|
||||
F Makefile.linux-gcc d53183f4aa6a9192d249731c90dbdffbd2c68654
|
||||
@ -208,7 +205,7 @@ F src/test_schema.c 8c06ef9ddb240c7a0fcd31bc221a6a2aade58bf0
|
||||
F src/test_server.c bbba05c144b5fc4b52ff650a4328027b3fa5fcc6
|
||||
F src/test_tclvar.c f4dc67d5f780707210d6bb0eb6016a431c04c7fa
|
||||
F src/test_thread.c aa9919c885a1fe53eafc73492f0898ee6c0a0726
|
||||
F src/test_vfs.c 4e84d17c6f64913684cd9c92c41337c55b3f3dc9
|
||||
F src/test_vfs.c 43ae46c9636a4d568d98b1e175e68487fb53a6c7
|
||||
F src/test_wsd.c 41cadfd9d97fe8e3e4e44f61a4a8ccd6f7ca8fe9
|
||||
F src/tokenize.c 25ceb0f0a746ea1d0f9553787f3f0a56853cfaeb
|
||||
F src/trigger.c 8927588cb9e6d47f933b53bfe74200fbb504100d
|
||||
@ -225,7 +222,7 @@ F src/vdbeblob.c 5327132a42a91e8b7acfb60b9d2c3b1c5c863e0e
|
||||
F src/vdbemem.c 2a82f455f6ca6f78b59fb312f96054c04ae0ead1
|
||||
F src/vdbetrace.c 864cef96919323482ebd9986f2132435115e9cc2
|
||||
F src/vtab.c a0f8a40274e4261696ef57aa806de2776ab72cda
|
||||
F src/wal.c 85311299e9032957284b4c5b0f801fc4cb9416d6
|
||||
F src/wal.c 65a29bce101f417ca59b33f64a003b16dc993616
|
||||
F src/wal.h b4c42014b5fa3b4e6244ac8c65de7ff67adeb27c
|
||||
F src/walker.c 3112bb3afe1d85dc52317cb1d752055e9a781f8f
|
||||
F src/where.c 75fee9e255b62f773fcadd1d1f25b6f63ac7a356
|
||||
@ -765,7 +762,7 @@ F test/vtab_shared.test 0eff9ce4f19facbe0a3e693f6c14b80711a4222d
|
||||
F test/wal.test f0b331017a12a31dd4bbb20aee9c179fbfdd5921
|
||||
F test/walbak.test a0e45187c7d8928df035dfea29b99b016b21ca3c
|
||||
F test/walcrash.test f6d5fb2bb108876f04848720a488065d9deef69f
|
||||
F test/walfault.test 9146e22807d6c75885614f623f5c8b1272c8488e
|
||||
F test/walfault.test 3b62e7d2ca93f1e926953b2998361fee193a1fb7
|
||||
F test/walhook.test a1c375ae791d5d7d511c166159729230791c574d
|
||||
F test/walmode.test bac6f06544a8554588a1543def996bbe2fc41792
|
||||
F test/walslow.test d21625e2e99e11c032ce949e8a94661576548933
|
||||
@ -813,14 +810,7 @@ F tool/speedtest2.tcl ee2149167303ba8e95af97873c575c3e0fab58ff
|
||||
F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224
|
||||
F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e
|
||||
F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f
|
||||
P e9bfa6e4ce7d1edc6be8b9173ac3b6bfd180632a
|
||||
R e9fe5c9efad10446aa83b71914d33765
|
||||
U drh
|
||||
Z b26c7b5452be96cecc1a35cb38e6299b
|
||||
-----BEGIN PGP SIGNATURE-----
|
||||
Version: GnuPG v1.4.6 (GNU/Linux)
|
||||
|
||||
iD8DBQFL4c5doxKgR168RlERAuadAJ9ImhZl3Q6JfaSg2/LCnbmOP58sywCfTv4N
|
||||
Ru+croJcME10MvNF9/ygcGg=
|
||||
=+Gfk
|
||||
-----END PGP SIGNATURE-----
|
||||
P 1b14195e05fe5551992a39246ec3bcf6a33bbfac
|
||||
R 247944e575aec0054be286769ecb9238
|
||||
U dan
|
||||
Z 914dd1e720da590c7d1ff592008c385f
|
||||
|
@ -1 +1 @@
|
||||
1b14195e05fe5551992a39246ec3bcf6a33bbfac
|
||||
fbbcacb137e8f5246b88ad09331236aaa1900f60
|
@ -341,6 +341,7 @@ static void tvfsGrowBuffer(TestvfsShm *pShm, int reqSize, int *pNewSize){
|
||||
TestvfsBuffer *pBuffer = pShm->pBuffer;
|
||||
if( reqSize>pBuffer->n ){
|
||||
pBuffer->a = (u8 *)ckrealloc((char *)pBuffer->a, reqSize);
|
||||
memset(&pBuffer->a[pBuffer->n], 0x55, reqSize-pBuffer->n);
|
||||
pBuffer->n = reqSize;
|
||||
}
|
||||
*pNewSize = pBuffer->n;
|
||||
@ -467,11 +468,13 @@ static int tvfsShmSize(
|
||||
Testvfs *p = (Testvfs *)(pVfs->pAppData);
|
||||
TestvfsShm *pShm = (TestvfsShm *)pShmHandle;
|
||||
|
||||
tvfsGrowBuffer(pShm, reqSize, pNewSize);
|
||||
tvfsExecTcl(p, "xShmSize",
|
||||
Tcl_NewStringObj(pShm->pBuffer->zFile, -1), pShm->id, 0
|
||||
);
|
||||
tvfsResultCode(p, &rc);
|
||||
if( rc==SQLITE_OK ){
|
||||
tvfsGrowBuffer(pShm, reqSize, pNewSize);
|
||||
}
|
||||
return rc;
|
||||
}
|
||||
|
||||
@ -549,7 +552,9 @@ static int tvfsShmClose(
|
||||
TestvfsShm *pShm = (TestvfsShm *)pShmHandle;
|
||||
TestvfsBuffer *pBuffer = pShm->pBuffer;
|
||||
|
||||
#if 0
|
||||
assert( (deleteFlag!=0)==(pBuffer->nRef==1) );
|
||||
#endif
|
||||
|
||||
tvfsExecTcl(p, "xShmClose",
|
||||
Tcl_NewStringObj(pShm->pBuffer->zFile, -1), pShm->id, 0
|
||||
@ -759,6 +764,7 @@ static int testvfs_cmd(
|
||||
pVfs->zName = p->zName;
|
||||
pVfs->mxPathname = p->pParent->mxPathname;
|
||||
pVfs->szOsFile += p->pParent->szOsFile;
|
||||
p->pVfs = pVfs;
|
||||
|
||||
Tcl_CreateObjCommand(interp, zVfs, testvfs_obj_cmd, p, testvfs_obj_del);
|
||||
sqlite3_vfs_register(pVfs, 0);
|
||||
|
21
src/wal.c
21
src/wal.c
@ -670,7 +670,7 @@ static int walIteratorNext(
|
||||
return (iRet==0xFFFFFFFF);
|
||||
}
|
||||
|
||||
static WalIterator *walIteratorInit(Wal *pWal){
|
||||
static int walIteratorInit(Wal *pWal, WalIterator **pp){
|
||||
u32 *aData; /* Content of the wal-index file */
|
||||
WalIterator *p; /* Return value */
|
||||
int nSegment; /* Number of segments to merge */
|
||||
@ -680,8 +680,12 @@ static WalIterator *walIteratorInit(Wal *pWal){
|
||||
int nFinal; /* Number of unindexed entries */
|
||||
struct WalSegment *pFinal; /* Final (unindexed) segment */
|
||||
u8 *aTmp; /* Temp space used by merge-sort */
|
||||
int rc; /* Return code of walIndexMap() */
|
||||
|
||||
walIndexMap(pWal, -1);
|
||||
rc = walIndexMap(pWal, -1);
|
||||
if( rc!=SQLITE_OK ){
|
||||
return rc;
|
||||
}
|
||||
aData = pWal->pWiData;
|
||||
iLast = pWal->hdr.iLastPg;
|
||||
nSegment = (iLast >> 8) + 1;
|
||||
@ -689,6 +693,9 @@ static WalIterator *walIteratorInit(Wal *pWal){
|
||||
|
||||
nByte = sizeof(WalIterator) + (nSegment-1)*sizeof(struct WalSegment) + 512;
|
||||
p = (WalIterator *)sqlite3_malloc(nByte);
|
||||
if( !p ){
|
||||
return SQLITE_NOMEM;
|
||||
}
|
||||
|
||||
if( p ){
|
||||
memset(p, 0, nByte);
|
||||
@ -710,7 +717,8 @@ static WalIterator *walIteratorInit(Wal *pWal){
|
||||
p->nFinal = nFinal;
|
||||
}
|
||||
|
||||
return p;
|
||||
*pp = p;
|
||||
return SQLITE_OK;
|
||||
}
|
||||
|
||||
/*
|
||||
@ -737,11 +745,8 @@ static int walCheckpoint(
|
||||
u32 iFrame = 0; /* Wal frame containing data for iDbpage */
|
||||
|
||||
/* Allocate the iterator */
|
||||
pIter = walIteratorInit(pWal);
|
||||
if( !pIter ) return SQLITE_NOMEM;
|
||||
|
||||
if( pWal->hdr.iLastPg==0 ){
|
||||
rc = SQLITE_OK;
|
||||
rc = walIteratorInit(pWal, &pIter);
|
||||
if( rc!=SQLITE_OK || pWal->hdr.iLastPg==0 ){
|
||||
goto out;
|
||||
}
|
||||
|
||||
|
@ -53,17 +53,18 @@ do_malloc_test walfault-oom-2 -tclprep {
|
||||
}
|
||||
|
||||
# A [testvfs] callback for the VFS created by [do_shmfault_test]. This
|
||||
# callback injects SQLITE_IOERR faults into the following methods:
|
||||
# callback injects SQLITE_IOERR faults into methods for which an entry
|
||||
# in array ::shmfault_ioerr_methods is defined. For example, to enable
|
||||
# errors in xShmOpen:
|
||||
#
|
||||
# xShmOpen
|
||||
# xShmSize
|
||||
# xShmGet
|
||||
# set ::shmfault_ioerr_methods(xShmOpen) 1
|
||||
#
|
||||
# Faults are not injected into xShmRelease, xShmClose or xShmLock method
|
||||
# calls. The global tcl variables used are:
|
||||
#
|
||||
# $::shmfault_ioerr_countdown
|
||||
# $::shmfault_ioerr_persist
|
||||
# $::shmfault_ioerr_methods
|
||||
#
|
||||
proc shmfault_vfs_cb {method args} {
|
||||
|
||||
@ -71,10 +72,7 @@ proc shmfault_vfs_cb {method args} {
|
||||
#
|
||||
if {[info exists ::shmfault_ioerr_countdown]==0} { return SQLITE_OK }
|
||||
|
||||
if {$method == "xShmOpen"
|
||||
|| $method == "xShmSize"
|
||||
|| $method == "xShmGet"
|
||||
} {
|
||||
if {[info exists ::shmfault_ioerr_methods($method)]} {
|
||||
incr ::shmfault_ioerr_countdown -1
|
||||
if { ($::shmfault_ioerr_countdown==0)
|
||||
|| ($::shmfault_ioerr_countdown<=0 && $::shmfault_ioerr_persist)
|
||||
@ -85,25 +83,41 @@ proc shmfault_vfs_cb {method args} {
|
||||
return SQLITE_OK
|
||||
}
|
||||
|
||||
# Options are:
|
||||
#
|
||||
# -tclprep TCL
|
||||
# -sqlprep SQL
|
||||
# -sqlbody SQL
|
||||
#
|
||||
proc do_shmfault_test {name args} {
|
||||
|
||||
set A(-tclprep) "sqlite3 db test.db -vfs shmfault"
|
||||
set A(-sqlprep) ""
|
||||
set A(-sqlbody) ""
|
||||
set A(-methods) [list xShmGet xShmOpen xShmSize]
|
||||
array set A $args
|
||||
|
||||
# Create a VFS to use:
|
||||
testvfs shmfault shmfault_vfs_cb
|
||||
|
||||
unset -nocomplain ::shmfault_ioerr_methods
|
||||
foreach m $A(-methods) { set ::shmfault_ioerr_methods($m) 1 }
|
||||
|
||||
foreach mode {transient persistent} {
|
||||
set ::shmfault_ioerr_persist [expr {$mode == "persistent"}]
|
||||
|
||||
for {set nDelay 1} {$nDelay < 10000} {incr nDelay} {
|
||||
set ::shmfault_ioerr_countdown $nDelay
|
||||
|
||||
file delete -force test.db test.db-wal test.db-journal
|
||||
|
||||
set rc [catch {
|
||||
sqlite3 db test.db -vfs shmfault
|
||||
db eval $A(-sqlbody)
|
||||
} msg]
|
||||
|
||||
eval $A(-tclprep)
|
||||
db eval $A(-sqlprep)
|
||||
|
||||
set ::shmfault_ioerr_countdown $nDelay
|
||||
set rc [catch { db eval $A(-sqlbody) } msg]
|
||||
set hit_error [expr {$::shmfault_ioerr_countdown<=0}]
|
||||
unset ::shmfault_ioerr_countdown
|
||||
|
||||
catch { db close }
|
||||
|
||||
do_test $name-$mode.$nDelay.1 [list set {} $hit_error] $rc
|
||||
@ -115,6 +129,7 @@ proc do_shmfault_test {name args} {
|
||||
shmfault delete
|
||||
}
|
||||
|
||||
|
||||
do_shmfault_test walfault-shm-1 -sqlbody {
|
||||
PRAGMA journal_mode = WAL;
|
||||
CREATE TABLE t1(a PRIMARY KEY, b);
|
||||
@ -122,5 +137,69 @@ do_shmfault_test walfault-shm-1 -sqlbody {
|
||||
PRAGMA wal_checkpoint;
|
||||
}
|
||||
|
||||
do_shmfault_test walfault-shm-2 -methods xShmSize -sqlprep {
|
||||
PRAGMA page_size = 512;
|
||||
PRAGMA journal_mode = WAL;
|
||||
PRAGMA wal_autocheckpoint = 0;
|
||||
} -sqlbody {
|
||||
CREATE TABLE t1(x);
|
||||
BEGIN;
|
||||
INSERT INTO t1 VALUES(randomblob(400)); /* 1 */
|
||||
INSERT INTO t1 SELECT randomblob(400) FROM t1; /* 2 */
|
||||
INSERT INTO t1 SELECT randomblob(400) FROM t1; /* 4 */
|
||||
INSERT INTO t1 SELECT randomblob(400) FROM t1; /* 8 */
|
||||
INSERT INTO t1 SELECT randomblob(400) FROM t1; /* 16 */
|
||||
INSERT INTO t1 SELECT randomblob(400) FROM t1; /* 32 */
|
||||
INSERT INTO t1 SELECT randomblob(400) FROM t1; /* 64 */
|
||||
INSERT INTO t1 SELECT randomblob(400) FROM t1; /* 128 */
|
||||
INSERT INTO t1 SELECT randomblob(400) FROM t1; /* 256 */
|
||||
INSERT INTO t1 SELECT randomblob(400) FROM t1; /* 512 */
|
||||
INSERT INTO t1 SELECT randomblob(400) FROM t1; /* 1024 */
|
||||
INSERT INTO t1 SELECT randomblob(400) FROM t1; /* 2048 */
|
||||
INSERT INTO t1 SELECT randomblob(400) FROM t1; /* 4096 */
|
||||
INSERT INTO t1 SELECT randomblob(400) FROM t1; /* 8192 */
|
||||
INSERT INTO t1 SELECT randomblob(400) FROM t1; /* 16384 */
|
||||
COMMIT;
|
||||
}
|
||||
|
||||
do_shmfault_test walfault-shm-3 -methods xShmSize -tclprep {
|
||||
sqlite3 db test.db -vfs shmfault
|
||||
unset -nocomplain ::shmfault_ioerr_countdown
|
||||
db eval {
|
||||
PRAGMA page_size = 512;
|
||||
PRAGMA journal_mode = WAL;
|
||||
PRAGMA wal_autocheckpoint = 0;
|
||||
CREATE TABLE t1(x);
|
||||
BEGIN;
|
||||
INSERT INTO t1 VALUES(randomblob(400)); /* 1 */
|
||||
INSERT INTO t1 SELECT randomblob(400) FROM t1; /* 2 */
|
||||
INSERT INTO t1 SELECT randomblob(400) FROM t1; /* 4 */
|
||||
INSERT INTO t1 SELECT randomblob(400) FROM t1; /* 8 */
|
||||
INSERT INTO t1 SELECT randomblob(400) FROM t1; /* 16 */
|
||||
INSERT INTO t1 SELECT randomblob(400) FROM t1; /* 32 */
|
||||
INSERT INTO t1 SELECT randomblob(400) FROM t1; /* 64 */
|
||||
INSERT INTO t1 SELECT randomblob(400) FROM t1; /* 128 */
|
||||
INSERT INTO t1 SELECT randomblob(400) FROM t1; /* 256 */
|
||||
INSERT INTO t1 SELECT randomblob(400) FROM t1; /* 512 */
|
||||
INSERT INTO t1 SELECT randomblob(400) FROM t1; /* 1024 */
|
||||
INSERT INTO t1 SELECT randomblob(400) FROM t1; /* 2048 */
|
||||
INSERT INTO t1 SELECT randomblob(400) FROM t1; /* 4096 */
|
||||
INSERT INTO t1 SELECT randomblob(400) FROM t1; /* 8192 */
|
||||
INSERT INTO t1 SELECT randomblob(400) FROM t1; /* 16384 */
|
||||
COMMIT;
|
||||
}
|
||||
|
||||
set ::shmfault_ioerr_countdown 1
|
||||
set ::shmfault_ioerr_methods(xShmGet) 1
|
||||
db close
|
||||
unset ::shmfault_ioerr_methods(xShmGet)
|
||||
if {[file exists test.db-wal]==0} {error "Failed to create WAL file!"}
|
||||
|
||||
sqlite3 db test.db -vfs shmfault
|
||||
breakpoint
|
||||
} -sqlbody {
|
||||
SELECT count(*) FROM t1;
|
||||
}
|
||||
|
||||
finish_test
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user