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

Instead of transitioning to RECOVER state from CHECKPOINT when a recovery is required, perform the recovery while holding the CHECKPOINT lock.

FossilOrigin-Name: bb0b6021e721c2e4f1533ab18381604c6b7b31d5
This commit is contained in:
dan
2010-05-06 18:48:27 +00:00
parent 5273f58f37
commit 65be0d8cce
6 changed files with 24 additions and 27 deletions

View File

@ -113,9 +113,7 @@ The following are the allowed lock transitions:
(11l) PENDING UNLOCK UNLOCK (11l) PENDING UNLOCK UNLOCK
(11m) PENDING CHECKPOINT CHECKPOINT (11m) PENDING CHECKPOINT CHECKPOINT
(11n) CHECKPOINT UNLOCK UNLOCK (11n) CHECKPOINT UNLOCK UNLOCK
(11o) CHECKPOINT RECOVER RECOVER (11o) RECOVER READ READ
(11p) RECOVER READ READ
(11q) RECOVER CHECKPOINT CHECKPOINT
These 17 transitions are all that needs to be supported. The lock These 17 transitions are all that needs to be supported. The lock
manager implementation can assert that fact. The other 25 possible manager implementation can assert that fact. The other 25 possible

View File

@ -1,5 +1,5 @@
C If\srecovery\sis\srun\sbefore\sa\scheckpoint,\schange\sback\sto\sa\sCHECKPOINT\slock\sbefore\sperforming\sthe\sactual\scheckpoint. 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:27:20 D 2010-05-06T18:48:28
F Makefile.arm-wince-mingw32ce-gcc fcd5e9cd67fe88836360bb4f9ef4cb7f8e2fb5a0 F Makefile.arm-wince-mingw32ce-gcc fcd5e9cd67fe88836360bb4f9ef4cb7f8e2fb5a0
F Makefile.in a5cad1f8f3e021356bfcc6c77dc16f6f1952bbc3 F Makefile.in a5cad1f8f3e021356bfcc6c77dc16f6f1952bbc3
F Makefile.linux-gcc d53183f4aa6a9192d249731c90dbdffbd2c68654 F Makefile.linux-gcc d53183f4aa6a9192d249731c90dbdffbd2c68654
@ -24,7 +24,7 @@ F configure.ac 14740970ddb674d92a9f5da89083dff1179014ff
F contrib/sqlitecon.tcl 210a913ad63f9f991070821e599d600bd913e0ad F contrib/sqlitecon.tcl 210a913ad63f9f991070821e599d600bd913e0ad
F doc/lemon.html f0f682f50210928c07e562621c3b7e8ab912a538 F doc/lemon.html f0f682f50210928c07e562621c3b7e8ab912a538
F doc/pager-invariants.txt 870107036470d7c419e93768676fae2f8749cf9e 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/README.txt 913a7bd3f4837ab14d7e063304181787658b14e1
F ext/async/README.txt 0c541f418b14b415212264cbaaf51c924ec62e5b F ext/async/README.txt 0c541f418b14b415212264cbaaf51c924ec62e5b
F ext/async/sqlite3async.c 676066c2a111a8b3107aeb59bdbbbf335c348f4a F ext/async/sqlite3async.c 676066c2a111a8b3107aeb59bdbbbf335c348f4a
@ -152,7 +152,7 @@ F src/os.c aec6922553585a25d5655666defc125a7e217674
F src/os.h b389844e5469a2918e8a45fe6ae52b4c28dfb2b2 F src/os.h b389844e5469a2918e8a45fe6ae52b4c28dfb2b2
F src/os_common.h 0d6ee583b6ee3185eb9d951f890c6dd03021a08d F src/os_common.h 0d6ee583b6ee3185eb9d951f890c6dd03021a08d
F src/os_os2.c 8ad77a418630d7dee91d1bb04f79c2096301d3a0 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/os_win.c a8fc01d8483be472e495793c01064fd87e56a5c1
F src/pager.c d6e9edb629d43a7762882fe2e2950886cdb95606 F src/pager.c d6e9edb629d43a7762882fe2e2950886cdb95606
F src/pager.h 934b598583a9d936bb13c37d62a2fe68ac48781c F src/pager.h 934b598583a9d936bb13c37d62a2fe68ac48781c
@ -224,7 +224,7 @@ F src/vdbeblob.c 5327132a42a91e8b7acfb60b9d2c3b1c5c863e0e
F src/vdbemem.c 2a82f455f6ca6f78b59fb312f96054c04ae0ead1 F src/vdbemem.c 2a82f455f6ca6f78b59fb312f96054c04ae0ead1
F src/vdbetrace.c 864cef96919323482ebd9986f2132435115e9cc2 F src/vdbetrace.c 864cef96919323482ebd9986f2132435115e9cc2
F src/vtab.c a0f8a40274e4261696ef57aa806de2776ab72cda F src/vtab.c a0f8a40274e4261696ef57aa806de2776ab72cda
F src/wal.c 0463fb96923211ed9e0bbcaab4493b47cc15f701 F src/wal.c 1fc462b75d126d960b016cc2c812c57f3a1962d2
F src/wal.h b4c42014b5fa3b4e6244ac8c65de7ff67adeb27c F src/wal.h b4c42014b5fa3b4e6244ac8c65de7ff67adeb27c
F src/walker.c 3112bb3afe1d85dc52317cb1d752055e9a781f8f F src/walker.c 3112bb3afe1d85dc52317cb1d752055e9a781f8f
F src/where.c 75fee9e255b62f773fcadd1d1f25b6f63ac7a356 F src/where.c 75fee9e255b62f773fcadd1d1f25b6f63ac7a356
@ -762,7 +762,7 @@ F test/vtab_alter.test 9e374885248f69e251bdaacf480b04a197f125e5
F test/vtab_err.test 0d4d8eb4def1d053ac7c5050df3024fd47a3fbd8 F test/vtab_err.test 0d4d8eb4def1d053ac7c5050df3024fd47a3fbd8
F test/vtab_shared.test 0eff9ce4f19facbe0a3e693f6c14b80711a4222d F test/vtab_shared.test 0eff9ce4f19facbe0a3e693f6c14b80711a4222d
F test/wal.test f0b78497bbe2e7f3c35a1c28e9772fe0dead1fc8 F test/wal.test f0b78497bbe2e7f3c35a1c28e9772fe0dead1fc8
F test/wal2.test 8057c4ee98282d5ef66d3e2c0213420cf8cb38f9 F test/wal2.test 0f53c711d6530d3c7aba46752aef9fd44b708c6c
F test/walbak.test a0e45187c7d8928df035dfea29b99b016b21ca3c F test/walbak.test a0e45187c7d8928df035dfea29b99b016b21ca3c
F test/walcrash.test f6d5fb2bb108876f04848720a488065d9deef69f F test/walcrash.test f6d5fb2bb108876f04848720a488065d9deef69f
F test/walfault.test ae37204f4375e0e5eba75094d0d0db7148de70a8 F test/walfault.test ae37204f4375e0e5eba75094d0d0db7148de70a8
@ -813,7 +813,7 @@ F tool/speedtest2.tcl ee2149167303ba8e95af97873c575c3e0fab58ff
F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224 F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224
F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e
F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f
P 637f51ddf9e4a57e1f171b6d2c6c93152074267e P dc98ee169cfa43c89f1b36fb1150d4788710fda3
R 793e2c795e1969f0da0cad66b2ecc195 R ab84b86feedf80f0a73878d980abbcbe
U dan U dan
Z a7b405881b08330f6ecc62b20d53b83c Z 8a72aeec7f63b15de1386fa30a6b1195

View File

@ -1 +1 @@
dc98ee169cfa43c89f1b36fb1150d4788710fda3 bb0b6021e721c2e4f1533ab18381604c6b7b31d5

View File

@ -5339,12 +5339,7 @@ static int unixShmLock(
case SQLITE_SHM_CHECKPOINT: { case SQLITE_SHM_CHECKPOINT: {
assert( p->lockState==SQLITE_SHM_UNLOCK assert( p->lockState==SQLITE_SHM_UNLOCK
|| p->lockState==SQLITE_SHM_PENDING || 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 ){ if( p->lockState==SQLITE_SHM_UNLOCK ){
rc = unixShmExclusiveLock(pFile, p, UNIX_SHM_B|UNIX_SHM_C); rc = unixShmExclusiveLock(pFile, p, UNIX_SHM_B|UNIX_SHM_C);
if( rc==SQLITE_OK ){ if( rc==SQLITE_OK ){
@ -5363,7 +5358,7 @@ static int unixShmLock(
assert( desiredLock==SQLITE_SHM_RECOVER ); assert( desiredLock==SQLITE_SHM_RECOVER );
assert( p->lockState==SQLITE_SHM_READ assert( p->lockState==SQLITE_SHM_READ
|| p->lockState==SQLITE_SHM_READ_FULL || p->lockState==SQLITE_SHM_READ_FULL
|| p->lockState==SQLITE_SHM_CHECKPOINT ); );
assert( sqlite3_mutex_held(pFile->mutexBuf) ); assert( sqlite3_mutex_held(pFile->mutexBuf) );
rc = unixShmExclusiveLock(pFile, p, UNIX_SHM_C); rc = unixShmExclusiveLock(pFile, p, UNIX_SHM_C);
if( rc==SQLITE_OK ){ if( rc==SQLITE_OK ){

View File

@ -501,7 +501,7 @@ static int walIndexRecover(Wal *pWal){
i64 nSize; /* Size of log file */ i64 nSize; /* Size of log file */
WalIndexHdr hdr; /* Recovered wal-index header */ WalIndexHdr hdr; /* Recovered wal-index header */
assert( pWal->lockState==SQLITE_SHM_RECOVER ); assert( pWal->lockState>SQLITE_SHM_READ );
memset(&hdr, 0, sizeof(hdr)); memset(&hdr, 0, sizeof(hdr));
rc = sqlite3OsFileSize(pWal->pFd, &nSize); rc = sqlite3OsFileSize(pWal->pFd, &nSize);
@ -941,7 +941,9 @@ static int walIndexReadHdr(Wal *pWal, int *pChanged){
** time as well, run log recovery. ** time as well, run log recovery.
*/ */
lockState = pWal->lockState; 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 /* 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, ** wal-index is already mapped. It may find that the header is invalid,
** but there is no chance of hitting an actual error. */ ** but there is no chance of hitting an actual error. */
@ -952,7 +954,9 @@ static int walIndexReadHdr(Wal *pWal, int *pChanged){
*pChanged = 1; *pChanged = 1;
rc = walIndexRecover(pWal); rc = walIndexRecover(pWal);
} }
walSetLock(pWal, lockState); if( lockState==SQLITE_SHM_READ ){
walSetLock(pWal, SQLITE_SHM_READ);
}
} }
return rc; return rc;

View File

@ -338,8 +338,7 @@ tvfs delete
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
# Test that if a database connection is forced to run recovery before it # Test that if a database connection is forced to run recovery before it
# can perform a checkpoint, it transistions from RECOVERY->CHECKPOINT # can perform a checkpoint, it does not transition into RECOVER state.
# before doing so.
# #
do_test wal2-5.1 { do_test wal2-5.1 {
proc tvfs_cb {method args} { proc tvfs_cb {method args} {
@ -362,8 +361,9 @@ do_test wal2-5.1 {
set ::locks [list] set ::locks [list]
execsql { PRAGMA wal_checkpoint } execsql { PRAGMA wal_checkpoint }
set ::locks set ::locks
} {CHECKPOINT RECOVER CHECKPOINT UNLOCK} } {CHECKPOINT UNLOCK}
db close
tvfs delete
finish_test finish_test