diff options
author | Heikki Linnakangas | 2014-11-10 17:20:12 +0000 |
---|---|---|
committer | Heikki Linnakangas | 2014-11-10 19:24:36 +0000 |
commit | b46efae22f5bee7d585bb15ee2cb926a87f55601 (patch) | |
tree | ed8be8c2c76c20d5c98b58fb60b13f9764f7f20d | |
parent | e16ca53289e7c9b83e410e97e1f855be558acbb7 (diff) |
Make XLogRecGetBlockTag return false if no block ref foundwalformat5
-rw-r--r-- | src/backend/access/heap/heapam.c | 3 | ||||
-rw-r--r-- | src/backend/access/nbtree/nbtxlog.c | 4 | ||||
-rw-r--r-- | src/backend/access/transam/xlogreader.c | 20 | ||||
-rw-r--r-- | src/include/access/xlogrecord.h | 2 |
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); |