6
6
* Portions Copyright (c) 1996-2000, PostgreSQL, Inc
7
7
* Portions Copyright (c) 1994, Regents of the University of California
8
8
*
9
- * $Header: /cvsroot/pgsql/src/backend/access/transam/xlog.c,v 1.14 2000/06/02 03:58:34 tgl Exp $
9
+ * $Header: /cvsroot/pgsql/src/backend/access/transam/xlog.c,v 1.15 2000/06/02 10:20:25 vadim Exp $
10
10
*
11
11
*-------------------------------------------------------------------------
12
12
*/
@@ -219,7 +219,7 @@ static char readBuf[BLCKSZ];
219
219
static XLogRecord * nextRecord = NULL ;
220
220
221
221
XLogRecPtr
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 )
223
223
{
224
224
XLogCtlInsert * Insert = & XLogCtl -> Insert ;
225
225
XLogRecord * record ;
@@ -231,6 +231,7 @@ XLogInsert(RmgrId rmid, char *hdr, uint32 hdrlen, char *buf, uint32 buflen)
231
231
uint16 curridx ;
232
232
bool updrqst = false;
233
233
234
+ Assert (!(info & XLR_INFO_MASK ));
234
235
if (len == 0 || len > MAXLOGRECSZ )
235
236
elog (STOP , "XLogInsert: invalid record len %u" , len );
236
237
@@ -306,7 +307,8 @@ XLogInsert(RmgrId rmid, char *hdr, uint32 hdrlen, char *buf, uint32 buflen)
306
307
}
307
308
record -> xl_xid = GetCurrentTransactionId ();
308
309
record -> 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 ;
310
312
record -> xl_rmid = rmid ;
311
313
RecPtr .xlogid = XLogCtl -> xlblocks [curridx ].xlogid ;
312
314
RecPtr .xrecoff =
@@ -318,8 +320,7 @@ XLogInsert(RmgrId rmid, char *hdr, uint32 hdrlen, char *buf, uint32 buflen)
318
320
MyProc -> logRec = RecPtr ;
319
321
SpinRelease (SInvalLock );
320
322
}
321
- MyLastRecPtr = RecPtr ;
322
- RecPtr .xrecoff += record -> xl_len ;
323
+ MyLastRecPtr = RecPtr ; /* begin of record */
323
324
Insert -> currpos += SizeOfXLogRecord ;
324
325
if (freespace > 0 )
325
326
{
@@ -364,6 +365,7 @@ XLogInsert(RmgrId rmid, char *hdr, uint32 hdrlen, char *buf, uint32 buflen)
364
365
if (hdrlen > freespace )
365
366
{
366
367
subrecord -> xl_len = freespace ;
368
+ /* we don't store info in subrecord' xl_info */
367
369
subrecord -> xl_info = XLR_TO_BE_CONTINUED ;
368
370
memcpy (Insert -> currpos , hdr , freespace );
369
371
hdrlen -= freespace ;
@@ -383,6 +385,7 @@ XLogInsert(RmgrId rmid, char *hdr, uint32 hdrlen, char *buf, uint32 buflen)
383
385
if (buflen > freespace )
384
386
{
385
387
subrecord -> xl_len += freespace ;
388
+ /* we don't store info in subrecord' xl_info */
386
389
subrecord -> xl_info = XLR_TO_BE_CONTINUED ;
387
390
memcpy (Insert -> currpos , buf , freespace );
388
391
buflen -= freespace ;
@@ -395,15 +398,22 @@ XLogInsert(RmgrId rmid, char *hdr, uint32 hdrlen, char *buf, uint32 buflen)
395
398
memcpy (Insert -> currpos , buf , buflen );
396
399
Insert -> currpos += buflen ;
397
400
}
401
+ /* we don't store info in subrecord' xl_info */
398
402
subrecord -> xl_info = 0 ;
399
- RecPtr .xlogid = XLogCtl -> xlblocks [curridx ].xlogid ;
400
- RecPtr .xrecoff = XLogCtl -> xlblocks [curridx ].xrecoff -
401
- BLCKSZ + SizeOfXLogPHD + subrecord -> xl_len ;
402
403
Insert -> currpos = ((char * ) Insert -> currpage ) +
403
404
DOUBLEALIGN (Insert -> currpos - ((char * ) Insert -> currpage ));
404
405
}
405
406
freespace = ((char * ) Insert -> currpage ) + BLCKSZ - Insert -> currpos ;
406
407
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
+
407
417
/*
408
418
* All done! Update global LgwrRqst if some block was filled up.
409
419
*/
@@ -884,7 +894,8 @@ got_record:;
884
894
XLogSubRecord * subrecord ;
885
895
uint32 len = record -> xl_len ;
886
896
887
- if (record -> xl_len + RecPtr -> xrecoff % BLCKSZ + SizeOfXLogRecord != BLCKSZ )
897
+ if (DOUBLEALIGN (record -> xl_len ) + RecPtr -> xrecoff % BLCKSZ +
898
+ SizeOfXLogRecord != BLCKSZ )
888
899
{
889
900
elog (emode , "ReadRecord: invalid fragmented record len %u in (%u, %u)" ,
890
901
record -> xl_len , RecPtr -> xlogid , RecPtr -> xrecoff );
@@ -945,7 +956,7 @@ got_record:;
945
956
buffer += subrecord -> xl_len ;
946
957
if (subrecord -> xl_info & XLR_TO_BE_CONTINUED )
947
958
{
948
- if (subrecord -> xl_len +
959
+ if (DOUBLEALIGN ( subrecord -> xl_len ) +
949
960
SizeOfXLogPHD + SizeOfXLogSubRecord != BLCKSZ )
950
961
{
951
962
elog (emode , "ReadRecord: invalid fragmented subrecord len %u in logfile %u seg %u off %u" ,
@@ -956,23 +967,26 @@ got_record:;
956
967
}
957
968
break ;
958
969
}
959
- if (BLCKSZ - SizeOfXLogRecord >=
960
- subrecord -> xl_len + SizeOfXLogPHD + SizeOfXLogSubRecord )
970
+ if (BLCKSZ - SizeOfXLogRecord >= DOUBLEALIGN ( subrecord -> xl_len ) +
971
+ SizeOfXLogPHD + SizeOfXLogSubRecord )
961
972
{
962
- nextRecord = (XLogRecord * )
963
- (( char * ) subrecord + subrecord -> xl_len + SizeOfXLogSubRecord );
973
+ nextRecord = (XLogRecord * ) (( char * ) subrecord +
974
+ DOUBLEALIGN ( subrecord -> xl_len ) + SizeOfXLogSubRecord );
964
975
}
965
976
EndRecPtr .xlogid = readId ;
966
977
EndRecPtr .xrecoff = readSeg * XLogSegSize + readOff * BLCKSZ +
967
- SizeOfXLogPHD + SizeOfXLogSubRecord + subrecord -> xl_len ;
978
+ SizeOfXLogPHD + SizeOfXLogSubRecord +
979
+ DOUBLEALIGN (subrecord -> xl_len );
968
980
ReadRecPtr = * RecPtr ;
969
981
return (record );
970
982
}
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 );
974
987
EndRecPtr .xlogid = RecPtr -> xlogid ;
975
- EndRecPtr .xrecoff = RecPtr -> xrecoff + record -> xl_len + SizeOfXLogRecord ;
988
+ EndRecPtr .xrecoff = RecPtr -> xrecoff +
989
+ DOUBLEALIGN (record -> xl_len ) + SizeOfXLogRecord ;
976
990
ReadRecPtr = * RecPtr ;
977
991
978
992
return (record );
0 commit comments