]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Instead of transitioning to RECOVER state from CHECKPOINT when a recovery is required...
authordan <dan@noemail.net>
Thu, 6 May 2010 18:48:27 +0000 (18:48 +0000)
committerdan <dan@noemail.net>
Thu, 6 May 2010 18:48:27 +0000 (18:48 +0000)
FossilOrigin-Name: bb0b6021e721c2e4f1533ab18381604c6b7b31d5

doc/vfs-shm.txt
manifest
manifest.uuid
src/os_unix.c
src/wal.c
test/wal2.test

index 3e8efb8061bc861755c430996ea29e210ba2133c..bddc75a8abc4b21a16b8f393b7e84b628e4500ed 100644 (file)
@@ -113,9 +113,7 @@ The following are the allowed lock transitions:
 (11l)  PENDING            UNLOCK          UNLOCK
 (11m)  PENDING            CHECKPOINT      CHECKPOINT
 (11n)  CHECKPOINT         UNLOCK          UNLOCK
-(11o)  CHECKPOINT         RECOVER         RECOVER
-(11p)  RECOVER            READ            READ
-(11q)  RECOVER            CHECKPOINT      CHECKPOINT
+(11o)  RECOVER            READ            READ
 
 These 17 transitions are all that needs to be supported.  The lock
 manager implementation can assert that fact.  The other 25 possible
index 87e94d5ca4de25707f243639f1998705753d1c5e..8fadf4626c6a8f958ef5ad6dbd2d6f65f1fe87c0 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C If\srecovery\sis\srun\sbefore\sa\scheckpoint,\schange\sback\sto\sa\sCHECKPOINT\slock\sbefore\sperforming\sthe\sactual\scheckpoint.
-D 2010-05-06T18:27:20
+C Instead\sof\stransitioning\sto\sRECOVER\sstate\sfrom\sCHECKPOINT\swhen\sa\srecovery\sis\srequired,\sperform\sthe\srecovery\swhile\sholding\sthe\sCHECKPOINT\slock.
+D 2010-05-06T18:48:28
 F Makefile.arm-wince-mingw32ce-gcc fcd5e9cd67fe88836360bb4f9ef4cb7f8e2fb5a0
 F Makefile.in a5cad1f8f3e021356bfcc6c77dc16f6f1952bbc3
 F Makefile.linux-gcc d53183f4aa6a9192d249731c90dbdffbd2c68654
@@ -24,7 +24,7 @@ F configure.ac 14740970ddb674d92a9f5da89083dff1179014ff
 F contrib/sqlitecon.tcl 210a913ad63f9f991070821e599d600bd913e0ad
 F doc/lemon.html f0f682f50210928c07e562621c3b7e8ab912a538
 F doc/pager-invariants.txt 870107036470d7c419e93768676fae2f8749cf9e
-F doc/vfs-shm.txt db230538d9d2170d838b7a79493bbc24a5c39788
+F doc/vfs-shm.txt 2b1a72d895e98fcc2db20573a9c29303223ae8b2
 F ext/README.txt 913a7bd3f4837ab14d7e063304181787658b14e1
 F ext/async/README.txt 0c541f418b14b415212264cbaaf51c924ec62e5b
 F ext/async/sqlite3async.c 676066c2a111a8b3107aeb59bdbbbf335c348f4a
@@ -152,7 +152,7 @@ F src/os.c aec6922553585a25d5655666defc125a7e217674
 F src/os.h b389844e5469a2918e8a45fe6ae52b4c28dfb2b2
 F src/os_common.h 0d6ee583b6ee3185eb9d951f890c6dd03021a08d
 F src/os_os2.c 8ad77a418630d7dee91d1bb04f79c2096301d3a0
-F src/os_unix.c 2ce91d5d9a8d0e8d4d2ed3bcb510d19945b77bc5
+F src/os_unix.c 00403219ceac733ade0b0bb7373146f8e1c18ac1
 F src/os_win.c a8fc01d8483be472e495793c01064fd87e56a5c1
 F src/pager.c d6e9edb629d43a7762882fe2e2950886cdb95606
 F src/pager.h 934b598583a9d936bb13c37d62a2fe68ac48781c
@@ -224,7 +224,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 0463fb96923211ed9e0bbcaab4493b47cc15f701
+F src/wal.c 1fc462b75d126d960b016cc2c812c57f3a1962d2
 F src/wal.h b4c42014b5fa3b4e6244ac8c65de7ff67adeb27c
 F src/walker.c 3112bb3afe1d85dc52317cb1d752055e9a781f8f
 F src/where.c 75fee9e255b62f773fcadd1d1f25b6f63ac7a356
@@ -762,7 +762,7 @@ F test/vtab_alter.test 9e374885248f69e251bdaacf480b04a197f125e5
 F test/vtab_err.test 0d4d8eb4def1d053ac7c5050df3024fd47a3fbd8
 F test/vtab_shared.test 0eff9ce4f19facbe0a3e693f6c14b80711a4222d
 F test/wal.test f0b78497bbe2e7f3c35a1c28e9772fe0dead1fc8
-F test/wal2.test 8057c4ee98282d5ef66d3e2c0213420cf8cb38f9
+F test/wal2.test 0f53c711d6530d3c7aba46752aef9fd44b708c6c
 F test/walbak.test a0e45187c7d8928df035dfea29b99b016b21ca3c
 F test/walcrash.test f6d5fb2bb108876f04848720a488065d9deef69f
 F test/walfault.test ae37204f4375e0e5eba75094d0d0db7148de70a8
@@ -813,7 +813,7 @@ F tool/speedtest2.tcl ee2149167303ba8e95af97873c575c3e0fab58ff
 F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224
 F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e
 F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f
-P 637f51ddf9e4a57e1f171b6d2c6c93152074267e
-R 793e2c795e1969f0da0cad66b2ecc195
+P dc98ee169cfa43c89f1b36fb1150d4788710fda3
+R ab84b86feedf80f0a73878d980abbcbe
 U dan
-Z a7b405881b08330f6ecc62b20d53b83c
+Z 8a72aeec7f63b15de1386fa30a6b1195
index fd6f43eb0c82fa0ba7cde35695e68befcc3a0ebe..b36f0cce0a03c8249061532d24b158167f599769 100644 (file)
@@ -1 +1 @@
-dc98ee169cfa43c89f1b36fb1150d4788710fda3
\ No newline at end of file
+bb0b6021e721c2e4f1533ab18381604c6b7b31d5
\ No newline at end of file
index 34f98f55a6f5c1921ea66fa3cff7d96e2284c0cf..72cc06a02f2945e61a6be7d26329567da2d19347 100644 (file)
@@ -5339,12 +5339,7 @@ static int unixShmLock(
     case SQLITE_SHM_CHECKPOINT: {
       assert( p->lockState==SQLITE_SHM_UNLOCK
            || p->lockState==SQLITE_SHM_PENDING
-           || p->lockState==SQLITE_SHM_RECOVER );
-      if( p->lockState==SQLITE_SHM_RECOVER ){
-        unixShmUnlock(pFile, p, UNIX_SHM_C);
-        p->lockState = SQLITE_SHM_CHECKPOINT;
-        rc = SQLITE_OK;
-      }
+      );
       if( p->lockState==SQLITE_SHM_UNLOCK ){
         rc = unixShmExclusiveLock(pFile, p, UNIX_SHM_B|UNIX_SHM_C);
         if( rc==SQLITE_OK ){
@@ -5363,7 +5358,7 @@ static int unixShmLock(
       assert( desiredLock==SQLITE_SHM_RECOVER );
       assert( p->lockState==SQLITE_SHM_READ
            || p->lockState==SQLITE_SHM_READ_FULL
-           || p->lockState==SQLITE_SHM_CHECKPOINT );
+      );
       assert( sqlite3_mutex_held(pFile->mutexBuf) );
       rc = unixShmExclusiveLock(pFile, p, UNIX_SHM_C);
       if( rc==SQLITE_OK ){
index baa2da2b6498ce09ea22e4723fbbfd8cef18aa92..b9607cde337cb2935f3786ddc867ead539f7ecd5 100644 (file)
--- a/src/wal.c
+++ b/src/wal.c
@@ -501,7 +501,7 @@ static int walIndexRecover(Wal *pWal){
   i64 nSize;                      /* Size of log file */
   WalIndexHdr hdr;              /* Recovered wal-index header */
 
-  assert( pWal->lockState==SQLITE_SHM_RECOVER );
+  assert( pWal->lockState>SQLITE_SHM_READ );
   memset(&hdr, 0, sizeof(hdr));
 
   rc = sqlite3OsFileSize(pWal->pFd, &nSize);
@@ -941,7 +941,9 @@ static int walIndexReadHdr(Wal *pWal, int *pChanged){
   ** time as well, run log recovery.
   */
   lockState = pWal->lockState;
-  if( SQLITE_OK==(rc = walSetLock(pWal, SQLITE_SHM_RECOVER)) ){
+  if( lockState>SQLITE_SHM_READ
+   || SQLITE_OK==(rc = walSetLock(pWal, SQLITE_SHM_RECOVER)) 
+  ){
     /* This call to walIndexTryHdr() may not return an error code, as the
     ** wal-index is already mapped. It may find that the header is invalid,
     ** but there is no chance of hitting an actual error.  */
@@ -952,7 +954,9 @@ static int walIndexReadHdr(Wal *pWal, int *pChanged){
       *pChanged = 1;
       rc = walIndexRecover(pWal);
     }
-    walSetLock(pWal, lockState);
+    if( lockState==SQLITE_SHM_READ ){
+      walSetLock(pWal, SQLITE_SHM_READ);
+    }
   }
 
   return rc;
index b2267251a7a0f1d7acbb1011858f05299a282fd0..81efbce82e2466427a196c9623f991f3abb3d198 100644 (file)
@@ -338,8 +338,7 @@ tvfs delete
 
 #-------------------------------------------------------------------------
 # Test that if a database connection is forced to run recovery before it
-# can perform a checkpoint, it transistions from RECOVERY->CHECKPOINT
-# before doing so.
+# can perform a checkpoint, it does not transition into RECOVER state.
 #
 do_test wal2-5.1 {
   proc tvfs_cb {method args} {
@@ -362,8 +361,9 @@ do_test wal2-5.1 {
   set ::locks [list]
   execsql { PRAGMA wal_checkpoint }
   set ::locks
-} {CHECKPOINT RECOVER CHECKPOINT UNLOCK}
-
+} {CHECKPOINT UNLOCK}
 
+db close
+tvfs delete
 
 finish_test