66 * Portions Copyright (c) 1996-2000, PostgreSQL, Inc
77 * Portions Copyright (c) 1994, Regents of the University of California
88 *
9- * $Header: /cvsroot/pgsql/src/backend/access/transam/xlog.c,v 1.14 2000/06/0203:58:34 tgl Exp $
9+ * $Header: /cvsroot/pgsql/src/backend/access/transam/xlog.c,v 1.15 2000/06/0210:20:25 vadim Exp $
1010 *
1111 *-------------------------------------------------------------------------
1212 */
@@ -219,7 +219,7 @@ static char readBuf[BLCKSZ];
219219static XLogRecord * nextRecord = NULL ;
220220
221221XLogRecPtr
222- XLogInsert (RmgrId rmid ,char * hdr ,uint32 hdrlen ,char * buf ,uint32 buflen )
222+ XLogInsert (RmgrId rmid ,uint8 info , char * hdr ,uint32 hdrlen ,char * buf ,uint32 buflen )
223223{
224224XLogCtlInsert * Insert = & XLogCtl -> Insert ;
225225XLogRecord * record ;
@@ -231,6 +231,7 @@ XLogInsert(RmgrId rmid, char *hdr, uint32 hdrlen, char *buf, uint32 buflen)
231231uint16 curridx ;
232232bool updrqst = false;
233233
234+ Assert (!(info & XLR_INFO_MASK ));
234235if (len == 0 || len > MAXLOGRECSZ )
235236elog (STOP ,"XLogInsert: invalid record len %u" ,len );
236237
@@ -306,7 +307,8 @@ XLogInsert(RmgrId rmid, char *hdr, uint32 hdrlen, char *buf, uint32 buflen)
306307}
307308record -> xl_xid = GetCurrentTransactionId ();
308309record -> xl_len = (len > freespace ) ?freespace :len ;
309- record -> xl_info = (len > freespace ) ?XLR_TO_BE_CONTINUED :0 ;
310+ record -> xl_info = (len > freespace ) ?
311+ (info |XLR_TO_BE_CONTINUED ) :info ;
310312record -> xl_rmid = rmid ;
311313RecPtr .xlogid = XLogCtl -> xlblocks [curridx ].xlogid ;
312314RecPtr .xrecoff =
@@ -318,8 +320,7 @@ XLogInsert(RmgrId rmid, char *hdr, uint32 hdrlen, char *buf, uint32 buflen)
318320MyProc -> logRec = RecPtr ;
319321SpinRelease (SInvalLock );
320322}
321- MyLastRecPtr = RecPtr ;
322- RecPtr .xrecoff += record -> xl_len ;
323+ MyLastRecPtr = RecPtr ;/* begin of record */
323324Insert -> currpos += SizeOfXLogRecord ;
324325if (freespace > 0 )
325326{
@@ -364,6 +365,7 @@ XLogInsert(RmgrId rmid, char *hdr, uint32 hdrlen, char *buf, uint32 buflen)
364365if (hdrlen > freespace )
365366{
366367subrecord -> xl_len = freespace ;
368+ /* we don't store info in subrecord' xl_info */
367369subrecord -> xl_info = XLR_TO_BE_CONTINUED ;
368370memcpy (Insert -> currpos ,hdr ,freespace );
369371hdrlen -= freespace ;
@@ -383,6 +385,7 @@ XLogInsert(RmgrId rmid, char *hdr, uint32 hdrlen, char *buf, uint32 buflen)
383385if (buflen > freespace )
384386{
385387subrecord -> xl_len += freespace ;
388+ /* we don't store info in subrecord' xl_info */
386389subrecord -> xl_info = XLR_TO_BE_CONTINUED ;
387390memcpy (Insert -> currpos ,buf ,freespace );
388391buflen -= freespace ;
@@ -395,15 +398,22 @@ XLogInsert(RmgrId rmid, char *hdr, uint32 hdrlen, char *buf, uint32 buflen)
395398memcpy (Insert -> currpos ,buf ,buflen );
396399Insert -> currpos += buflen ;
397400}
401+ /* we don't store info in subrecord' xl_info */
398402subrecord -> xl_info = 0 ;
399- RecPtr .xlogid = XLogCtl -> xlblocks [curridx ].xlogid ;
400- RecPtr .xrecoff = XLogCtl -> xlblocks [curridx ].xrecoff -
401- BLCKSZ + SizeOfXLogPHD + subrecord -> xl_len ;
402403Insert -> currpos = ((char * )Insert -> currpage )+
403404DOUBLEALIGN (Insert -> currpos - ((char * )Insert -> currpage ));
404405}
405406freespace = ((char * )Insert -> currpage )+ BLCKSZ - Insert -> currpos ;
406407
408+ /*
409+ * Begin of the next record will be stored as LSN for
410+ * changed data page...
411+ */
412+ RecPtr .xlogid = XLogCtl -> xlblocks [curridx ].xlogid ;
413+ RecPtr .xrecoff =
414+ XLogCtl -> xlblocks [curridx ].xrecoff - BLCKSZ +
415+ Insert -> currpos - ((char * )Insert -> currpage );
416+
407417/*
408418 * All done! Update global LgwrRqst if some block was filled up.
409419 */
@@ -884,7 +894,8 @@ got_record:;
884894XLogSubRecord * subrecord ;
885895uint32 len = record -> xl_len ;
886896
887- if (record -> xl_len + RecPtr -> xrecoff %BLCKSZ + SizeOfXLogRecord != BLCKSZ )
897+ if (DOUBLEALIGN (record -> xl_len )+ RecPtr -> xrecoff %BLCKSZ +
898+ SizeOfXLogRecord != BLCKSZ )
888899{
889900elog (emode ,"ReadRecord: invalid fragmented record len %u in (%u, %u)" ,
890901record -> xl_len ,RecPtr -> xlogid ,RecPtr -> xrecoff );
@@ -945,7 +956,7 @@ got_record:;
945956buffer += subrecord -> xl_len ;
946957if (subrecord -> xl_info & XLR_TO_BE_CONTINUED )
947958{
948- if (subrecord -> xl_len +
959+ if (DOUBLEALIGN ( subrecord -> xl_len ) +
949960SizeOfXLogPHD + SizeOfXLogSubRecord != BLCKSZ )
950961{
951962elog (emode ,"ReadRecord: invalid fragmented subrecord len %u in logfile %u seg %u off %u" ,
@@ -956,23 +967,26 @@ got_record:;
956967}
957968break ;
958969}
959- if (BLCKSZ - SizeOfXLogRecord >=
960- subrecord -> xl_len + SizeOfXLogPHD + SizeOfXLogSubRecord )
970+ if (BLCKSZ - SizeOfXLogRecord >=DOUBLEALIGN ( subrecord -> xl_len ) +
971+ SizeOfXLogPHD + SizeOfXLogSubRecord )
961972{
962- nextRecord = (XLogRecord * )
963- (( char * ) subrecord + subrecord -> xl_len + SizeOfXLogSubRecord );
973+ nextRecord = (XLogRecord * ) (( char * ) subrecord +
974+ DOUBLEALIGN ( subrecord -> xl_len ) + SizeOfXLogSubRecord );
964975}
965976EndRecPtr .xlogid = readId ;
966977EndRecPtr .xrecoff = readSeg * XLogSegSize + readOff * BLCKSZ +
967- SizeOfXLogPHD + SizeOfXLogSubRecord + subrecord -> xl_len ;
978+ SizeOfXLogPHD + SizeOfXLogSubRecord +
979+ DOUBLEALIGN (subrecord -> xl_len );
968980ReadRecPtr = * RecPtr ;
969981return (record );
970982}
971- if (BLCKSZ - SizeOfXLogRecord >=
972- record -> xl_len + RecPtr -> xrecoff %BLCKSZ + SizeOfXLogRecord )
973- nextRecord = (XLogRecord * ) ((char * )record + record -> xl_len + SizeOfXLogRecord );
983+ if (BLCKSZ - SizeOfXLogRecord >=DOUBLEALIGN (record -> xl_len )+
984+ RecPtr -> xrecoff %BLCKSZ + SizeOfXLogRecord )
985+ nextRecord = (XLogRecord * ) ((char * )record +
986+ DOUBLEALIGN (record -> xl_len )+ SizeOfXLogRecord );
974987EndRecPtr .xlogid = RecPtr -> xlogid ;
975- EndRecPtr .xrecoff = RecPtr -> xrecoff + record -> xl_len + SizeOfXLogRecord ;
988+ EndRecPtr .xrecoff = RecPtr -> xrecoff +
989+ DOUBLEALIGN (record -> xl_len )+ SizeOfXLogRecord ;
976990ReadRecPtr = * RecPtr ;
977991
978992return (record );