------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
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
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
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
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
-1b14195e05fe5551992a39246ec3bcf6a33bbfac
\ No newline at end of file
+fbbcacb137e8f5246b88ad09331236aaa1900f60
\ No newline at end of file
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;
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;
}
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
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);
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 */
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;
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);
p->nFinal = nFinal;
}
- return p;
+ *pp = p;
+ return SQLITE_OK;
}
/*
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;
}
}
# 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} {
#
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)
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
shmfault delete
}
+
do_shmfault_test walfault-shm-1 -sqlbody {
PRAGMA journal_mode = WAL;
CREATE TABLE t1(a PRIMARY KEY, b);
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