77 * Portions Copyright (c) 1996-2001, PostgreSQL Global Development Group
88 * Portions Copyright (c) 1994, Regents of the University of California
99 *
10- * $Header: /cvsroot/pgsql/src/backend/access/transam/xlog.c,v 1.73 2001/08/10 18:57:33 tgl Exp $
10+ * $Header: /cvsroot/pgsql/src/backend/access/transam/xlog.c,v 1.74 2001/08/23 23:06:37 tgl Exp $
1111 *
1212 *-------------------------------------------------------------------------
1313 */
@@ -2349,7 +2349,7 @@ BootStrapXLOG(void)
23492349checkPoint .redo .xrecoff = SizeOfXLogPHD ;
23502350checkPoint .undo = checkPoint .redo ;
23512351checkPoint .ThisStartUpID = 0 ;
2352- checkPoint .nextXid = FirstTransactionId ;
2352+ checkPoint .nextXid = FirstNormalTransactionId ;
23532353checkPoint .nextOid = BootstrapObjectIdData ;
23542354checkPoint .time = time (NULL );
23552355
@@ -2508,7 +2508,7 @@ StartupXLOG(void)
25082508wasShutdown ?"TRUE" :"FALSE" );
25092509elog (LOG ,"next transaction id: %u; next oid: %u" ,
25102510checkPoint .nextXid ,checkPoint .nextOid );
2511- if (checkPoint .nextXid < FirstTransactionId )
2511+ if (! TransactionIdIsNormal ( checkPoint .nextXid ) )
25122512elog (STOP ,"invalid next transaction id" );
25132513
25142514ShmemVariableCache -> nextXid = checkPoint .nextXid ;
@@ -2550,8 +2550,10 @@ StartupXLOG(void)
25502550if (XLByteLT (checkPoint .redo ,RecPtr ))
25512551record = ReadRecord (& (checkPoint .redo ),STOP ,buffer );
25522552else
2553- /* read past CheckPoint record */
2553+ {
2554+ /* read past CheckPoint record */
25542555record = ReadRecord (NULL ,LOG ,buffer );
2556+ }
25552557
25562558if (record != NULL )
25572559{
@@ -2560,8 +2562,13 @@ StartupXLOG(void)
25602562ReadRecPtr .xlogid ,ReadRecPtr .xrecoff );
25612563do
25622564{
2563- if (record -> xl_xid >=ShmemVariableCache -> nextXid )
2564- ShmemVariableCache -> nextXid = record -> xl_xid + 1 ;
2565+ /* nextXid must be beyond record's xid */
2566+ if (TransactionIdFollowsOrEquals (record -> xl_xid ,
2567+ ShmemVariableCache -> nextXid ))
2568+ {
2569+ ShmemVariableCache -> nextXid = record -> xl_xid ;
2570+ TransactionIdAdvance (ShmemVariableCache -> nextXid );
2571+ }
25652572if (XLOG_DEBUG )
25662573{
25672574char buf [8192 ];
@@ -3101,7 +3108,8 @@ xlog_redo(XLogRecPtr lsn, XLogRecord *record)
31013108
31023109memcpy (& checkPoint ,XLogRecGetData (record ),sizeof (CheckPoint ));
31033110/* In an ONLINE checkpoint, treat the counters like NEXTOID */
3104- if (ShmemVariableCache -> nextXid < checkPoint .nextXid )
3111+ if (TransactionIdPrecedes (ShmemVariableCache -> nextXid ,
3112+ checkPoint .nextXid ))
31053113ShmemVariableCache -> nextXid = checkPoint .nextXid ;
31063114if (ShmemVariableCache -> nextOid < checkPoint .nextOid )
31073115{