1
0
mirror of https://github.com/sqlite/sqlite.git synced 2025-11-12 13:01:09 +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

@@ -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 ){