]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Add tests for handling errors returned by xShm VFS methods.
authordan <dan@noemail.net>
Thu, 6 May 2010 07:43:58 +0000 (07:43 +0000)
committerdan <dan@noemail.net>
Thu, 6 May 2010 07:43:58 +0000 (07:43 +0000)
FossilOrigin-Name: fbbcacb137e8f5246b88ad09331236aaa1900f60

manifest
manifest.uuid
src/test_vfs.c
src/wal.c
test/walfault.test

index 9329dc5547fe805f35937b7612c45a943a3eb7e6..4405e02f41376f93458487ad483934c990f31786 100644 (file)
--- a/manifest
+++ b/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
index d7480930ec2a7db10bc4420a1afd35f0579187ad..03d18cba13fab16d35d787ba9d98dd4985534cc6 100644 (file)
@@ -1 +1 @@
-1b14195e05fe5551992a39246ec3bcf6a33bbfac
\ No newline at end of file
+fbbcacb137e8f5246b88ad09331236aaa1900f60
\ No newline at end of file
index 1212a51e7937ba33ace2de88be27b56f92af0066..d14f93c54aa315548808e7c4b2e3207ecc659951 100644 (file)
@@ -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);
index 5a6e41fd519cf42fec915fc31230a41113d195cc..0a3657c3b5984a2f0334fb7c8a7949a615f63d9c 100644 (file)
--- a/src/wal.c
+++ b/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;
   }
 
index 159f71ab3233bb41e196f5df970cd2d1851d7ff2..5bc78eb9dd3b58f58cffb092cd00c5bfc5d320e4 100644 (file)
@@ -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