Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | Update header comments in wal.c to correctly describe the WAL file format. Update the locking region offsets in os_unix.c and os_win.c and add assert() statement to verify that the locking region offsets are correct. |
---|---|
Downloads: | Tarball | ZIP archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA1: |
40030c0739f821ea8ee188c28c579507 |
User & Date: | drh 2010-05-25 13:40:04.000 |
Context
2010-05-25
| ||
13:49 | Modify walcrash2.test so that it works with DEFAULT_AUTOVACUUM=1. (check-in: 77438882dd user: dan tags: trunk) | |
13:40 | Update header comments in wal.c to correctly describe the WAL file format. Update the locking region offsets in os_unix.c and os_win.c and add assert() statement to verify that the locking region offsets are correct. (check-in: 40030c0739 user: drh tags: trunk) | |
10:50 | If a writer exits unexpectedly in the middle of a transaction, have the following writer remove any wal-index hash-table entries left by the interrupted transaction. (check-in: ed77556adc user: dan tags: trunk) | |
Changes
Changes to src/os_unix.c.
︙ | ︙ | |||
3182 3183 3184 3185 3186 3187 3188 | ** Size increment by which shared memory grows */ #define SQLITE_UNIX_SHM_INCR 4096 /* ** Constants used for locking */ | | | 3182 3183 3184 3185 3186 3187 3188 3189 3190 3191 3192 3193 3194 3195 3196 | ** Size increment by which shared memory grows */ #define SQLITE_UNIX_SHM_INCR 4096 /* ** Constants used for locking */ #define UNIX_SHM_BASE 80 /* Byte offset of the first lock byte */ #define UNIX_SHM_DMS 0x01 /* Mask for Dead-Man-Switch lock */ #define UNIX_SHM_A 0x10 /* Mask for region locks... */ #define UNIX_SHM_B 0x20 #define UNIX_SHM_C 0x40 #define UNIX_SHM_D 0x80 #ifdef SQLITE_DEBUG |
︙ | ︙ |
Changes to src/os_win.c.
︙ | ︙ | |||
1267 1268 1269 1270 1271 1272 1273 | ** Size increment by which shared memory grows */ #define SQLITE_WIN_SHM_INCR 4096 /* ** Constants used for locking */ | | | 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 | ** Size increment by which shared memory grows */ #define SQLITE_WIN_SHM_INCR 4096 /* ** Constants used for locking */ #define WIN_SHM_BASE 80 /* Byte offset of the first lock byte */ #define WIN_SHM_DMS 0x01 /* Mask for Dead-Man-Switch lock */ #define WIN_SHM_A 0x10 /* Mask for region locks... */ #define WIN_SHM_B 0x20 #define WIN_SHM_C 0x40 #define WIN_SHM_D 0x80 #ifdef SQLITE_DEBUG |
︙ | ︙ |
Changes to src/wal.c.
︙ | ︙ | |||
30 31 32 33 34 35 36 | ** toward the end. Checksums and counters attached to each frame are ** used to determine which frames within the WAL are valid and which ** are leftovers from prior checkpoints. ** ** The WAL header is 24 bytes in size and consists of the following six ** big-endian 32-bit unsigned integer values: ** | | | 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | ** toward the end. Checksums and counters attached to each frame are ** used to determine which frames within the WAL are valid and which ** are leftovers from prior checkpoints. ** ** The WAL header is 24 bytes in size and consists of the following six ** big-endian 32-bit unsigned integer values: ** ** 0: Magic number. 0x377f0682 or 0x377f0683 ** 4: File format version. Currently 3007000 ** 8: Database page size. Example: 1024 ** 12: Checkpoint sequence number ** 16: Salt-1, random integer incremented with each checkpoint ** 20: Salt-2, a different random integer changing with each ckpt ** ** Immediately following the wal-header are zero or more frames. Each |
︙ | ︙ | |||
57 58 59 60 61 62 63 | ** A frame is considered valid if and only if the following conditions are ** true: ** ** (1) The salt-1 and salt-2 values in the frame-header match ** salt values in the wal-header ** ** (2) The checksum values in the final 8 bytes of the frame-header | | | | > > > > | 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 | ** A frame is considered valid if and only if the following conditions are ** true: ** ** (1) The salt-1 and salt-2 values in the frame-header match ** salt values in the wal-header ** ** (2) The checksum values in the final 8 bytes of the frame-header ** exactly match the checksum computed consecutively on the ** WAL header and the first 8 bytes and the content of all frames ** up to and including the current frame. ** ** The checksum is computed using 32-bit big-endian integers if the ** magic number in the first 4 bytes of the WAL is 0x377f0683 and it ** is computed using little-endian if the magic number is 0x377f0682. ** ** On a checkpoint, the WAL is first VFS.xSync-ed, then valid content of the ** WAL is transferred into the database, then the database is VFS.xSync-ed. ** The VFS.xSync operations server as write barriers - all writes launched ** before the xSync must complete before any write that launches after the ** xSync begins. ** |
︙ | ︙ | |||
942 943 944 945 946 947 948 949 950 951 952 953 954 955 | Wal *pRet; /* Object to allocate and return */ int flags; /* Flags passed to OsOpen() */ char *zWal; /* Name of write-ahead log file */ int nWal; /* Length of zWal in bytes */ assert( zDbName && zDbName[0] ); assert( pDbFd ); /* Allocate an instance of struct Wal to return. */ *ppWal = 0; nWal = sqlite3Strlen30(zDbName) + 5; pRet = (Wal*)sqlite3MallocZero(sizeof(Wal) + pVfs->szOsFile + nWal); if( !pRet ){ return SQLITE_NOMEM; | > > > > > > > > > > > > | 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 | Wal *pRet; /* Object to allocate and return */ int flags; /* Flags passed to OsOpen() */ char *zWal; /* Name of write-ahead log file */ int nWal; /* Length of zWal in bytes */ assert( zDbName && zDbName[0] ); assert( pDbFd ); /* In the amalgamation, the os_unix.c and os_win.c source files come before ** this source file. Verify that the #defines of the locking byte offsets ** in os_unix.c and os_win.c agree with the WALINDEX_LOCK_OFFSET value. */ #ifdef WIN_SHM_BASE assert( WIN_SHM_BASE==WALINDEX_LOCK_OFFSET ); #endif #ifdef UNIX_SHM_BASE assert( UNIX_SHM_BASE==WALINDEX_LOCK_OFFSET ); #endif /* Allocate an instance of struct Wal to return. */ *ppWal = 0; nWal = sqlite3Strlen30(zDbName) + 5; pRet = (Wal*)sqlite3MallocZero(sizeof(Wal) + pVfs->szOsFile + nWal); if( !pRet ){ return SQLITE_NOMEM; |
︙ | ︙ |