From: Heikki Linnakangas Date: Thu, 6 Nov 2014 14:58:02 +0000 (+0200) Subject: Fixes, per Andres' mail X-Git-Url: http://git.postgresql.org/gitweb/static/gitweb.js?a=commitdiff_plain;h=2b3ffc1513d83be4e49e53752c2851240b6441cb;p=users%2Fheikki%2Fpostgres.git Fixes, per Andres' mail --- diff --git a/src/backend/access/heap/heapam.c b/src/backend/access/heap/heapam.c index 3382d61ebb..0514ba1c4a 100644 --- a/src/backend/access/heap/heapam.c +++ b/src/backend/access/heap/heapam.c @@ -6545,8 +6545,8 @@ log_heap_freeze(Relation reln, Buffer buffer, TransactionId cutoff_xid, * corresponding visibility map block. Both should have already been modified * and dirtied. * - * If checksums are enabled, we also add the heap_buffer to the chain to - * protect it from being torn. + * If checksums are enabled, we also generate a full-page image of + * heap_buffer, if necessary. */ XLogRecPtr log_heap_visible(RelFileNode rnode, Buffer heap_buffer, Buffer vm_buffer, @@ -6554,6 +6554,7 @@ log_heap_visible(RelFileNode rnode, Buffer heap_buffer, Buffer vm_buffer, { xl_heap_visible xlrec; XLogRecPtr recptr; + uint8 flags; Assert(BufferIsValid(heap_buffer)); Assert(BufferIsValid(vm_buffer)); @@ -6561,9 +6562,14 @@ log_heap_visible(RelFileNode rnode, Buffer heap_buffer, Buffer vm_buffer, xlrec.cutoff_xid = cutoff_xid; XLogBeginInsert(); XLogRegisterData((char *) &xlrec, SizeOfHeapVisible); - XLogRegisterBuffer(1, heap_buffer, XLogHintBitIsNeeded() ? REGBUF_STANDARD : (REGBUF_STANDARD | REGBUF_NO_IMAGE)); + XLogRegisterBuffer(0, vm_buffer, 0); + flags = REGBUF_STANDARD; + if (!XLogHintBitIsNeeded()) + flags |= REGBUF_NO_IMAGE; + XLogRegisterBuffer(1, heap_buffer, flags); + recptr = XLogInsert(RM_HEAP2_ID, XLOG_HEAP2_VISIBLE); return recptr; @@ -7134,9 +7140,9 @@ heap_xlog_visible(XLogRecPtr lsn, XLogRecord *record) * XLOG record's LSN, we mustn't mark the page all-visible, because * the subsequent update won't be replayed to clear the flag. */ - page = BufferGetPage(buffer); - PageSetAllVisible(page); - MarkBufferDirty(buffer); + page = BufferGetPage(buffer); + PageSetAllVisible(page); + MarkBufferDirty(buffer); } else if (action == BLK_RESTORED) { @@ -7392,24 +7398,13 @@ heap_xlog_insert(XLogRecPtr lsn, XLogRecord *record) Size datalen; char *data; - /* - * The new tuple is normally stored as buffer 0's data. But if - * XLOG_HEAP_CONTAINS_NEW_TUPLE flag is set, it's part of the main - * data, after the xl_heap_insert struct. - */ - if (xlrec->flags & XLOG_HEAP_CONTAINS_NEW_TUPLE) - { - data = XLogRecGetData(record) + SizeOfHeapInsert; - datalen = record->xl_len - SizeOfHeapInsert; - } - else - data = XLogRecGetBlockData(record, 0, &datalen); - page = BufferGetPage(buffer); if (PageGetMaxOffsetNumber(page) + 1 < xlrec->offnum) elog(PANIC, "heap_insert_redo: invalid max offset number"); + data = XLogRecGetBlockData(record, 0, &datalen); + newlen = datalen - SizeOfHeapHeader; Assert(datalen > SizeOfHeapHeader && newlen <= MaxHeapTupleSize); memcpy((char *) &xlhdr, data, SizeOfHeapHeader); @@ -7748,12 +7743,12 @@ heap_xlog_update(XLogRecPtr lsn, XLogRecord *record, bool hot_update) if (newaction == BLK_NEEDS_REDO) { char *recdata; - char *recdataend; + char *recdata_end; Size datalen; Size tuplen; recdata = XLogRecGetBlockData(record, 0, &datalen); - recdataend = recdata + datalen; + recdata_end = recdata + datalen; page = BufferGetPage(nbuffer); @@ -7777,7 +7772,7 @@ heap_xlog_update(XLogRecPtr lsn, XLogRecord *record, bool hot_update) memcpy((char *) &xlhdr, recdata, SizeOfHeapHeader); recdata += SizeOfHeapHeader; - tuplen = recdataend - recdata; + tuplen = recdata_end - recdata; Assert(tuplen <= MaxHeapTupleSize); htup = &tbuf.hdr; @@ -7818,7 +7813,7 @@ heap_xlog_update(XLogRecPtr lsn, XLogRecord *record, bool hot_update) recdata += tuplen; newp += tuplen; } - Assert(recdata == recdataend); + Assert(recdata == recdata_end); /* copy suffix from old tuple */ if (suffixlen > 0)