Home | History | Annotate | Download | only in doc
      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.
    131