Reserve some space at the start of the log-summary file to apply locks to.
FossilOrigin-Name: a031aa1fa01f062b087154833738f011f7bc4eb5
This commit is contained in:
parent
3306c4a945
commit
ff207012e6
12
manifest
12
manifest
@ -1,5 +1,5 @@
|
|||||||
C Fixes\sand\stests\sfor\sbackup\sof\sa\sWAL\sdatabase.
|
C Reserve\ssome\sspace\sat\sthe\sstart\sof\sthe\slog-summary\sfile\sto\sapply\slocks\sto.
|
||||||
D 2010-04-23T19:15:00
|
D 2010-04-24T04:49:15
|
||||||
F Makefile.arm-wince-mingw32ce-gcc fcd5e9cd67fe88836360bb4f9ef4cb7f8e2fb5a0
|
F Makefile.arm-wince-mingw32ce-gcc fcd5e9cd67fe88836360bb4f9ef4cb7f8e2fb5a0
|
||||||
F Makefile.in 4f2f967b7e58a35bb74fb7ec8ae90e0f4ca7868b
|
F Makefile.in 4f2f967b7e58a35bb74fb7ec8ae90e0f4ca7868b
|
||||||
F Makefile.linux-gcc d53183f4aa6a9192d249731c90dbdffbd2c68654
|
F Makefile.linux-gcc d53183f4aa6a9192d249731c90dbdffbd2c68654
|
||||||
@ -131,7 +131,7 @@ F src/journal.c b0ea6b70b532961118ab70301c00a33089f9315c
|
|||||||
F src/legacy.c a199d7683d60cef73089e892409113e69c23a99f
|
F src/legacy.c a199d7683d60cef73089e892409113e69c23a99f
|
||||||
F src/lempar.c 7f026423f4d71d989e719a743f98a1cbd4e6d99e
|
F src/lempar.c 7f026423f4d71d989e719a743f98a1cbd4e6d99e
|
||||||
F src/loadext.c 1c7a61ce1281041f437333f366a96aa0d29bb581
|
F src/loadext.c 1c7a61ce1281041f437333f366a96aa0d29bb581
|
||||||
F src/log.c d9fdaad6b0b5ace54153b85f5bfcf1b9d1abac67
|
F src/log.c 7569a2f6541c86127914d50e9fd6e65c17111bc6
|
||||||
F src/log.h bc44b0eec723648c8aa0a05ab78e1b76a4032e02
|
F src/log.h bc44b0eec723648c8aa0a05ab78e1b76a4032e02
|
||||||
F src/main.c 867de6aa444abd97771b2b70472f448d65c1c77e
|
F src/main.c 867de6aa444abd97771b2b70472f448d65c1c77e
|
||||||
F src/malloc.c a08f16d134f0bfab6b20c3cd142ebf3e58235a6a
|
F src/malloc.c a08f16d134f0bfab6b20c3cd142ebf3e58235a6a
|
||||||
@ -808,7 +808,7 @@ F tool/speedtest2.tcl ee2149167303ba8e95af97873c575c3e0fab58ff
|
|||||||
F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224
|
F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224
|
||||||
F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e
|
F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e
|
||||||
F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f
|
F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f
|
||||||
P 1077d8130b8ed5716ad73f78382270909d347963
|
P 480d12db4c0ebcc37598f7620d39193875eab15b
|
||||||
R 0d1581e70f8ee05579afbc11de72b135
|
R f27ff96a8474356c5e71b7eed104ff79
|
||||||
U dan
|
U dan
|
||||||
Z c6fc40f98d5658443e299ebf167b2a61
|
Z 9b426b4ef3d6b692bab78cb4477e0b43
|
||||||
|
@ -1 +1 @@
|
|||||||
480d12db4c0ebcc37598f7620d39193875eab15b
|
a031aa1fa01f062b087154833738f011f7bc4eb5
|
91
src/log.c
91
src/log.c
@ -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"
|
#include "log.h"
|
||||||
@ -65,13 +89,18 @@ struct LogSummaryHdr {
|
|||||||
/* Size of serialized LogSummaryHdr object. */
|
/* Size of serialized LogSummaryHdr object. */
|
||||||
#define LOGSUMMARY_HDR_NFIELD (sizeof(LogSummaryHdr) / sizeof(u32))
|
#define LOGSUMMARY_HDR_NFIELD (sizeof(LogSummaryHdr) / sizeof(u32))
|
||||||
|
|
||||||
#define LOGSUMMARY_FRAME_OFFSET \
|
/* A block of 16 bytes beginning at LOGSUMMARY_LOCK_OFFSET is reserved
|
||||||
(LOGSUMMARY_HDR_NFIELD + LOG_CKSM_BYTES/sizeof(u32))
|
** 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 header before each frame in log file */
|
||||||
|
|
||||||
/* Size of frame header */
|
|
||||||
#define LOG_FRAME_HDRSIZE 16
|
#define LOG_FRAME_HDRSIZE 16
|
||||||
|
|
||||||
|
/* Size of log header */
|
||||||
#define LOG_HDRSIZE 12
|
#define LOG_HDRSIZE 12
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -197,9 +226,9 @@ struct LogSummary {
|
|||||||
** write to the log file) require an exclusive lock on region D.
|
** write to the log file) require an exclusive lock on region D.
|
||||||
** Which they cannot get until all region D readers have finished.
|
** Which they cannot get until all region D readers have finished.
|
||||||
*/
|
*/
|
||||||
#define LOG_LOCK_MUTEX 12
|
#define LOG_LOCK_MUTEX (LOGSUMMARY_LOCK_OFFSET)
|
||||||
#define LOG_LOCK_DMH 13
|
#define LOG_LOCK_DMH (LOG_LOCK_MUTEX+1)
|
||||||
#define LOG_LOCK_REGION 14
|
#define LOG_LOCK_REGION (LOG_LOCK_DMH+1)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** The four lockable regions associated with each log-summary. A connection
|
** 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){
|
static void logSummaryWriteHdr(LogSummary *pSummary, LogSummaryHdr *pHdr){
|
||||||
u32 *aData = pSummary->aData;
|
u32 *aHdr = pSummary->aData; /* Write header here */
|
||||||
memcpy(aData, pHdr, sizeof(LogSummaryHdr));
|
u32 *aCksum = &aHdr[LOGSUMMARY_HDR_NFIELD]; /* Write header cksum here */
|
||||||
aData[LOGSUMMARY_HDR_NFIELD] = 1;
|
|
||||||
aData[LOGSUMMARY_HDR_NFIELD+1] = 1;
|
assert( LOGSUMMARY_HDR_NFIELD==sizeof(LogSummaryHdr)/4 );
|
||||||
logChecksumBytes(
|
memcpy(aHdr, pHdr, sizeof(LogSummaryHdr));
|
||||||
(u8 *)aData, sizeof(LogSummaryHdr), &aData[LOGSUMMARY_HDR_NFIELD]
|
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.
|
** alternating "map" and "index" blocks.
|
||||||
*/
|
*/
|
||||||
static int logSummaryEntry(u32 iFrame){
|
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
|
** Place, modify or remove a lock on the log-summary file associated
|
||||||
** with pSummary.
|
** 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(
|
static int logLockFd(
|
||||||
LogSummary *pSummary, /* The log-summary object to lock */
|
LogSummary *pSummary, /* The log-summary object to lock */
|
||||||
@ -716,6 +752,13 @@ static int logLockFd(
|
|||||||
|
|
||||||
assert( ArraySize(aType)==ArraySize(aOp) );
|
assert( ArraySize(aType)==ArraySize(aOp) );
|
||||||
assert( op>=0 && op<ArraySize(aType) );
|
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));
|
memset(&f, 0, sizeof(f));
|
||||||
f.l_type = aType[op];
|
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 iStart; /* Byte offset to start locking operation */
|
||||||
int iLen; /* Length field for locking operation */
|
int iLen; /* Length field for locking operation */
|
||||||
} aMap[] = {
|
} aMap[] = {
|
||||||
/* 0000 */ {0, 0}, /* 0001 */ {4+LOG_LOCK_REGION, 1},
|
/* 0000 */ {0, 0}, /* 0001 */ {3+LOG_LOCK_REGION, 1},
|
||||||
/* 0010 */ {3+LOG_LOCK_REGION, 1}, /* 0011 */ {3+LOG_LOCK_REGION, 2},
|
/* 0010 */ {2+LOG_LOCK_REGION, 1}, /* 0011 */ {2+LOG_LOCK_REGION, 2},
|
||||||
/* 0100 */ {2+LOG_LOCK_REGION, 1}, /* 0101 */ {0, 0},
|
/* 0100 */ {1+LOG_LOCK_REGION, 1}, /* 0101 */ {0, 0},
|
||||||
/* 0110 */ {2+LOG_LOCK_REGION, 2}, /* 0111 */ {2+LOG_LOCK_REGION, 3},
|
/* 0110 */ {1+LOG_LOCK_REGION, 2}, /* 0111 */ {1+LOG_LOCK_REGION, 3},
|
||||||
/* 1000 */ {1+LOG_LOCK_REGION, 1}, /* 1001 */ {0, 0},
|
/* 1000 */ {0+LOG_LOCK_REGION, 1}, /* 1001 */ {0, 0},
|
||||||
/* 1010 */ {0, 0}, /* 1011 */ {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}
|
/* 1110 */ {0, 0}, /* 1111 */ {0, 0}
|
||||||
};
|
};
|
||||||
int rc; /* Return code of logLockFd() */
|
int rc; /* Return code of logLockFd() */
|
||||||
|
Loading…
Reference in New Issue
Block a user