Annotation of embedaddon/sqlite3/doc/vfs-shm.txt, revision 1.1
1.1 ! misho 1: The 5 states of an historical rollback lock as implemented by the
! 2: xLock, xUnlock, and xCheckReservedLock methods of the sqlite3_io_methods
! 3: objec are:
! 4:
! 5: UNLOCKED
! 6: SHARED
! 7: RESERVED
! 8: PENDING
! 9: EXCLUSIVE
! 10:
! 11: The wal-index file has a similar locking hierarchy implemented using
! 12: the xShmLock method of the sqlite3_vfs object, but with 7
! 13: states. Each connection to a wal-index file must be in one of
! 14: the following 7 states:
! 15:
! 16: UNLOCKED
! 17: READ
! 18: READ_FULL
! 19: WRITE
! 20: PENDING
! 21: CHECKPOINT
! 22: RECOVER
! 23:
! 24: These roughly correspond to the 5 states of a rollback lock except
! 25: that SHARED is split out into 2 states: READ and READ_FULL and
! 26: there is an extra RECOVER state used for wal-index reconstruction.
! 27:
! 28: The meanings of the various wal-index locking states is as follows:
! 29:
! 30: UNLOCKED - The wal-index is not in use.
! 31:
! 32: READ - Some prefix of the wal-index is being read. Additional
! 33: wal-index information can be appended at any time. The
! 34: newly appended content will be ignored by the holder of
! 35: the READ lock.
! 36:
! 37: READ_FULL - The entire wal-index is being read. No new information
! 38: can be added to the wal-index. The holder of a READ_FULL
! 39: lock promises never to read pages from the database file
! 40: that are available anywhere in the wal-index.
! 41:
! 42: WRITE - It is OK to append to the wal-index file and to adjust
! 43: the header to indicate the new "last valid frame".
! 44:
! 45: PENDING - Waiting on all READ locks to clear so that a
! 46: CHECKPOINT lock can be acquired.
! 47:
! 48: CHECKPOINT - It is OK to write any WAL data into the database file
! 49: and zero the last valid frame field of the wal-index
! 50: header. The wal-index file itself may not be changed
! 51: other than to zero the last valid frame field in the
! 52: header.
! 53:
! 54: RECOVER - Held during wal-index recovery. Used to prevent a
! 55: race if multiple clients try to recover a wal-index at
! 56: the same time.
! 57:
! 58:
! 59: A particular lock manager implementation may coalesce one or more of
! 60: the wal-index locking states, though with a reduction in concurrency.
! 61: For example, an implemention might implement only exclusive locking,
! 62: in which case all states would be equivalent to CHECKPOINT, meaning that
! 63: only one reader or one writer or one checkpointer could be active at a
! 64: time. Or, an implementation might combine READ and READ_FULL into
! 65: a single state equivalent to READ, meaning that a writer could
! 66: coexist with a reader, but no reader or writers could coexist with a
! 67: checkpointer.
! 68:
! 69: The lock manager must obey the following rules:
! 70:
! 71: (1) A READ cannot coexist with CHECKPOINT.
! 72: (2) A READ_FULL cannot coexist with WRITE.
! 73: (3) None of WRITE, PENDING, CHECKPOINT, or RECOVER can coexist.
! 74:
! 75: The SQLite core will obey the next set of rules. These rules are
! 76: assertions on the behavior of the SQLite core which might be verified
! 77: during testing using an instrumented lock manager.
! 78:
! 79: (5) No part of the wal-index will be read without holding either some
! 80: kind of SHM lock or an EXCLUSIVE lock on the original database.
! 81: The original database is the file named in the 2nd parameter to
! 82: the xShmOpen method.
! 83:
! 84: (6) A holder of a READ_FULL will never read any page of the database
! 85: file that is contained anywhere in the wal-index.
! 86:
! 87: (7) No part of the wal-index other than the header will be written nor
! 88: will the size of the wal-index grow without holding a WRITE or
! 89: an EXCLUSIVE on the original database file.
! 90:
! 91: (8) The wal-index header will not be written without holding one of
! 92: WRITE, CHECKPOINT, or RECOVER on the wal-index or an EXCLUSIVE on
! 93: the original database files.
! 94:
! 95: (9) A CHECKPOINT or RECOVER must be held on the wal-index, or an
! 96: EXCLUSIVE on the original database file, in order to reset the
! 97: last valid frame counter in the header of the wal-index back to zero.
! 98:
! 99: (10) A WRITE can only increase the last valid frame pointer in the header.
! 100:
! 101: The SQLite core will only ever send requests for UNLOCK, READ, WRITE,
! 102: CHECKPOINT, or RECOVER to the lock manager. The SQLite core will never
! 103: request a READ_FULL or PENDING lock though the lock manager may deliver
! 104: those locking states in response to READ and CHECKPOINT requests,
! 105: respectively, if and only if the requested READ or CHECKPOINT cannot
! 106: be delivered.
! 107:
! 108: The following are the allowed lock transitions:
! 109:
! 110: Original-State Request New-State
! 111: -------------- ---------- ----------
! 112: (11a) UNLOCK READ READ
! 113: (11b) UNLOCK READ READ_FULL
! 114: (11c) UNLOCK CHECKPOINT PENDING
! 115: (11d) UNLOCK CHECKPOINT CHECKPOINT
! 116: (11e) READ UNLOCK UNLOCK
! 117: (11f) READ WRITE WRITE
! 118: (11g) READ RECOVER RECOVER
! 119: (11h) READ_FULL UNLOCK UNLOCK
! 120: (11i) READ_FULL WRITE WRITE
! 121: (11j) READ_FULL RECOVER RECOVER
! 122: (11k) WRITE READ READ
! 123: (11l) PENDING UNLOCK UNLOCK
! 124: (11m) PENDING CHECKPOINT CHECKPOINT
! 125: (11n) CHECKPOINT UNLOCK UNLOCK
! 126: (11o) RECOVER READ READ
! 127:
! 128: These 15 transitions are all that needs to be supported. The lock
! 129: manager implementation can assert that fact. The other 27 possible
! 130: transitions among the 7 locking states will never occur.
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>