Reserve some space at the start of the log-summary file to apply locks to.

FossilOrigin-Name: a031aa1fa01f062b087154833738f011f7bc4eb5
This commit is contained in:
dan 2010-04-24 04:49:15 +00:00
parent 3306c4a945
commit ff207012e6
3 changed files with 76 additions and 33 deletions

View File

@ -1,5 +1,5 @@
C Fixes\sand\stests\sfor\sbackup\sof\sa\sWAL\sdatabase.
D 2010-04-23T19:15:00
C Reserve\ssome\sspace\sat\sthe\sstart\sof\sthe\slog-summary\sfile\sto\sapply\slocks\sto.
D 2010-04-24T04:49:15
F Makefile.arm-wince-mingw32ce-gcc fcd5e9cd67fe88836360bb4f9ef4cb7f8e2fb5a0
F Makefile.in 4f2f967b7e58a35bb74fb7ec8ae90e0f4ca7868b
F Makefile.linux-gcc d53183f4aa6a9192d249731c90dbdffbd2c68654
@ -131,7 +131,7 @@ F src/journal.c b0ea6b70b532961118ab70301c00a33089f9315c
F src/legacy.c a199d7683d60cef73089e892409113e69c23a99f
F src/lempar.c 7f026423f4d71d989e719a743f98a1cbd4e6d99e
F src/loadext.c 1c7a61ce1281041f437333f366a96aa0d29bb581
F src/log.c d9fdaad6b0b5ace54153b85f5bfcf1b9d1abac67
F src/log.c 7569a2f6541c86127914d50e9fd6e65c17111bc6
F src/log.h bc44b0eec723648c8aa0a05ab78e1b76a4032e02
F src/main.c 867de6aa444abd97771b2b70472f448d65c1c77e
F src/malloc.c a08f16d134f0bfab6b20c3cd142ebf3e58235a6a
@ -808,7 +808,7 @@ F tool/speedtest2.tcl ee2149167303ba8e95af97873c575c3e0fab58ff
F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224
F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e
F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f
P 1077d8130b8ed5716ad73f78382270909d347963
R 0d1581e70f8ee05579afbc11de72b135
P 480d12db4c0ebcc37598f7620d39193875eab15b
R f27ff96a8474356c5e71b7eed104ff79
U dan
Z c6fc40f98d5658443e299ebf167b2a61
Z 9b426b4ef3d6b692bab78cb4477e0b43

View File

@ -1 +1 @@
480d12db4c0ebcc37598f7620d39193875eab15b
a031aa1fa01f062b087154833738f011f7bc4eb5

View File

@ -28,9 +28,33 @@
*/
/*
** LOG SUMMARY FORMAT
** LOG SUMMARY FILE FORMAT
**
** TODO.
** The log-summary file consists of a header region, followed by an
** region that contains no useful data (used to apply byte-range locks
** to), followed by the data region.
**
** The contents of both the header and data region are specified in terms
** of 1, 2 and 4 byte unsigned integers. All integers are stored in
** machine-endian order.
**
** A log-summary file is essentially a shadow-pager map. It contains a
** mapping from database page number to the set of locations in the log
** file that contain versions of the database page. When a database
** client needs to read a page of data, it first queries the log-summary
** file to determine if the required version of the page is stored in
** the log. If so, it is read from the log file. If not, it is read from
** the database file.
**
** Whenever a transaction is appended to the log or a checkpoint transfers
** data from the log file into the database file, the log-summary is
** updated accordingly.
**
** The fields in the log-summary file header are described in the comment
** directly above the definition of struct LogSummaryHdr (see below).
** Immediately following the fields in the LogSummaryHdr structure is
** an 8 byte checksum based on the contents of the header. This field is
** not the same as the iCheck1 and iCheck2 fields of the LogSummaryHdr.
*/
#include "log.h"
@ -65,13 +89,18 @@ struct LogSummaryHdr {
/* Size of serialized LogSummaryHdr object. */
#define LOGSUMMARY_HDR_NFIELD (sizeof(LogSummaryHdr) / sizeof(u32))
#define LOGSUMMARY_FRAME_OFFSET \
(LOGSUMMARY_HDR_NFIELD + LOG_CKSM_BYTES/sizeof(u32))
/* A block of 16 bytes beginning at LOGSUMMARY_LOCK_OFFSET is reserved
** for locks. Since some systems only feature mandatory file-locks, we
** do not read or write data from the region of the file on which locks
** are applied.
*/
#define LOGSUMMARY_LOCK_OFFSET ((sizeof(LogSummaryHdr))+2*sizeof(u32))
#define LOGSUMMARY_LOCK_RESERVED 16
/* Size of frame header */
/* Size of header before each frame in log file */
#define LOG_FRAME_HDRSIZE 16
/* Size of log header */
#define LOG_HDRSIZE 12
/*
@ -197,9 +226,9 @@ struct LogSummary {
** write to the log file) require an exclusive lock on region D.
** Which they cannot get until all region D readers have finished.
*/
#define LOG_LOCK_MUTEX 12
#define LOG_LOCK_DMH 13
#define LOG_LOCK_REGION 14
#define LOG_LOCK_MUTEX (LOGSUMMARY_LOCK_OFFSET)
#define LOG_LOCK_DMH (LOG_LOCK_MUTEX+1)
#define LOG_LOCK_REGION (LOG_LOCK_DMH+1)
/*
** The four lockable regions associated with each log-summary. A connection
@ -386,13 +415,13 @@ static int logSummaryUnmap(LogSummary *pSummary, int isUnlink){
}
static void logSummaryWriteHdr(LogSummary *pSummary, LogSummaryHdr *pHdr){
u32 *aData = pSummary->aData;
memcpy(aData, pHdr, sizeof(LogSummaryHdr));
aData[LOGSUMMARY_HDR_NFIELD] = 1;
aData[LOGSUMMARY_HDR_NFIELD+1] = 1;
logChecksumBytes(
(u8 *)aData, sizeof(LogSummaryHdr), &aData[LOGSUMMARY_HDR_NFIELD]
);
u32 *aHdr = pSummary->aData; /* Write header here */
u32 *aCksum = &aHdr[LOGSUMMARY_HDR_NFIELD]; /* Write header cksum here */
assert( LOGSUMMARY_HDR_NFIELD==sizeof(LogSummaryHdr)/4 );
memcpy(aHdr, pHdr, sizeof(LogSummaryHdr));
aCksum[0] = aCksum[1] = 1;
logChecksumBytes((u8 *)aHdr, sizeof(LogSummaryHdr), aCksum);
}
/*
@ -553,7 +582,11 @@ static int logSummaryMap(LogSummary *pSummary, int nByte){
** alternating "map" and "index" blocks.
*/
static int logSummaryEntry(u32 iFrame){
return ((((iFrame-1)>>8)<<6) + iFrame-1 + 2 + LOGSUMMARY_HDR_NFIELD);
return (
(LOGSUMMARY_LOCK_OFFSET+LOGSUMMARY_LOCK_RESERVED)/sizeof(u32)
+ (((iFrame-1)>>8)<<6) /* Indexes that occur before iFrame */
+ iFrame-1 /* Db page numbers that occur before iFrame */
);
}
@ -692,6 +725,9 @@ finished:
/*
** Place, modify or remove a lock on the log-summary file associated
** with pSummary.
**
** The locked byte-range should be inside the region dedicated to
** locking. This region of the log-summary file is never read or written.
*/
static int logLockFd(
LogSummary *pSummary, /* The log-summary object to lock */
@ -716,6 +752,13 @@ static int logLockFd(
assert( ArraySize(aType)==ArraySize(aOp) );
assert( op>=0 && op<ArraySize(aType) );
assert( nByte>0 );
assert( iStart>=LOGSUMMARY_LOCK_OFFSET
&& iStart+nByte<=LOGSUMMARY_LOCK_OFFSET+LOGSUMMARY_LOCK_RESERVED
);
#if defined(SQLITE_DEBUG) && defined(SQLITE_OS_UNIX)
if( pSummary->aData ) memset(&((u8*)pSummary->aData)[iStart], op, nByte);
#endif
memset(&f, 0, sizeof(f));
f.l_type = aType[op];
@ -834,13 +877,13 @@ static int logLockRegion(Log *pLog, u32 mRegion, int op){
int iStart; /* Byte offset to start locking operation */
int iLen; /* Length field for locking operation */
} aMap[] = {
/* 0000 */ {0, 0}, /* 0001 */ {4+LOG_LOCK_REGION, 1},
/* 0010 */ {3+LOG_LOCK_REGION, 1}, /* 0011 */ {3+LOG_LOCK_REGION, 2},
/* 0100 */ {2+LOG_LOCK_REGION, 1}, /* 0101 */ {0, 0},
/* 0110 */ {2+LOG_LOCK_REGION, 2}, /* 0111 */ {2+LOG_LOCK_REGION, 3},
/* 1000 */ {1+LOG_LOCK_REGION, 1}, /* 1001 */ {0, 0},
/* 0000 */ {0, 0}, /* 0001 */ {3+LOG_LOCK_REGION, 1},
/* 0010 */ {2+LOG_LOCK_REGION, 1}, /* 0011 */ {2+LOG_LOCK_REGION, 2},
/* 0100 */ {1+LOG_LOCK_REGION, 1}, /* 0101 */ {0, 0},
/* 0110 */ {1+LOG_LOCK_REGION, 2}, /* 0111 */ {1+LOG_LOCK_REGION, 3},
/* 1000 */ {0+LOG_LOCK_REGION, 1}, /* 1001 */ {0, 0},
/* 1010 */ {0, 0}, /* 1011 */ {0, 0},
/* 1100 */ {1+LOG_LOCK_REGION, 2}, /* 1101 */ {0, 0},
/* 1100 */ {0+LOG_LOCK_REGION, 2}, /* 1101 */ {0, 0},
/* 1110 */ {0, 0}, /* 1111 */ {0, 0}
};
int rc; /* Return code of logLockFd() */