diff options
author | dan <dan@noemail.net> | 2010-05-06 18:48:27 +0000 |
---|---|---|
committer | dan <dan@noemail.net> | 2010-05-06 18:48:27 +0000 |
commit | 65be0d8cce1ce87ba6234f59a12f87f1ce9ae331 (patch) | |
tree | 12ec6cd91b3f1f0e5115f3dd1489e7306cfdd642 /src | |
parent | 5273f58f377316ea9920865c41935f6adf7ce8bb (diff) | |
download | sqlite-65be0d8cce1ce87ba6234f59a12f87f1ce9ae331.tar.gz sqlite-65be0d8cce1ce87ba6234f59a12f87f1ce9ae331.zip |
Instead of transitioning to RECOVER state from CHECKPOINT when a recovery is required, perform the recovery while holding the CHECKPOINT lock.
FossilOrigin-Name: bb0b6021e721c2e4f1533ab18381604c6b7b31d5
Diffstat (limited to 'src')
-rw-r--r-- | src/os_unix.c | 9 | ||||
-rw-r--r-- | src/wal.c | 10 |
2 files changed, 9 insertions, 10 deletions
diff --git a/src/os_unix.c b/src/os_unix.c index 34f98f55a..72cc06a02 100644 --- a/src/os_unix.c +++ b/src/os_unix.c @@ -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 ){ @@ -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; |