aboutsummaryrefslogtreecommitdiff
path: root/src/backend/access/transam/xlog.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/access/transam/xlog.c')
-rw-r--r--src/backend/access/transam/xlog.c37
1 files changed, 32 insertions, 5 deletions
diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c
index aa952a42ab4..13dba319185 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.22 2000/10/28 16:20:54 vadim Exp $
+ * $Header: /cvsroot/pgsql/src/backend/access/transam/xlog.c,v 1.23 2000/11/03 11:39:35 vadim Exp $
*
*-------------------------------------------------------------------------
*/
@@ -157,6 +157,7 @@ typedef struct CheckPoint
} CheckPoint;
#define XLOG_CHECKPOINT 0x00
+#define XLOG_NEXTOID 0x10
/*
* We break each log file in 16Mb segments
@@ -1373,10 +1374,9 @@ StartupXLOG()
elog(LOG, "Invalid NextTransactionId/NextOid");
#endif
-#ifdef XLOG_2
ShmemVariableCache->nextXid = checkPoint.nextXid;
ShmemVariableCache->nextOid = checkPoint.nextOid;
-#endif
+ ShmemVariableCache->oidCount = 0;
ThisStartUpID = checkPoint.ThisStartUpID;
@@ -1430,10 +1430,8 @@ StartupXLOG()
ReadRecPtr.xlogid, ReadRecPtr.xrecoff);
do
{
-#ifdef XLOG_2
if (record->xl_xid >= ShmemVariableCache->nextXid)
ShmemVariableCache->nextXid = record->xl_xid + 1;
-#endif
if (XLOG_DEBUG)
{
char buf[8192];
@@ -1609,6 +1607,9 @@ CreateCheckPoint(bool shutdown)
SpinRelease(XidGenLockId);
SpinAcquire(OidGenLockId);
checkPoint.nextOid = ShmemVariableCache->nextOid;
+ if (!shutdown)
+ checkPoint.nextOid += ShmemVariableCache->oidCount;
+
SpinRelease(OidGenLockId);
FlushBufferPool();
@@ -1647,6 +1648,15 @@ CreateCheckPoint(bool shutdown)
return;
}
+void XLogPutNextOid(Oid nextOid);
+
+void
+XLogPutNextOid(Oid nextOid)
+{
+ (void) XLogInsert(RM_XLOG_ID, XLOG_NEXTOID,
+ (char *) &nextOid, sizeof(Oid), NULL, 0);
+}
+
void xlog_redo(XLogRecPtr lsn, XLogRecord *record);
void xlog_undo(XLogRecPtr lsn, XLogRecord *record);
void xlog_desc(char *buf, uint8 xl_info, char* rec);
@@ -1654,6 +1664,16 @@ void xlog_desc(char *buf, uint8 xl_info, char* rec);
void
xlog_redo(XLogRecPtr lsn, XLogRecord *record)
{
+ uint8 info = record->xl_info & ~XLR_INFO_MASK;
+
+ if (info == XLOG_NEXTOID)
+ {
+ Oid nextOid;
+
+ memcpy(&nextOid, XLogRecGetData(record), sizeof(Oid));
+ if (ShmemVariableCache->nextOid < nextOid)
+ ShmemVariableCache->nextOid = nextOid;
+ }
}
void
@@ -1677,6 +1697,13 @@ xlog_desc(char *buf, uint8 xl_info, char* rec)
checkpoint->nextOid,
(checkpoint->Shutdown) ? "shutdown" : "online");
}
+ else if (info == XLOG_NEXTOID)
+ {
+ Oid nextOid;
+
+ memcpy(&nextOid, rec, sizeof(Oid));
+ sprintf(buf + strlen(buf), "nextOid: %u", nextOid);
+ }
else
strcat(buf, "UNKNOWN");
}