*** pgsql/src/backend/access/nbtree/nbtxlog.c 2008/05/12 00:00:45 1.51 --- pgsql/src/backend/access/nbtree/nbtxlog.c 2008/06/12 09:12:30 1.52 *************** *** 8,14 **** * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION ! * $PostgreSQL: pgsql/src/backend/access/nbtree/nbtxlog.c,v 1.50 2008/01/01 19:45:46 momjian Exp $ * *------------------------------------------------------------------------- */ --- 8,14 ---- * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION ! * $PostgreSQL: pgsql/src/backend/access/nbtree/nbtxlog.c,v 1.51 2008/05/12 00:00:45 alvherre Exp $ * *------------------------------------------------------------------------- */ *************** _bt_restore_page(Page page, char *from, *** 150,156 **** } static void ! _bt_restore_meta(Relation reln, XLogRecPtr lsn, BlockNumber root, uint32 level, BlockNumber fastroot, uint32 fastlevel) { --- 150,156 ---- } static void ! _bt_restore_meta(RelFileNode rnode, XLogRecPtr lsn, BlockNumber root, uint32 level, BlockNumber fastroot, uint32 fastlevel) { *************** _bt_restore_meta(Relation reln, XLogRecP *** 159,165 **** BTMetaPageData *md; BTPageOpaque pageop; ! metabuf = XLogReadBuffer(reln, BTREE_METAPAGE, true); Assert(BufferIsValid(metabuf)); metapg = BufferGetPage(metabuf); --- 159,165 ---- BTMetaPageData *md; BTPageOpaque pageop; ! metabuf = XLogReadBuffer(rnode, BTREE_METAPAGE, true); Assert(BufferIsValid(metabuf)); metapg = BufferGetPage(metabuf); *************** btree_xlog_insert(bool isleaf, bool isme *** 194,200 **** XLogRecPtr lsn, XLogRecord *record) { xl_btree_insert *xlrec = (xl_btree_insert *) XLogRecGetData(record); - Relation reln; Buffer buffer; Page page; char *datapos; --- 194,199 ---- *************** btree_xlog_insert(bool isleaf, bool isme *** 220,230 **** if ((record->xl_info & XLR_BKP_BLOCK_1) && !ismeta && isleaf) return; /* nothing to do */ - reln = XLogOpenRelation(xlrec->target.node); - if (!(record->xl_info & XLR_BKP_BLOCK_1)) { ! buffer = XLogReadBuffer(reln, ItemPointerGetBlockNumber(&(xlrec->target.tid)), false); if (BufferIsValid(buffer)) --- 219,227 ---- if ((record->xl_info & XLR_BKP_BLOCK_1) && !ismeta && isleaf) return; /* nothing to do */ if (!(record->xl_info & XLR_BKP_BLOCK_1)) { ! buffer = XLogReadBuffer(xlrec->target.node, ItemPointerGetBlockNumber(&(xlrec->target.tid)), false); if (BufferIsValid(buffer)) *************** btree_xlog_insert(bool isleaf, bool isme *** 251,257 **** } if (ismeta) ! _bt_restore_meta(reln, lsn, md.root, md.level, md.fastroot, md.fastlevel); --- 248,254 ---- } if (ismeta) ! _bt_restore_meta(xlrec->target.node, lsn, md.root, md.level, md.fastroot, md.fastlevel); *************** btree_xlog_split(bool onleft, bool isroo *** 265,271 **** XLogRecPtr lsn, XLogRecord *record) { xl_btree_split *xlrec = (xl_btree_split *) XLogRecGetData(record); - Relation reln; Buffer rbuf; Page rpage; BTPageOpaque ropaque; --- 262,267 ---- *************** btree_xlog_split(bool onleft, bool isroo *** 277,284 **** Item left_hikey = NULL; Size left_hikeysz = 0; - reln = XLogOpenRelation(xlrec->node); - datapos = (char *) xlrec + SizeOfBtreeSplit; datalen = record->xl_len - SizeOfBtreeSplit; --- 273,278 ---- *************** btree_xlog_split(bool onleft, bool isroo *** 328,334 **** } /* Reconstruct right (new) sibling from scratch */ ! rbuf = XLogReadBuffer(reln, xlrec->rightsib, true); Assert(BufferIsValid(rbuf)); rpage = (Page) BufferGetPage(rbuf); --- 322,328 ---- } /* Reconstruct right (new) sibling from scratch */ ! rbuf = XLogReadBuffer(xlrec->node, xlrec->rightsib, true); Assert(BufferIsValid(rbuf)); rpage = (Page) BufferGetPage(rbuf); *************** btree_xlog_split(bool onleft, bool isroo *** 369,375 **** */ if (!(record->xl_info & XLR_BKP_BLOCK_1)) { ! Buffer lbuf = XLogReadBuffer(reln, xlrec->leftsib, false); if (BufferIsValid(lbuf)) { --- 363,369 ---- */ if (!(record->xl_info & XLR_BKP_BLOCK_1)) { ! Buffer lbuf = XLogReadBuffer(xlrec->node, xlrec->leftsib, false); if (BufferIsValid(lbuf)) { *************** btree_xlog_split(bool onleft, bool isroo *** 439,445 **** /* Fix left-link of the page to the right of the new right sibling */ if (xlrec->rnext != P_NONE && !(record->xl_info & XLR_BKP_BLOCK_2)) { ! Buffer buffer = XLogReadBuffer(reln, xlrec->rnext, false); if (BufferIsValid(buffer)) { --- 433,439 ---- /* Fix left-link of the page to the right of the new right sibling */ if (xlrec->rnext != P_NONE && !(record->xl_info & XLR_BKP_BLOCK_2)) { ! Buffer buffer = XLogReadBuffer(xlrec->node, xlrec->rnext, false); if (BufferIsValid(buffer)) { *************** static void *** 468,474 **** btree_xlog_delete(XLogRecPtr lsn, XLogRecord *record) { xl_btree_delete *xlrec; - Relation reln; Buffer buffer; Page page; BTPageOpaque opaque; --- 462,467 ---- *************** btree_xlog_delete(XLogRecPtr lsn, XLogRe *** 477,484 **** return; xlrec = (xl_btree_delete *) XLogRecGetData(record); ! reln = XLogOpenRelation(xlrec->node); ! buffer = XLogReadBuffer(reln, xlrec->block, false); if (!BufferIsValid(buffer)) return; page = (Page) BufferGetPage(buffer); --- 470,476 ---- return; xlrec = (xl_btree_delete *) XLogRecGetData(record); ! buffer = XLogReadBuffer(xlrec->node, xlrec->block, false); if (!BufferIsValid(buffer)) return; page = (Page) BufferGetPage(buffer); *************** static void *** 517,523 **** btree_xlog_delete_page(uint8 info, XLogRecPtr lsn, XLogRecord *record) { xl_btree_delete_page *xlrec = (xl_btree_delete_page *) XLogRecGetData(record); - Relation reln; BlockNumber parent; BlockNumber target; BlockNumber leftsib; --- 509,514 ---- *************** btree_xlog_delete_page(uint8 info, XLogR *** 526,532 **** Page page; BTPageOpaque pageop; - reln = XLogOpenRelation(xlrec->target.node); parent = ItemPointerGetBlockNumber(&(xlrec->target.tid)); target = xlrec->deadblk; leftsib = xlrec->leftblk; --- 517,522 ---- *************** btree_xlog_delete_page(uint8 info, XLogR *** 535,541 **** /* parent page */ if (!(record->xl_info & XLR_BKP_BLOCK_1)) { ! buffer = XLogReadBuffer(reln, parent, false); if (BufferIsValid(buffer)) { page = (Page) BufferGetPage(buffer); --- 525,531 ---- /* parent page */ if (!(record->xl_info & XLR_BKP_BLOCK_1)) { ! buffer = XLogReadBuffer(xlrec->target.node, parent, false); if (BufferIsValid(buffer)) { page = (Page) BufferGetPage(buffer); *************** btree_xlog_delete_page(uint8 info, XLogR *** 581,587 **** /* Fix left-link of right sibling */ if (!(record->xl_info & XLR_BKP_BLOCK_2)) { ! buffer = XLogReadBuffer(reln, rightsib, false); if (BufferIsValid(buffer)) { page = (Page) BufferGetPage(buffer); --- 571,577 ---- /* Fix left-link of right sibling */ if (!(record->xl_info & XLR_BKP_BLOCK_2)) { ! buffer = XLogReadBuffer(xlrec->target.node, rightsib, false); if (BufferIsValid(buffer)) { page = (Page) BufferGetPage(buffer); *************** btree_xlog_delete_page(uint8 info, XLogR *** 607,613 **** { if (leftsib != P_NONE) { ! buffer = XLogReadBuffer(reln, leftsib, false); if (BufferIsValid(buffer)) { page = (Page) BufferGetPage(buffer); --- 597,603 ---- { if (leftsib != P_NONE) { ! buffer = XLogReadBuffer(xlrec->target.node, leftsib, false); if (BufferIsValid(buffer)) { page = (Page) BufferGetPage(buffer); *************** btree_xlog_delete_page(uint8 info, XLogR *** 630,636 **** } /* Rewrite target page as empty deleted page */ ! buffer = XLogReadBuffer(reln, target, true); Assert(BufferIsValid(buffer)); page = (Page) BufferGetPage(buffer); --- 620,626 ---- } /* Rewrite target page as empty deleted page */ ! buffer = XLogReadBuffer(xlrec->target.node, target, true); Assert(BufferIsValid(buffer)); page = (Page) BufferGetPage(buffer); *************** btree_xlog_delete_page(uint8 info, XLogR *** 655,661 **** memcpy(&md, (char *) xlrec + SizeOfBtreeDeletePage, sizeof(xl_btree_metadata)); ! _bt_restore_meta(reln, lsn, md.root, md.level, md.fastroot, md.fastlevel); } --- 645,651 ---- memcpy(&md, (char *) xlrec + SizeOfBtreeDeletePage, sizeof(xl_btree_metadata)); ! _bt_restore_meta(xlrec->target.node, lsn, md.root, md.level, md.fastroot, md.fastlevel); } *************** static void *** 672,685 **** btree_xlog_newroot(XLogRecPtr lsn, XLogRecord *record) { xl_btree_newroot *xlrec = (xl_btree_newroot *) XLogRecGetData(record); - Relation reln; Buffer buffer; Page page; BTPageOpaque pageop; BlockNumber downlink = 0; ! reln = XLogOpenRelation(xlrec->node); ! buffer = XLogReadBuffer(reln, xlrec->rootblk, true); Assert(BufferIsValid(buffer)); page = (Page) BufferGetPage(buffer); --- 662,673 ---- btree_xlog_newroot(XLogRecPtr lsn, XLogRecord *record) { xl_btree_newroot *xlrec = (xl_btree_newroot *) XLogRecGetData(record); Buffer buffer; Page page; BTPageOpaque pageop; BlockNumber downlink = 0; ! buffer = XLogReadBuffer(xlrec->node, xlrec->rootblk, true); Assert(BufferIsValid(buffer)); page = (Page) BufferGetPage(buffer); *************** btree_xlog_newroot(XLogRecPtr lsn, XLogR *** 711,717 **** MarkBufferDirty(buffer); UnlockReleaseBuffer(buffer); ! _bt_restore_meta(reln, lsn, xlrec->rootblk, xlrec->level, xlrec->rootblk, xlrec->level); --- 699,705 ---- MarkBufferDirty(buffer); UnlockReleaseBuffer(buffer); ! _bt_restore_meta(xlrec->node, lsn, xlrec->rootblk, xlrec->level, xlrec->rootblk, xlrec->level); *************** btree_xlog_cleanup(void) *** 904,912 **** foreach(l, incomplete_actions) { bt_incomplete_action *action = (bt_incomplete_action *) lfirst(l); - Relation reln; - reln = XLogOpenRelation(action->node); if (action->is_split) { /* finish an incomplete split */ --- 892,898 ---- *************** btree_xlog_cleanup(void) *** 917,930 **** BTPageOpaque lpageop, rpageop; bool is_only; ! lbuf = XLogReadBuffer(reln, action->leftblk, false); /* failure is impossible because we wrote this page earlier */ if (!BufferIsValid(lbuf)) elog(PANIC, "btree_xlog_cleanup: left block unfound"); lpage = (Page) BufferGetPage(lbuf); lpageop = (BTPageOpaque) PageGetSpecialPointer(lpage); ! rbuf = XLogReadBuffer(reln, action->rightblk, false); /* failure is impossible because we wrote this page earlier */ if (!BufferIsValid(rbuf)) elog(PANIC, "btree_xlog_cleanup: right block unfound"); --- 903,917 ---- BTPageOpaque lpageop, rpageop; bool is_only; + Relation reln; ! lbuf = XLogReadBuffer(action->node, action->leftblk, false); /* failure is impossible because we wrote this page earlier */ if (!BufferIsValid(lbuf)) elog(PANIC, "btree_xlog_cleanup: left block unfound"); lpage = (Page) BufferGetPage(lbuf); lpageop = (BTPageOpaque) PageGetSpecialPointer(lpage); ! rbuf = XLogReadBuffer(action->node, action->rightblk, false); /* failure is impossible because we wrote this page earlier */ if (!BufferIsValid(rbuf)) elog(PANIC, "btree_xlog_cleanup: right block unfound"); *************** btree_xlog_cleanup(void) *** 934,951 **** /* if the pages are all of their level, it's a only-page split */ is_only = P_LEFTMOST(lpageop) && P_RIGHTMOST(rpageop); _bt_insert_parent(reln, lbuf, rbuf, NULL, action->is_root, is_only); } else { /* finish an incomplete deletion (of a half-dead page) */ Buffer buf; ! buf = XLogReadBuffer(reln, action->delblk, false); if (BufferIsValid(buf)) if (_bt_pagedel(reln, buf, NULL, true) == 0) elog(PANIC, "btree_xlog_cleanup: _bt_pagdel failed"); } } incomplete_actions = NIL; --- 921,946 ---- /* if the pages are all of their level, it's a only-page split */ is_only = P_LEFTMOST(lpageop) && P_RIGHTMOST(rpageop); + reln = CreateFakeRelcacheEntry(action->node); _bt_insert_parent(reln, lbuf, rbuf, NULL, action->is_root, is_only); + FreeFakeRelcacheEntry(reln); } else { /* finish an incomplete deletion (of a half-dead page) */ Buffer buf; ! buf = XLogReadBuffer(action->node, action->delblk, false); if (BufferIsValid(buf)) + { + Relation reln; + + reln = CreateFakeRelcacheEntry(action->node); if (_bt_pagedel(reln, buf, NULL, true) == 0) elog(PANIC, "btree_xlog_cleanup: _bt_pagdel failed"); + FreeFakeRelcacheEntry(reln); + } } } incomplete_actions = NIL;