#include "access/htup.h"#include "access/xlog.h"#include "storage/bufpage.h"#include "storage/relfilenode.h"#include "utils/relcache.h"

Go to the source code of this file.
| #define SizeOfHeapClean (offsetof(xl_heap_clean, ndead) + sizeof(uint16)) |
Definition at line 179 of file heapam_xlog.h.
| #define SizeOfHeapCleanupInfo (sizeof(xl_heap_cleanup_info)) |
Definition at line 192 of file heapam_xlog.h.
| #define SizeOfHeapDelete (offsetof(xl_heap_delete, all_visible_cleared) + sizeof(bool)) |
Definition at line 84 of file heapam_xlog.h.
| #define SizeOfHeapFreeze (offsetof(xl_heap_freeze, cutoff_multi) + sizeof(MultiXactId)) |
Definition at line 252 of file heapam_xlog.h.
Referenced by heap_xlog_freeze().
| #define SizeOfHeapHeader (offsetof(xl_heap_header, t_hoff) + sizeof(uint8)) |
Definition at line 101 of file heapam_xlog.h.
| #define SizeOfHeapInplace (offsetof(xl_heap_inplace, target) + SizeOfHeapTid) |
Definition at line 240 of file heapam_xlog.h.
Referenced by heap_xlog_inplace().
| #define SizeOfHeapInsert (offsetof(xl_heap_insert, all_visible_cleared) + sizeof(bool)) |
Definition at line 111 of file heapam_xlog.h.
Referenced by heap_xlog_insert().
| #define SizeOfHeapLock (offsetof(xl_heap_lock, infobits_set) + sizeof(int8)) |
Definition at line 221 of file heapam_xlog.h.
| #define SizeOfHeapLockUpdated (offsetof(xl_heap_lock_updated, infobits_set) + sizeof(uint8)) |
Definition at line 231 of file heapam_xlog.h.
| #define SizeOfHeapMultiInsert offsetof(xl_heap_multi_insert, offsets) |
Definition at line 130 of file heapam_xlog.h.
| #define SizeOfHeapNewpage (offsetof(xl_heap_newpage, blkno) + sizeof(BlockNumber)) |
Definition at line 204 of file heapam_xlog.h.
Referenced by heap_xlog_newpage().
| #define SizeOfHeapTid (offsetof(xl_heaptid, tid) + SizeOfIptrData) |
Definition at line 73 of file heapam_xlog.h.
| #define SizeOfHeapUpdate (offsetof(xl_heap_update, new_all_visible_cleared) + sizeof(bool)) |
Definition at line 156 of file heapam_xlog.h.
Referenced by heap_xlog_update().
| #define SizeOfHeapVisible (offsetof(xl_heap_visible, cutoff_xid) + sizeof(TransactionId)) |
Definition at line 262 of file heapam_xlog.h.
| #define SizeOfMultiInsertTuple (offsetof(xl_multi_insert_tuple, t_hoff) + sizeof(uint8)) |
Definition at line 141 of file heapam_xlog.h.
| #define XLHL_KEYS_UPDATED 0x10 |
Definition at line 211 of file heapam_xlog.h.
Referenced by compute_infobits(), fix_infomask_from_infobits(), and out_infobits().
| #define XLHL_XMAX_EXCL_LOCK 0x04 |
Definition at line 209 of file heapam_xlog.h.
Referenced by compute_infobits(), fix_infomask_from_infobits(), and out_infobits().
| #define XLHL_XMAX_IS_MULTI 0x01 |
Definition at line 207 of file heapam_xlog.h.
Referenced by compute_infobits(), fix_infomask_from_infobits(), and out_infobits().
| #define XLHL_XMAX_KEYSHR_LOCK 0x08 |
Definition at line 210 of file heapam_xlog.h.
Referenced by compute_infobits(), fix_infomask_from_infobits(), and out_infobits().
| #define XLHL_XMAX_LOCK_ONLY 0x02 |
Definition at line 208 of file heapam_xlog.h.
Referenced by compute_infobits(), fix_infomask_from_infobits(), and out_infobits().
| #define XLOG_HEAP2_CLEAN 0x10 |
Definition at line 52 of file heapam_xlog.h.
Referenced by heap2_desc(), and heap2_redo().
| #define XLOG_HEAP2_CLEANUP_INFO 0x30 |
Definition at line 54 of file heapam_xlog.h.
Referenced by heap2_desc(), heap2_redo(), and log_heap_cleanup_info().
| #define XLOG_HEAP2_FREEZE 0x00 |
Definition at line 51 of file heapam_xlog.h.
Referenced by heap2_desc(), heap2_redo(), and log_heap_freeze().
| #define XLOG_HEAP2_LOCK_UPDATED 0x60 |
Definition at line 57 of file heapam_xlog.h.
Referenced by heap2_desc(), heap2_redo(), and heap_lock_updated_tuple_rec().
| #define XLOG_HEAP2_MULTI_INSERT 0x50 |
Definition at line 56 of file heapam_xlog.h.
Referenced by heap2_desc(), and heap2_redo().
| #define XLOG_HEAP2_VISIBLE 0x40 |
Definition at line 55 of file heapam_xlog.h.
Referenced by heap2_desc(), heap2_redo(), and log_heap_visible().
| #define XLOG_HEAP_DELETE 0x10 |
Definition at line 31 of file heapam_xlog.h.
Referenced by heap_delete(), heap_desc(), and heap_redo().
| #define XLOG_HEAP_HOT_UPDATE 0x40 |
Definition at line 34 of file heapam_xlog.h.
Referenced by heap_desc(), and heap_redo().
| #define XLOG_HEAP_INIT_PAGE 0x80 |
Definition at line 44 of file heapam_xlog.h.
Referenced by heap2_desc(), heap_desc(), heap_xlog_insert(), and heap_xlog_update().
| #define XLOG_HEAP_INPLACE 0x70 |
Definition at line 37 of file heapam_xlog.h.
Referenced by heap_desc(), heap_inplace_update(), and heap_redo().
| #define XLOG_HEAP_INSERT 0x00 |
Definition at line 30 of file heapam_xlog.h.
Referenced by heap_desc(), and heap_redo().
| #define XLOG_HEAP_LOCK 0x60 |
Definition at line 36 of file heapam_xlog.h.
Referenced by heap_desc(), heap_lock_tuple(), and heap_redo().
| #define XLOG_HEAP_NEWPAGE 0x50 |
Definition at line 35 of file heapam_xlog.h.
Referenced by heap_desc(), heap_redo(), log_newpage(), and log_newpage_buffer().
| #define XLOG_HEAP_OPMASK 0x70 |
Definition at line 39 of file heapam_xlog.h.
Referenced by heap2_redo(), and heap_redo().
| #define XLOG_HEAP_UPDATE 0x20 |
Definition at line 32 of file heapam_xlog.h.
Referenced by heap_desc(), and heap_redo().
| typedef struct xl_heap_clean xl_heap_clean |
| typedef struct xl_heap_cleanup_info xl_heap_cleanup_info |
| typedef struct xl_heap_delete xl_heap_delete |
| typedef struct xl_heap_freeze xl_heap_freeze |
| typedef struct xl_heap_header xl_heap_header |
| typedef struct xl_heap_inplace xl_heap_inplace |
| typedef struct xl_heap_insert xl_heap_insert |
| typedef struct xl_heap_lock xl_heap_lock |
| typedef struct xl_heap_lock_updated xl_heap_lock_updated |
| typedef struct xl_heap_multi_insert xl_heap_multi_insert |
| typedef struct xl_heap_newpage xl_heap_newpage |
| typedef struct xl_heap_update xl_heap_update |
| typedef struct xl_heap_visible xl_heap_visible |
| typedef struct xl_heaptid xl_heaptid |
| typedef struct xl_multi_insert_tuple xl_multi_insert_tuple |
| void heap2_desc | ( | StringInfo | buf, | |
| uint8 | xl_info, | |||
| char * | rec | |||
| ) |
Definition at line 129 of file heapdesc.c.
References appendStringInfo(), xl_heap_multi_insert::blkno, xl_heap_visible::block, xl_heap_clean::block, xl_heap_freeze::block, xl_heap_freeze::cutoff_multi, xl_heap_freeze::cutoff_xid, RelFileNode::dbNode, xl_heap_lock_updated::infobits_set, xl_heap_cleanup_info::latestRemovedXid, xl_heap_clean::latestRemovedXid, xl_heap_multi_insert::node, xl_heap_visible::node, xl_heap_clean::node, xl_heap_freeze::node, xl_heap_multi_insert::ntuples, out_target(), RelFileNode::relNode, RelFileNode::spcNode, xl_heap_lock_updated::target, XLOG_HEAP2_CLEAN, XLOG_HEAP2_CLEANUP_INFO, XLOG_HEAP2_FREEZE, XLOG_HEAP2_LOCK_UPDATED, XLOG_HEAP2_MULTI_INSERT, XLOG_HEAP2_VISIBLE, XLOG_HEAP_INIT_PAGE, and xl_heap_lock_updated::xmax.
{
uint8 info = xl_info & ~XLR_INFO_MASK;
info &= XLOG_HEAP_OPMASK;
if (info == XLOG_HEAP2_FREEZE)
{
xl_heap_freeze *xlrec = (xl_heap_freeze *) rec;
appendStringInfo(buf, "freeze: rel %u/%u/%u; blk %u; cutoff xid %u multi %u",
xlrec->node.spcNode, xlrec->node.dbNode,
xlrec->node.relNode, xlrec->block,
xlrec->cutoff_xid, xlrec->cutoff_multi);
}
else if (info == XLOG_HEAP2_CLEAN)
{
xl_heap_clean *xlrec = (xl_heap_clean *) rec;
appendStringInfo(buf, "clean: rel %u/%u/%u; blk %u remxid %u",
xlrec->node.spcNode, xlrec->node.dbNode,
xlrec->node.relNode, xlrec->block,
xlrec->latestRemovedXid);
}
else if (info == XLOG_HEAP2_CLEANUP_INFO)
{
xl_heap_cleanup_info *xlrec = (xl_heap_cleanup_info *) rec;
appendStringInfo(buf, "cleanup info: remxid %u",
xlrec->latestRemovedXid);
}
else if (info == XLOG_HEAP2_VISIBLE)
{
xl_heap_visible *xlrec = (xl_heap_visible *) rec;
appendStringInfo(buf, "visible: rel %u/%u/%u; blk %u",
xlrec->node.spcNode, xlrec->node.dbNode,
xlrec->node.relNode, xlrec->block);
}
else if (info == XLOG_HEAP2_MULTI_INSERT)
{
xl_heap_multi_insert *xlrec = (xl_heap_multi_insert *) rec;
if (xl_info & XLOG_HEAP_INIT_PAGE)
appendStringInfo(buf, "multi-insert (init): ");
else
appendStringInfo(buf, "multi-insert: ");
appendStringInfo(buf, "rel %u/%u/%u; blk %u; %d tuples",
xlrec->node.spcNode, xlrec->node.dbNode, xlrec->node.relNode,
xlrec->blkno, xlrec->ntuples);
}
else if (info == XLOG_HEAP2_LOCK_UPDATED)
{
xl_heap_lock_updated *xlrec = (xl_heap_lock_updated *) rec;
appendStringInfo(buf, "lock updated: xmax %u msk %04x; ", xlrec->xmax,
xlrec->infobits_set);
out_target(buf, &(xlrec->target));
}
else
appendStringInfo(buf, "UNKNOWN");
}
| void heap2_redo | ( | XLogRecPtr | lsn, | |
| XLogRecord * | rptr | |||
| ) |
Definition at line 7104 of file heapam.c.
References elog, heap_xlog_clean(), heap_xlog_cleanup_info(), heap_xlog_freeze(), heap_xlog_lock_updated(), heap_xlog_multi_insert(), heap_xlog_visible(), PANIC, XLogRecord::xl_info, XLOG_HEAP2_CLEAN, XLOG_HEAP2_CLEANUP_INFO, XLOG_HEAP2_FREEZE, XLOG_HEAP2_LOCK_UPDATED, XLOG_HEAP2_MULTI_INSERT, XLOG_HEAP2_VISIBLE, and XLOG_HEAP_OPMASK.
{
uint8 info = record->xl_info & ~XLR_INFO_MASK;
switch (info & XLOG_HEAP_OPMASK)
{
case XLOG_HEAP2_FREEZE:
heap_xlog_freeze(lsn, record);
break;
case XLOG_HEAP2_CLEAN:
heap_xlog_clean(lsn, record);
break;
case XLOG_HEAP2_CLEANUP_INFO:
heap_xlog_cleanup_info(lsn, record);
break;
case XLOG_HEAP2_VISIBLE:
heap_xlog_visible(lsn, record);
break;
case XLOG_HEAP2_MULTI_INSERT:
heap_xlog_multi_insert(lsn, record);
break;
case XLOG_HEAP2_LOCK_UPDATED:
heap_xlog_lock_updated(lsn, record);
break;
default:
elog(PANIC, "heap2_redo: unknown op code %u", info);
}
}
| void heap_desc | ( | StringInfo | buf, | |
| uint8 | xl_info, | |||
| char * | rec | |||
| ) |
Definition at line 44 of file heapdesc.c.
References appendStringInfo(), appendStringInfoChar(), xl_heap_newpage::blkno, RelFileNode::dbNode, xl_heap_newpage::forknum, xl_heap_lock::infobits_set, xl_heap_delete::infobits_set, ItemPointerGetBlockNumber, ItemPointerGetOffsetNumber, xl_heap_lock::locking_xid, xl_heap_update::new_xmax, xl_heap_update::newtid, xl_heap_newpage::node, xl_heap_update::old_infobits_set, xl_heap_update::old_xmax, out_infobits(), out_target(), RelFileNode::relNode, RelFileNode::spcNode, xl_heap_inplace::target, xl_heap_lock::target, xl_heap_update::target, xl_heap_delete::target, xl_heap_insert::target, XLOG_HEAP_DELETE, XLOG_HEAP_HOT_UPDATE, XLOG_HEAP_INIT_PAGE, XLOG_HEAP_INPLACE, XLOG_HEAP_INSERT, XLOG_HEAP_LOCK, XLOG_HEAP_NEWPAGE, and XLOG_HEAP_UPDATE.
{
uint8 info = xl_info & ~XLR_INFO_MASK;
info &= XLOG_HEAP_OPMASK;
if (info == XLOG_HEAP_INSERT)
{
xl_heap_insert *xlrec = (xl_heap_insert *) rec;
if (xl_info & XLOG_HEAP_INIT_PAGE)
appendStringInfo(buf, "insert(init): ");
else
appendStringInfo(buf, "insert: ");
out_target(buf, &(xlrec->target));
}
else if (info == XLOG_HEAP_DELETE)
{
xl_heap_delete *xlrec = (xl_heap_delete *) rec;
appendStringInfo(buf, "delete: ");
out_target(buf, &(xlrec->target));
appendStringInfoChar(buf, ' ');
out_infobits(buf, xlrec->infobits_set);
}
else if (info == XLOG_HEAP_UPDATE)
{
xl_heap_update *xlrec = (xl_heap_update *) rec;
if (xl_info & XLOG_HEAP_INIT_PAGE)
appendStringInfo(buf, "update(init): ");
else
appendStringInfo(buf, "update: ");
out_target(buf, &(xlrec->target));
appendStringInfo(buf, " xmax %u ", xlrec->old_xmax);
out_infobits(buf, xlrec->old_infobits_set);
appendStringInfo(buf, "; new tid %u/%u xmax %u",
ItemPointerGetBlockNumber(&(xlrec->newtid)),
ItemPointerGetOffsetNumber(&(xlrec->newtid)),
xlrec->new_xmax);
}
else if (info == XLOG_HEAP_HOT_UPDATE)
{
xl_heap_update *xlrec = (xl_heap_update *) rec;
if (xl_info & XLOG_HEAP_INIT_PAGE) /* can this case happen? */
appendStringInfo(buf, "hot_update(init): ");
else
appendStringInfo(buf, "hot_update: ");
out_target(buf, &(xlrec->target));
appendStringInfo(buf, " xmax %u ", xlrec->old_xmax);
out_infobits(buf, xlrec->old_infobits_set);
appendStringInfo(buf, "; new tid %u/%u xmax %u",
ItemPointerGetBlockNumber(&(xlrec->newtid)),
ItemPointerGetOffsetNumber(&(xlrec->newtid)),
xlrec->new_xmax);
}
else if (info == XLOG_HEAP_NEWPAGE)
{
xl_heap_newpage *xlrec = (xl_heap_newpage *) rec;
appendStringInfo(buf, "newpage: rel %u/%u/%u; fork %u, blk %u",
xlrec->node.spcNode, xlrec->node.dbNode,
xlrec->node.relNode, xlrec->forknum,
xlrec->blkno);
}
else if (info == XLOG_HEAP_LOCK)
{
xl_heap_lock *xlrec = (xl_heap_lock *) rec;
appendStringInfo(buf, "lock %u: ", xlrec->locking_xid);
out_target(buf, &(xlrec->target));
appendStringInfoChar(buf, ' ');
out_infobits(buf, xlrec->infobits_set);
}
else if (info == XLOG_HEAP_INPLACE)
{
xl_heap_inplace *xlrec = (xl_heap_inplace *) rec;
appendStringInfo(buf, "inplace: ");
out_target(buf, &(xlrec->target));
}
else
appendStringInfo(buf, "UNKNOWN");
}
| void heap_redo | ( | XLogRecPtr | lsn, | |
| XLogRecord * | rptr | |||
| ) |
Definition at line 7066 of file heapam.c.
References elog, heap_xlog_delete(), heap_xlog_inplace(), heap_xlog_insert(), heap_xlog_lock(), heap_xlog_newpage(), heap_xlog_update(), PANIC, XLogRecord::xl_info, XLOG_HEAP_DELETE, XLOG_HEAP_HOT_UPDATE, XLOG_HEAP_INPLACE, XLOG_HEAP_INSERT, XLOG_HEAP_LOCK, XLOG_HEAP_NEWPAGE, XLOG_HEAP_OPMASK, and XLOG_HEAP_UPDATE.
{
uint8 info = record->xl_info & ~XLR_INFO_MASK;
/*
* These operations don't overwrite MVCC data so no conflict processing is
* required. The ones in heap2 rmgr do.
*/
switch (info & XLOG_HEAP_OPMASK)
{
case XLOG_HEAP_INSERT:
heap_xlog_insert(lsn, record);
break;
case XLOG_HEAP_DELETE:
heap_xlog_delete(lsn, record);
break;
case XLOG_HEAP_UPDATE:
heap_xlog_update(lsn, record, false);
break;
case XLOG_HEAP_HOT_UPDATE:
heap_xlog_update(lsn, record, true);
break;
case XLOG_HEAP_NEWPAGE:
heap_xlog_newpage(lsn, record);
break;
case XLOG_HEAP_LOCK:
heap_xlog_lock(lsn, record);
break;
case XLOG_HEAP_INPLACE:
heap_xlog_inplace(lsn, record);
break;
default:
elog(PANIC, "heap_redo: unknown op code %u", info);
}
}
| void HeapTupleHeaderAdvanceLatestRemovedXid | ( | HeapTupleHeader | tuple, | |
| TransactionId * | latestRemovedXid | |||
| ) |
Definition at line 5554 of file heapam.c.
References HEAP_MOVED, HEAP_XMIN_COMMITTED, HEAP_XMIN_INVALID, HeapTupleHeaderGetUpdateXid, HeapTupleHeaderGetXmin, HeapTupleHeaderGetXvac, HeapTupleHeaderData::t_infomask, TransactionIdDidCommit(), TransactionIdFollows(), and TransactionIdPrecedes().
Referenced by btree_xlog_delete_get_latestRemovedXid(), heap_prune_chain(), and lazy_scan_heap().
{
TransactionId xmin = HeapTupleHeaderGetXmin(tuple);
TransactionId xmax = HeapTupleHeaderGetUpdateXid(tuple);
TransactionId xvac = HeapTupleHeaderGetXvac(tuple);
if (tuple->t_infomask & HEAP_MOVED)
{
if (TransactionIdPrecedes(*latestRemovedXid, xvac))
*latestRemovedXid = xvac;
}
/*
* Ignore tuples inserted by an aborted transaction or if the tuple was
* updated/deleted by the inserting transaction.
*
* Look for a committed hint bit, or if no xmin bit is set, check clog.
* This needs to work on both master and standby, where it is used to
* assess btree delete records.
*/
if ((tuple->t_infomask & HEAP_XMIN_COMMITTED) ||
(!(tuple->t_infomask & HEAP_XMIN_COMMITTED) &&
!(tuple->t_infomask & HEAP_XMIN_INVALID) &&
TransactionIdDidCommit(xmin)))
{
if (xmax != xmin &&
TransactionIdFollows(xmax, *latestRemovedXid))
*latestRemovedXid = xmax;
}
/* *latestRemovedXid may still be invalid at end */
}
| XLogRecPtr log_heap_clean | ( | Relation | reln, | |
| Buffer | buffer, | |||
| OffsetNumber * | redirected, | |||
| int | nredirected, | |||
| OffsetNumber * | nowdead, | |||
| int | ndead, | |||
| OffsetNumber * | nowunused, | |||
| int | nunused, | |||
| TransactionId | latestRemovedXid | |||
| ) |
Definition at line 5627 of file heapam.c.
References Assert, xl_heap_clean::block, XLogRecData::buffer, XLogRecData::buffer_std, BufferGetBlockNumber(), XLogRecData::data, xl_heap_clean::latestRemovedXid, XLogRecData::len, xl_heap_clean::ndead, XLogRecData::next, xl_heap_clean::node, xl_heap_clean::nredirected, RelationData::rd_node, RelationNeedsWAL, and XLogInsert().
Referenced by heap_page_prune(), and lazy_vacuum_page().
{
xl_heap_clean xlrec;
uint8 info;
XLogRecPtr recptr;
XLogRecData rdata[4];
/* Caller should not call me on a non-WAL-logged relation */
Assert(RelationNeedsWAL(reln));
xlrec.node = reln->rd_node;
xlrec.block = BufferGetBlockNumber(buffer);
xlrec.latestRemovedXid = latestRemovedXid;
xlrec.nredirected = nredirected;
xlrec.ndead = ndead;
rdata[0].data = (char *) &xlrec;
rdata[0].len = SizeOfHeapClean;
rdata[0].buffer = InvalidBuffer;
rdata[0].next = &(rdata[1]);
/*
* The OffsetNumber arrays are not actually in the buffer, but we pretend
* that they are. When XLogInsert stores the whole buffer, the offset
* arrays need not be stored too. Note that even if all three arrays are
* empty, we want to expose the buffer as a candidate for whole-page
* storage, since this record type implies a defragmentation operation
* even if no item pointers changed state.
*/
if (nredirected > 0)
{
rdata[1].data = (char *) redirected;
rdata[1].len = nredirected * sizeof(OffsetNumber) * 2;
}
else
{
rdata[1].data = NULL;
rdata[1].len = 0;
}
rdata[1].buffer = buffer;
rdata[1].buffer_std = true;
rdata[1].next = &(rdata[2]);
if (ndead > 0)
{
rdata[2].data = (char *) nowdead;
rdata[2].len = ndead * sizeof(OffsetNumber);
}
else
{
rdata[2].data = NULL;
rdata[2].len = 0;
}
rdata[2].buffer = buffer;
rdata[2].buffer_std = true;
rdata[2].next = &(rdata[3]);
if (nunused > 0)
{
rdata[3].data = (char *) nowunused;
rdata[3].len = nunused * sizeof(OffsetNumber);
}
else
{
rdata[3].data = NULL;
rdata[3].len = 0;
}
rdata[3].buffer = buffer;
rdata[3].buffer_std = true;
rdata[3].next = NULL;
info = XLOG_HEAP2_CLEAN;
recptr = XLogInsert(RM_HEAP2_ID, info, rdata);
return recptr;
}
| XLogRecPtr log_heap_cleanup_info | ( | RelFileNode | rnode, | |
| TransactionId | latestRemovedXid | |||
| ) |
Definition at line 5595 of file heapam.c.
References XLogRecData::buffer, XLogRecData::data, xl_heap_cleanup_info::latestRemovedXid, XLogRecData::len, XLogRecData::next, xl_heap_cleanup_info::node, XLOG_HEAP2_CLEANUP_INFO, and XLogInsert().
Referenced by vacuum_log_cleanup_info().
{
xl_heap_cleanup_info xlrec;
XLogRecPtr recptr;
XLogRecData rdata;
xlrec.node = rnode;
xlrec.latestRemovedXid = latestRemovedXid;
rdata.data = (char *) &xlrec;
rdata.len = SizeOfHeapCleanupInfo;
rdata.buffer = InvalidBuffer;
rdata.next = NULL;
recptr = XLogInsert(RM_HEAP2_ID, XLOG_HEAP2_CLEANUP_INFO, &rdata);
return recptr;
}
| XLogRecPtr log_heap_freeze | ( | Relation | reln, | |
| Buffer | buffer, | |||
| TransactionId | cutoff_xid, | |||
| MultiXactId | cutoff_multi, | |||
| OffsetNumber * | offsets, | |||
| int | offcnt | |||
| ) |
Definition at line 5713 of file heapam.c.
References Assert, xl_heap_freeze::block, XLogRecData::buffer, XLogRecData::buffer_std, BufferGetBlockNumber(), xl_heap_freeze::cutoff_multi, xl_heap_freeze::cutoff_xid, XLogRecData::data, XLogRecData::len, XLogRecData::next, xl_heap_freeze::node, RelationData::rd_node, RelationNeedsWAL, XLOG_HEAP2_FREEZE, and XLogInsert().
Referenced by lazy_scan_heap().
{
xl_heap_freeze xlrec;
XLogRecPtr recptr;
XLogRecData rdata[2];
/* Caller should not call me on a non-WAL-logged relation */
Assert(RelationNeedsWAL(reln));
/* nor when there are no tuples to freeze */
Assert(offcnt > 0);
xlrec.node = reln->rd_node;
xlrec.block = BufferGetBlockNumber(buffer);
xlrec.cutoff_xid = cutoff_xid;
xlrec.cutoff_multi = cutoff_multi;
rdata[0].data = (char *) &xlrec;
rdata[0].len = SizeOfHeapFreeze;
rdata[0].buffer = InvalidBuffer;
rdata[0].next = &(rdata[1]);
/*
* The tuple-offsets array is not actually in the buffer, but pretend that
* it is. When XLogInsert stores the whole buffer, the offsets array need
* not be stored too.
*/
rdata[1].data = (char *) offsets;
rdata[1].len = offcnt * sizeof(OffsetNumber);
rdata[1].buffer = buffer;
rdata[1].buffer_std = true;
rdata[1].next = NULL;
recptr = XLogInsert(RM_HEAP2_ID, XLOG_HEAP2_FREEZE, rdata);
return recptr;
}
| XLogRecPtr log_heap_visible | ( | RelFileNode | rnode, | |
| Buffer | heap_buffer, | |||
| Buffer | vm_buffer, | |||
| TransactionId | cutoff_xid | |||
| ) |
Definition at line 5762 of file heapam.c.
References Assert, xl_heap_visible::block, XLogRecData::buffer, XLogRecData::buffer_std, BufferGetBlockNumber(), BufferIsValid, xl_heap_visible::cutoff_xid, XLogRecData::data, DataChecksumsEnabled(), XLogRecData::len, XLogRecData::next, xl_heap_visible::node, XLOG_HEAP2_VISIBLE, and XLogInsert().
Referenced by visibilitymap_set().
{
xl_heap_visible xlrec;
XLogRecPtr recptr;
XLogRecData rdata[3];
Assert(BufferIsValid(heap_buffer));
Assert(BufferIsValid(vm_buffer));
xlrec.node = rnode;
xlrec.block = BufferGetBlockNumber(heap_buffer);
xlrec.cutoff_xid = cutoff_xid;
rdata[0].data = (char *) &xlrec;
rdata[0].len = SizeOfHeapVisible;
rdata[0].buffer = InvalidBuffer;
rdata[0].next = &(rdata[1]);
rdata[1].data = NULL;
rdata[1].len = 0;
rdata[1].buffer = vm_buffer;
rdata[1].buffer_std = false;
rdata[1].next = NULL;
if (DataChecksumsEnabled())
{
rdata[1].next = &(rdata[2]);
rdata[2].data = NULL;
rdata[2].len = 0;
rdata[2].buffer = heap_buffer;
rdata[2].buffer_std = true;
rdata[2].next = NULL;
}
recptr = XLogInsert(RM_HEAP2_ID, XLOG_HEAP2_VISIBLE, rdata);
return recptr;
}
| XLogRecPtr log_newpage | ( | RelFileNode * | rnode, | |
| ForkNumber | forkNum, | |||
| BlockNumber | blk, | |||
| Page | page | |||
| ) |
Definition at line 5894 of file heapam.c.
References xl_heap_newpage::blkno, XLogRecData::buffer, XLogRecData::data, END_CRIT_SECTION, xl_heap_newpage::forknum, XLogRecData::len, XLogRecData::next, xl_heap_newpage::node, PageIsNew, PageSetLSN, START_CRIT_SECTION, XLOG_HEAP_NEWPAGE, and XLogInsert().
Referenced by _bt_blwritepage(), btbuildempty(), copy_relation_data(), end_heap_rewrite(), raw_heap_insert(), SetMatViewToPopulated(), and spgbuildempty().
{
xl_heap_newpage xlrec;
XLogRecPtr recptr;
XLogRecData rdata[2];
/* NO ELOG(ERROR) from here till newpage op is logged */
START_CRIT_SECTION();
xlrec.node = *rnode;
xlrec.forknum = forkNum;
xlrec.blkno = blkno;
rdata[0].data = (char *) &xlrec;
rdata[0].len = SizeOfHeapNewpage;
rdata[0].buffer = InvalidBuffer;
rdata[0].next = &(rdata[1]);
rdata[1].data = (char *) page;
rdata[1].len = BLCKSZ;
rdata[1].buffer = InvalidBuffer;
rdata[1].next = NULL;
recptr = XLogInsert(RM_HEAP_ID, XLOG_HEAP_NEWPAGE, rdata);
/*
* The page may be uninitialized. If so, we can't set the LSN and TLI
* because that would corrupt the page.
*/
if (!PageIsNew(page))
{
PageSetLSN(page, recptr);
}
END_CRIT_SECTION();
return recptr;
}
| XLogRecPtr log_newpage_buffer | ( | Buffer | buffer | ) |
Definition at line 5944 of file heapam.c.
References Assert, xl_heap_newpage::blkno, XLogRecData::buffer, BufferGetPage, BufferGetTag(), CritSectionCount, XLogRecData::data, xl_heap_newpage::forknum, XLogRecData::len, XLogRecData::next, xl_heap_newpage::node, PageIsNew, PageSetLSN, XLOG_HEAP_NEWPAGE, and XLogInsert().
Referenced by ginbuildempty(), and gistbuildempty().
{
xl_heap_newpage xlrec;
XLogRecPtr recptr;
XLogRecData rdata[2];
Page page = BufferGetPage(buffer);
/* We should be in a critical section. */
Assert(CritSectionCount > 0);
BufferGetTag(buffer, &xlrec.node, &xlrec.forknum, &xlrec.blkno);
rdata[0].data = (char *) &xlrec;
rdata[0].len = SizeOfHeapNewpage;
rdata[0].buffer = InvalidBuffer;
rdata[0].next = &(rdata[1]);
rdata[1].data = page;
rdata[1].len = BLCKSZ;
rdata[1].buffer = InvalidBuffer;
rdata[1].next = NULL;
recptr = XLogInsert(RM_HEAP_ID, XLOG_HEAP_NEWPAGE, rdata);
/*
* The page may be uninitialized. If so, we can't set the LSN and TLI
* because that would corrupt the page.
*/
if (!PageIsNew(page))
{
PageSetLSN(page, recptr);
}
return recptr;
}
1.7.1