diff options
| author | Robert Haas | 2017-03-14 18:58:56 +0000 |
|---|---|---|
| committer | Robert Haas | 2017-03-14 18:58:56 +0000 |
| commit | bb4a39637ac6155b4ed5a9f83d17921fb57400b6 (patch) | |
| tree | eef99c7390a7c3f86a23e68c47802ad159b11b5f /src/backend/access | |
| parent | 2609e91fcf9dcf36af40cd0c5b755dccf6057df6 (diff) | |
hash: Support WAL consistency checking.
Kuntal Ghosh, reviewed by Amit Kapila and Ashutosh Sharma, with
a few tweaks by me.
Discussion: http://postgr.es/m/CAGz5QCJLERUn_zoO0eDv6_Y_d0o4tNTMPeR7ivTLBg4rUrJdwg@mail.gmail.com
Diffstat (limited to 'src/backend/access')
| -rw-r--r-- | src/backend/access/hash/hash_xlog.c | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/src/backend/access/hash/hash_xlog.c b/src/backend/access/hash/hash_xlog.c index d435215259b..0c830ab5952 100644 --- a/src/backend/access/hash/hash_xlog.c +++ b/src/backend/access/hash/hash_xlog.c @@ -14,6 +14,7 @@ */ #include "postgres.h" +#include "access/bufmask.h" #include "access/hash.h" #include "access/hash_xlog.h" #include "access/xlogutils.h" @@ -961,3 +962,38 @@ hash_redo(XLogReaderState *record) elog(PANIC, "hash_redo: unknown op code %u", info); } } + +/* + * Mask a hash page before performing consistency checks on it. + */ +void +hash_mask(char *pagedata, BlockNumber blkno) +{ + Page page = (Page) pagedata; + HashPageOpaque opaque; + + mask_page_lsn(page); + + mask_page_hint_bits(page); + mask_unused_space(page); + + opaque = (HashPageOpaque) PageGetSpecialPointer(page); + + if (opaque->hasho_flag & LH_UNUSED_PAGE) + { + /* + * Mask everything on a UNUSED page. + */ + mask_page_content(page); + } + else if ((opaque->hasho_flag & LH_BUCKET_PAGE) || + (opaque->hasho_flag & LH_OVERFLOW_PAGE)) + { + /* + * In hash bucket and overflow pages, it is possible to modify the + * LP_FLAGS without emitting any WAL record. Hence, mask the line + * pointer flags. See hashgettuple() for details. + */ + mask_lp_flags(page); + } +} |
