aboutsummaryrefslogtreecommitdiff
path: root/src/backend/access/transam/xlog.c
diff options
context:
space:
mode:
authorVadim B. Mikheev <vadim4o@yahoo.com>2000-06-02 10:20:27 +0000
committerVadim B. Mikheev <vadim4o@yahoo.com>2000-06-02 10:20:27 +0000
commitbf1c8f2b3b067c29f1abdf6fe866fb485ade96e9 (patch)
tree2d74502891b92e5b5f590e15777eed299fa65f0b /src/backend/access/transam/xlog.c
parent664dd614d900962b621ee069c8480262d443f66a (diff)
downloadpostgresql-bf1c8f2b3b067c29f1abdf6fe866fb485ade96e9.tar.gz
postgresql-bf1c8f2b3b067c29f1abdf6fe866fb485ade96e9.zip
heap' xlog records
Diffstat (limited to 'src/backend/access/transam/xlog.c')
-rw-r--r--src/backend/access/transam/xlog.c52
1 files changed, 33 insertions, 19 deletions
diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c
index 07a8392c4e4..ca75cfefb18 100644
--- a/src/backend/access/transam/xlog.c
+++ b/src/backend/access/transam/xlog.c
@@ -6,7 +6,7 @@
* Portions Copyright (c) 1996-2000, PostgreSQL, Inc
* Portions Copyright (c) 1994, Regents of the University of California
*
- * $Header: /cvsroot/pgsql/src/backend/access/transam/xlog.c,v 1.14 2000/06/02 03:58:34 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/access/transam/xlog.c,v 1.15 2000/06/02 10:20:25 vadim Exp $
*
*-------------------------------------------------------------------------
*/
@@ -219,7 +219,7 @@ static char readBuf[BLCKSZ];
static XLogRecord *nextRecord = NULL;
XLogRecPtr
-XLogInsert(RmgrId rmid, char *hdr, uint32 hdrlen, char *buf, uint32 buflen)
+XLogInsert(RmgrId rmid, uint8 info, char *hdr, uint32 hdrlen, char *buf, uint32 buflen)
{
XLogCtlInsert *Insert = &XLogCtl->Insert;
XLogRecord *record;
@@ -231,6 +231,7 @@ XLogInsert(RmgrId rmid, char *hdr, uint32 hdrlen, char *buf, uint32 buflen)
uint16 curridx;
bool updrqst = false;
+ Assert(!(info & XLR_INFO_MASK));
if (len == 0 || len > MAXLOGRECSZ)
elog(STOP, "XLogInsert: invalid record len %u", len);
@@ -306,7 +307,8 @@ XLogInsert(RmgrId rmid, char *hdr, uint32 hdrlen, char *buf, uint32 buflen)
}
record->xl_xid = GetCurrentTransactionId();
record->xl_len = (len > freespace) ? freespace : len;
- record->xl_info = (len > freespace) ? XLR_TO_BE_CONTINUED : 0;
+ record->xl_info = (len > freespace) ?
+ (info | XLR_TO_BE_CONTINUED) : info;
record->xl_rmid = rmid;
RecPtr.xlogid = XLogCtl->xlblocks[curridx].xlogid;
RecPtr.xrecoff =
@@ -318,8 +320,7 @@ XLogInsert(RmgrId rmid, char *hdr, uint32 hdrlen, char *buf, uint32 buflen)
MyProc->logRec = RecPtr;
SpinRelease(SInvalLock);
}
- MyLastRecPtr = RecPtr;
- RecPtr.xrecoff += record->xl_len;
+ MyLastRecPtr = RecPtr; /* begin of record */
Insert->currpos += SizeOfXLogRecord;
if (freespace > 0)
{
@@ -364,6 +365,7 @@ nbuf:
if (hdrlen > freespace)
{
subrecord->xl_len = freespace;
+ /* we don't store info in subrecord' xl_info */
subrecord->xl_info = XLR_TO_BE_CONTINUED;
memcpy(Insert->currpos, hdr, freespace);
hdrlen -= freespace;
@@ -383,6 +385,7 @@ nbuf:
if (buflen > freespace)
{
subrecord->xl_len += freespace;
+ /* we don't store info in subrecord' xl_info */
subrecord->xl_info = XLR_TO_BE_CONTINUED;
memcpy(Insert->currpos, buf, freespace);
buflen -= freespace;
@@ -395,16 +398,23 @@ nbuf:
memcpy(Insert->currpos, buf, buflen);
Insert->currpos += buflen;
}
+ /* we don't store info in subrecord' xl_info */
subrecord->xl_info = 0;
- RecPtr.xlogid = XLogCtl->xlblocks[curridx].xlogid;
- RecPtr.xrecoff = XLogCtl->xlblocks[curridx].xrecoff -
- BLCKSZ + SizeOfXLogPHD + subrecord->xl_len;
Insert->currpos = ((char *) Insert->currpage) +
DOUBLEALIGN(Insert->currpos - ((char *) Insert->currpage));
}
freespace = ((char *) Insert->currpage) + BLCKSZ - Insert->currpos;
/*
+ * Begin of the next record will be stored as LSN for
+ * changed data page...
+ */
+ RecPtr.xlogid = XLogCtl->xlblocks[curridx].xlogid;
+ RecPtr.xrecoff =
+ XLogCtl->xlblocks[curridx].xrecoff - BLCKSZ +
+ Insert->currpos - ((char *) Insert->currpage);
+
+ /*
* All done! Update global LgwrRqst if some block was filled up.
*/
if (freespace < SizeOfXLogRecord)
@@ -884,7 +894,8 @@ got_record:;
XLogSubRecord *subrecord;
uint32 len = record->xl_len;
- if (record->xl_len + RecPtr->xrecoff % BLCKSZ + SizeOfXLogRecord != BLCKSZ)
+ if (DOUBLEALIGN(record->xl_len) + RecPtr->xrecoff % BLCKSZ +
+ SizeOfXLogRecord != BLCKSZ)
{
elog(emode, "ReadRecord: invalid fragmented record len %u in (%u, %u)",
record->xl_len, RecPtr->xlogid, RecPtr->xrecoff);
@@ -945,7 +956,7 @@ got_record:;
buffer += subrecord->xl_len;
if (subrecord->xl_info & XLR_TO_BE_CONTINUED)
{
- if (subrecord->xl_len +
+ if (DOUBLEALIGN(subrecord->xl_len) +
SizeOfXLogPHD + SizeOfXLogSubRecord != BLCKSZ)
{
elog(emode, "ReadRecord: invalid fragmented subrecord len %u in logfile %u seg %u off %u",
@@ -956,23 +967,26 @@ got_record:;
}
break;
}
- if (BLCKSZ - SizeOfXLogRecord >=
- subrecord->xl_len + SizeOfXLogPHD + SizeOfXLogSubRecord)
+ if (BLCKSZ - SizeOfXLogRecord >= DOUBLEALIGN(subrecord->xl_len) +
+ SizeOfXLogPHD + SizeOfXLogSubRecord)
{
- nextRecord = (XLogRecord *)
- ((char *) subrecord + subrecord->xl_len + SizeOfXLogSubRecord);
+ nextRecord = (XLogRecord *) ((char *) subrecord +
+ DOUBLEALIGN(subrecord->xl_len) + SizeOfXLogSubRecord);
}
EndRecPtr.xlogid = readId;
EndRecPtr.xrecoff = readSeg * XLogSegSize + readOff * BLCKSZ +
- SizeOfXLogPHD + SizeOfXLogSubRecord + subrecord->xl_len;
+ SizeOfXLogPHD + SizeOfXLogSubRecord +
+ DOUBLEALIGN(subrecord->xl_len);
ReadRecPtr = *RecPtr;
return (record);
}
- if (BLCKSZ - SizeOfXLogRecord >=
- record->xl_len + RecPtr->xrecoff % BLCKSZ + SizeOfXLogRecord)
- nextRecord = (XLogRecord *) ((char *) record + record->xl_len + SizeOfXLogRecord);
+ if (BLCKSZ - SizeOfXLogRecord >= DOUBLEALIGN(record->xl_len) +
+ RecPtr->xrecoff % BLCKSZ + SizeOfXLogRecord)
+ nextRecord = (XLogRecord *) ((char *) record +
+ DOUBLEALIGN(record->xl_len) + SizeOfXLogRecord);
EndRecPtr.xlogid = RecPtr->xlogid;
- EndRecPtr.xrecoff = RecPtr->xrecoff + record->xl_len + SizeOfXLogRecord;
+ EndRecPtr.xrecoff = RecPtr->xrecoff +
+ DOUBLEALIGN(record->xl_len) + SizeOfXLogRecord;
ReadRecPtr = *RecPtr;
return (record);