Annotation of embedaddon/sqlite3/doc/vfs-shm.txt, revision 1.1.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>