summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHeikki Linnakangas2014-11-10 17:20:12 +0000
committerHeikki Linnakangas2014-11-10 19:24:36 +0000
commitb46efae22f5bee7d585bb15ee2cb926a87f55601 (patch)
treeed8be8c2c76c20d5c98b58fb60b13f9764f7f20d
parente16ca53289e7c9b83e410e97e1f855be558acbb7 (diff)
Make XLogRecGetBlockTag return false if no block ref foundwalformat5
-rw-r--r--src/backend/access/heap/heapam.c3
-rw-r--r--src/backend/access/nbtree/nbtxlog.c4
-rw-r--r--src/backend/access/transam/xlogreader.c20
-rw-r--r--src/include/access/xlogrecord.h2
4 files changed, 10 insertions, 19 deletions
diff --git a/src/backend/access/heap/heapam.c b/src/backend/access/heap/heapam.c
index 0514ba1c4a..8d587eab58 100644
--- a/src/backend/access/heap/heapam.c
+++ b/src/backend/access/heap/heapam.c
@@ -7628,11 +7628,10 @@ heap_xlog_update(XLogRecPtr lsn, XLogRecord *record, bool hot_update)
oldtup.t_len = 0;
XLogRecGetBlockTag(record, 0, &rnode, NULL, &newblk);
- if (XLogRecHasBlockRef(record, 1))
+ if (XLogRecGetBlockTag(record, 1, NULL, NULL, &oldblk))
{
/* HOT updates are never done across pages */
Assert(!hot_update);
- XLogRecGetBlockTag(record, 1, NULL, NULL, &oldblk);
}
else
oldblk = newblk;
diff --git a/src/backend/access/nbtree/nbtxlog.c b/src/backend/access/nbtree/nbtxlog.c
index 1dd909b2fa..4ada69360d 100644
--- a/src/backend/access/nbtree/nbtxlog.c
+++ b/src/backend/access/nbtree/nbtxlog.c
@@ -208,9 +208,7 @@ btree_xlog_split(bool onleft, bool isroot,
XLogRecGetBlockTag(record, 0, NULL, NULL, &leftsib);
XLogRecGetBlockTag(record, 1, NULL, NULL, &rightsib);
- if (XLogRecHasBlockRef(record, 2))
- XLogRecGetBlockTag(record, 2, NULL, NULL, &rnext);
- else
+ if (!XLogRecGetBlockTag(record, 2, NULL, NULL, &rnext))
rnext = P_NONE;
/*
diff --git a/src/backend/access/transam/xlogreader.c b/src/backend/access/transam/xlogreader.c
index 64876f7998..d3ff06e74c 100644
--- a/src/backend/access/transam/xlogreader.c
+++ b/src/backend/access/transam/xlogreader.c
@@ -1076,8 +1076,12 @@ XLogRecHasBlockImage(XLogRecord *record, uint8 block_id)
/*
* Returns information about the block that a block reference refers to.
+ *
+ * If the WAL record contains a block reference with the given ID, *rnode,
+ * *forknum, and *blknum are filled in (if not NULL), and returns TRUE.
+ * Otherwise returns FALSE.
*/
-void
+bool
XLogRecGetBlockTag(XLogRecord *record, uint8 block_id,
RelFileNode *rnode, ForkNumber *forknum, BlockNumber *blknum)
{
@@ -1085,18 +1089,7 @@ XLogRecGetBlockTag(XLogRecord *record, uint8 block_id,
bkpb = XLogRecGetBlockRef(record, block_id, NULL);
if (bkpb == NULL)
- {
-#ifdef FRONTEND
- if (rnode)
- rnode->spcNode = rnode->dbNode = rnode->relNode = InvalidOid;
- if (forknum)
- *forknum = InvalidForkNumber;
- if (blknum)
- *blknum = InvalidBlockNumber;
-#else
- elog(ERROR, "failed to locate backup block with ID %d", block_id);
-#endif
- }
+ return false;
else
{
if (rnode)
@@ -1105,6 +1098,7 @@ XLogRecGetBlockTag(XLogRecord *record, uint8 block_id,
*forknum = bkpb->fork_flags & BKPBLOCK_FORK_MASK;
if (blknum)
*blknum = bkpb->block;
+ return true;
}
}
diff --git a/src/include/access/xlogrecord.h b/src/include/access/xlogrecord.h
index ba00b4eaba..35ef7e5754 100644
--- a/src/include/access/xlogrecord.h
+++ b/src/include/access/xlogrecord.h
@@ -157,7 +157,7 @@ extern bool XLogRecHasBlockRef(XLogRecord *record, uint8 block_id);
extern bool XLogRecHasBlockImage(XLogRecord *record, uint8 block_id);
extern uint8 *XLogRecGetBlockRefIds(XLogRecord *record, int *num_refs);
extern char *XLogRecGetBlockData(XLogRecord *record, uint8 block_id, Size *len);
-extern void XLogRecGetBlockTag(XLogRecord *record, uint8 block_id,
+extern bool XLogRecGetBlockTag(XLogRecord *record, uint8 block_id,
RelFileNode *rnode, ForkNumber *forknum,
BlockNumber *blknum);