Rename XLOG_BTREE_NEWPAGE xlog record type into XLOG_HEAP_NEWPAGE, and
authorTom Lane <tgl@sss.pgh.pa.us>
Sun, 11 Jul 2004 18:01:45 +0000 (18:01 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Sun, 11 Jul 2004 18:01:45 +0000 (18:01 +0000)
shift support code into heapam.c accordingly.  This is in service of
soon-to-be-committed ALTER TABLE SET TABLESPACE code that will want to
use this same record type for both heaps and indexes.

Theoretically I should have forced initdb for this, but in practice there
is no change in xlog contents because CVS tip will never really emit this
record type anyhow...

src/backend/access/heap/heapam.c
src/backend/access/nbtree/nbtsort.c
src/backend/access/nbtree/nbtxlog.c
src/include/access/htup.h
src/include/access/nbtree.h

index 8e595c18cb88d06b0397e161960d4318bc6ff9ce..f0be8123f5c476793e7704f0612f9799f8996804 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *   $PostgreSQL: pgsql/src/backend/access/heap/heapam.c,v 1.169 2004/06/18 06:13:09 tgl Exp $
+ *   $PostgreSQL: pgsql/src/backend/access/heap/heapam.c,v 1.170 2004/07/11 18:01:44 tgl Exp $
  *
  *
  * INTERFACE ROUTINES
@@ -2189,6 +2189,39 @@ heap_xlog_clean(bool redo, XLogRecPtr lsn, XLogRecord *record)
    WriteBuffer(buffer);
 }
 
+static void
+heap_xlog_newpage(bool redo, XLogRecPtr lsn, XLogRecord *record)
+{
+   xl_heap_newpage *xlrec = (xl_heap_newpage *) XLogRecGetData(record);
+   Relation    reln;
+   Buffer      buffer;
+   Page        page;
+
+   /*
+    * Note: the NEWPAGE log record is used for both heaps and indexes,
+    * so do not do anything that assumes we are touching a heap.
+    */
+
+   if (!redo || (record->xl_info & XLR_BKP_BLOCK_1))
+       return;
+
+   reln = XLogOpenRelation(redo, RM_HEAP_ID, xlrec->node);
+   if (!RelationIsValid(reln))
+       return;
+   buffer = XLogReadBuffer(true, reln, xlrec->blkno);
+   if (!BufferIsValid(buffer))
+       elog(PANIC, "heap_newpage_redo: no block");
+   page = (Page) BufferGetPage(buffer);
+
+   Assert(record->xl_len == SizeOfHeapNewpage + BLCKSZ);
+   memcpy(page, (char *) xlrec + SizeOfHeapNewpage, BLCKSZ);
+
+   PageSetLSN(page, lsn);
+   PageSetSUI(page, ThisStartUpID);
+   LockBuffer(buffer, BUFFER_LOCK_UNLOCK);
+   WriteBuffer(buffer);
+}
+
 static void
 heap_xlog_delete(bool redo, XLogRecPtr lsn, XLogRecord *record)
 {
@@ -2603,6 +2636,8 @@ heap_redo(XLogRecPtr lsn, XLogRecord *record)
        heap_xlog_update(true, lsn, record, true);
    else if (info == XLOG_HEAP_CLEAN)
        heap_xlog_clean(true, lsn, record);
+   else if (info == XLOG_HEAP_NEWPAGE)
+       heap_xlog_newpage(true, lsn, record);
    else
        elog(PANIC, "heap_redo: unknown op code %u", info);
 }
@@ -2623,6 +2658,8 @@ heap_undo(XLogRecPtr lsn, XLogRecord *record)
        heap_xlog_update(false, lsn, record, true);
    else if (info == XLOG_HEAP_CLEAN)
        heap_xlog_clean(false, lsn, record);
+   else if (info == XLOG_HEAP_NEWPAGE)
+       heap_xlog_newpage(false, lsn, record);
    else
        elog(PANIC, "heap_undo: unknown op code %u", info);
 }
@@ -2677,6 +2714,14 @@ heap_desc(char *buf, uint8 xl_info, char *rec)
                xlrec->node.spcNode, xlrec->node.dbNode,
                xlrec->node.relNode, xlrec->block);
    }
+   else if (info == XLOG_HEAP_NEWPAGE)
+   {
+       xl_heap_newpage *xlrec = (xl_heap_newpage *) rec;
+
+       sprintf(buf + strlen(buf), "newpage: rel %u/%u/%u; blk %u",
+               xlrec->node.spcNode, xlrec->node.dbNode,
+               xlrec->node.relNode, xlrec->blkno);
+   }
    else
        strcat(buf, "UNKNOWN");
 }
index ba0383c0bcd517a1b39fdc5dc221d11739991e6d..bdd063daa3193f1fd39a87fc463c738aac16baa9 100644 (file)
@@ -56,7 +56,7 @@
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  * IDENTIFICATION
- *   $PostgreSQL: pgsql/src/backend/access/nbtree/nbtsort.c,v 1.82 2004/06/02 17:28:17 tgl Exp $
+ *   $PostgreSQL: pgsql/src/backend/access/nbtree/nbtsort.c,v 1.83 2004/07/11 18:01:45 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -280,7 +280,8 @@ _bt_blwritepage(BTWriteState *wstate, Page page, BlockNumber blkno)
    /* XLOG stuff */
    if (wstate->btws_use_wal)
    {
-       xl_btree_newpage xlrec;
+       /* We use the heap NEWPAGE record type for this */
+       xl_heap_newpage xlrec;
        XLogRecPtr  recptr;
        XLogRecData rdata[2];
 
@@ -292,7 +293,7 @@ _bt_blwritepage(BTWriteState *wstate, Page page, BlockNumber blkno)
 
        rdata[0].buffer = InvalidBuffer;
        rdata[0].data = (char *) &xlrec;
-       rdata[0].len = SizeOfBtreeNewpage;
+       rdata[0].len = SizeOfHeapNewpage;
        rdata[0].next = &(rdata[1]);
 
        rdata[1].buffer = InvalidBuffer;
@@ -300,7 +301,7 @@ _bt_blwritepage(BTWriteState *wstate, Page page, BlockNumber blkno)
        rdata[1].len = BLCKSZ;
        rdata[1].next = NULL;
 
-       recptr = XLogInsert(RM_BTREE_ID, XLOG_BTREE_NEWPAGE, rdata);
+       recptr = XLogInsert(RM_HEAP_ID, XLOG_HEAP_NEWPAGE, rdata);
 
        PageSetLSN(page, recptr);
        PageSetSUI(page, ThisStartUpID);
index 3cb2f3836d26e791342f97ee3c197fbf484be6e9..73e2ddf287c7bd1069ab58f0016a93435120688d 100644 (file)
@@ -8,7 +8,7 @@
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  * IDENTIFICATION
- *   $PostgreSQL: pgsql/src/backend/access/nbtree/nbtxlog.c,v 1.14 2004/06/18 06:13:11 tgl Exp $
+ *   $PostgreSQL: pgsql/src/backend/access/nbtree/nbtxlog.c,v 1.15 2004/07/11 18:01:45 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -669,34 +669,6 @@ btree_xlog_newmeta(bool redo, XLogRecPtr lsn, XLogRecord *record)
                     xlrec->meta.fastroot, xlrec->meta.fastlevel);
 }
 
-static void
-btree_xlog_newpage(bool redo, XLogRecPtr lsn, XLogRecord *record)
-{
-   xl_btree_newpage *xlrec = (xl_btree_newpage *) XLogRecGetData(record);
-   Relation    reln;
-   Buffer      buffer;
-   Page        page;
-
-   if (!redo || (record->xl_info & XLR_BKP_BLOCK_1))
-       return;
-
-   reln = XLogOpenRelation(redo, RM_BTREE_ID, xlrec->node);
-   if (!RelationIsValid(reln))
-       return;
-   buffer = XLogReadBuffer(true, reln, xlrec->blkno);
-   if (!BufferIsValid(buffer))
-       elog(PANIC, "btree_newpage_redo: block unfound");
-   page = (Page) BufferGetPage(buffer);
-
-   Assert(record->xl_len == SizeOfBtreeNewpage + BLCKSZ);
-   memcpy(page, (char *) xlrec + SizeOfBtreeNewpage, BLCKSZ);
-
-   PageSetLSN(page, lsn);
-   PageSetSUI(page, ThisStartUpID);
-   LockBuffer(buffer, BUFFER_LOCK_UNLOCK);
-   WriteBuffer(buffer);
-}
-
 
 void
 btree_redo(XLogRecPtr lsn, XLogRecord *record)
@@ -741,9 +713,6 @@ btree_redo(XLogRecPtr lsn, XLogRecord *record)
        case XLOG_BTREE_NEWMETA:
            btree_xlog_newmeta(true, lsn, record);
            break;
-       case XLOG_BTREE_NEWPAGE:
-           btree_xlog_newpage(true, lsn, record);
-           break;
        default:
            elog(PANIC, "btree_redo: unknown op code %u", info);
    }
@@ -792,9 +761,6 @@ btree_undo(XLogRecPtr lsn, XLogRecord *record)
        case XLOG_BTREE_NEWMETA:
            btree_xlog_newmeta(false, lsn, record);
            break;
-       case XLOG_BTREE_NEWPAGE:
-           btree_xlog_newpage(false, lsn, record);
-           break;
        default:
            elog(PANIC, "btree_undo: unknown op code %u", info);
    }
@@ -921,15 +887,6 @@ btree_desc(char *buf, uint8 xl_info, char *rec)
                        xlrec->meta.fastroot, xlrec->meta.fastlevel);
                break;
            }
-       case XLOG_BTREE_NEWPAGE:
-           {
-               xl_btree_newpage *xlrec = (xl_btree_newpage *) rec;
-
-               sprintf(buf + strlen(buf), "newpage: rel %u/%u/%u; page %u",
-                       xlrec->node.spcNode, xlrec->node.dbNode,
-                       xlrec->node.relNode, xlrec->blkno);
-               break;
-           }
        default:
            strcat(buf, "UNKNOWN");
            break;
index fdcfc8dc6f1f196071ebcd61ff0eec9b91ea946a..37ba1164ec1f1be3c8aa6d03e8b6144edd0e0b6b 100644 (file)
@@ -7,7 +7,7 @@
  * Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/access/htup.h,v 1.66 2004/07/01 00:51:38 tgl Exp $
+ * $PostgreSQL: pgsql/src/include/access/htup.h,v 1.67 2004/07/11 18:01:45 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -423,6 +423,8 @@ typedef HeapTupleData *HeapTuple;
 #define XLOG_HEAP_UPDATE   0x20
 #define XLOG_HEAP_MOVE     0x30
 #define XLOG_HEAP_CLEAN        0x40
+#define XLOG_HEAP_NEWPAGE  0x50
+/* opcodes 0x60, 0x70 still free */
 #define XLOG_HEAP_OPMASK   0x70
 /*
  * When we insert 1st item on new page in INSERT/UPDATE
@@ -491,7 +493,7 @@ typedef struct xl_heap_update
 
 #define SizeOfHeapUpdate   (offsetof(xl_heap_update, newtid) + SizeOfIptrData)
 
-/* This is what we need to know about page cleanup */
+/* This is what we need to know about vacuum page cleanup */
 typedef struct xl_heap_clean
 {
    RelFileNode node;
@@ -501,4 +503,15 @@ typedef struct xl_heap_clean
 
 #define SizeOfHeapClean (offsetof(xl_heap_clean, block) + sizeof(BlockNumber))
 
+/* This is for replacing a page's contents in toto */
+/* NB: this is used for indexes as well as heaps */
+typedef struct xl_heap_newpage
+{
+   RelFileNode node;
+   BlockNumber blkno;          /* location of new page */
+   /* entire page contents follow at end of record */
+} xl_heap_newpage;
+
+#define SizeOfHeapNewpage  (offsetof(xl_heap_newpage, blkno) + sizeof(BlockNumber))
+
 #endif   /* HTUP_H */
index e8e4c46a8209b0cff238515ef0fc8418b594c1fe..6e2491532adcb6c045e40ab64777f586f6995a49 100644 (file)
@@ -7,7 +7,7 @@
  * Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/access/nbtree.h,v 1.78 2004/06/02 17:28:18 tgl Exp $
+ * $PostgreSQL: pgsql/src/include/access/nbtree.h,v 1.79 2004/07/11 18:01:45 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -197,7 +197,6 @@ typedef BTItemData *BTItem;
                                                 * metapage */
 #define XLOG_BTREE_NEWROOT     0xA0    /* new root page */
 #define XLOG_BTREE_NEWMETA     0xB0    /* update metadata page */
-#define XLOG_BTREE_NEWPAGE     0xC0    /* new index page during build */
 
 /*
  * All that we need to find changed index tuple
@@ -324,18 +323,6 @@ typedef struct xl_btree_newmeta
 
 #define SizeOfBtreeNewmeta (sizeof(xl_btree_newmeta))
 
-/*
- * New index page log record.  This is only used while building a new index.
- */
-typedef struct xl_btree_newpage
-{
-   RelFileNode node;
-   BlockNumber blkno;          /* location of new page */
-   /* entire page contents follow at end of record */
-} xl_btree_newpage;
-
-#define SizeOfBtreeNewpage (offsetof(xl_btree_newpage, blkno) + sizeof(BlockNumber))
-
 
 /*
  * Operator strategy numbers for B-tree have been moved to access/skey.h,