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>