From ce66e24081ead2cb42b02f007039287947d0cca6 Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Fri, 4 Jul 2014 13:34:47 +0900 Subject: [PATCH 1/3] Move SEQ_MAGIC and sequence page opaque data to sequence.h This can allow a backend process to detect if a page is being used for a sequence. --- src/backend/commands/sequence.c | 34 ++++++++++++---------------------- src/include/commands/sequence.h | 13 +++++++++++++ 2 files changed, 25 insertions(+), 22 deletions(-) diff --git a/src/backend/commands/sequence.c b/src/backend/commands/sequence.c index e608420..802aac7 100644 --- a/src/backend/commands/sequence.c +++ b/src/backend/commands/sequence.c @@ -46,16 +46,6 @@ #define SEQ_LOG_VALS 32 /* - * The "special area" of a sequence's buffer page looks like this. - */ -#define SEQ_MAGIC 0x1717 - -typedef struct sequence_magic -{ - uint32 magic; -} sequence_magic; - -/* * We store a SeqTable item for every sequence we have touched in the current * session. This is needed to hold onto nextval/currval state. (We can't * rely on the relcache, since it's only, well, a cache, and may decide to @@ -306,7 +296,7 @@ fill_seq_with_data(Relation rel, HeapTuple tuple) { Buffer buf; Page page; - sequence_magic *sm; + SequencePageOpaqueData *sm; OffsetNumber offnum; /* Initialize first page of relation with special magic number */ @@ -316,9 +306,9 @@ fill_seq_with_data(Relation rel, HeapTuple tuple) page = BufferGetPage(buf); - PageInit(page, BufferGetPageSize(buf), sizeof(sequence_magic)); - sm = (sequence_magic *) PageGetSpecialPointer(page); - sm->magic = SEQ_MAGIC; + PageInit(page, BufferGetPageSize(buf), sizeof(SequencePageOpaqueData)); + sm = (SequencePageOpaqueData *) PageGetSpecialPointer(page); + sm->seq_page_id = SEQ_MAGIC; /* Now insert sequence tuple */ @@ -1066,18 +1056,18 @@ read_seq_tuple(SeqTable elm, Relation rel, Buffer *buf, HeapTuple seqtuple) { Page page; ItemId lp; - sequence_magic *sm; + SequencePageOpaqueData *sm; Form_pg_sequence seq; *buf = ReadBuffer(rel, 0); LockBuffer(*buf, BUFFER_LOCK_EXCLUSIVE); page = BufferGetPage(*buf); - sm = (sequence_magic *) PageGetSpecialPointer(page); + sm = (SequencePageOpaqueData *) PageGetSpecialPointer(page); - if (sm->magic != SEQ_MAGIC) + if (sm->seq_page_id != SEQ_MAGIC) elog(ERROR, "bad magic number in sequence \"%s\": %08X", - RelationGetRelationName(rel), sm->magic); + RelationGetRelationName(rel), sm->seq_page_id); lp = PageGetItemId(page, FirstOffsetNumber); Assert(ItemIdIsNormal(lp)); @@ -1541,7 +1531,7 @@ seq_redo(XLogRecPtr lsn, XLogRecord *record) char *item; Size itemsz; xl_seq_rec *xlrec = (xl_seq_rec *) XLogRecGetData(record); - sequence_magic *sm; + SequencePageOpaqueData *sm; /* Backup blocks are not used in seq records */ Assert(!(record->xl_info & XLR_BKP_BLOCK_MASK)); @@ -1564,9 +1554,9 @@ seq_redo(XLogRecPtr lsn, XLogRecord *record) */ localpage = (Page) palloc(BufferGetPageSize(buffer)); - PageInit(localpage, BufferGetPageSize(buffer), sizeof(sequence_magic)); - sm = (sequence_magic *) PageGetSpecialPointer(localpage); - sm->magic = SEQ_MAGIC; + PageInit(localpage, BufferGetPageSize(buffer), sizeof(SequencePageOpaqueData)); + sm = (SequencePageOpaqueData *) PageGetSpecialPointer(localpage); + sm->seq_page_id = SEQ_MAGIC; item = (char *) xlrec + sizeof(xl_seq_rec); itemsz = record->xl_len - sizeof(xl_seq_rec); diff --git a/src/include/commands/sequence.h b/src/include/commands/sequence.h index 8819c00..2455878 100644 --- a/src/include/commands/sequence.h +++ b/src/include/commands/sequence.h @@ -18,6 +18,19 @@ #include "nodes/parsenodes.h" #include "storage/relfilenode.h" +/* + * Page opaque data in a sequence page + */ +typedef struct SequencePageOpaqueData +{ + uint32 seq_page_id; +} SequencePageOpaqueData; + +/* + * This page ID is for the conveniende to be able to identify if a page + * is being used by a sequence. + */ +#define SEQ_MAGIC 0x1717 typedef struct FormData_pg_sequence { -- 2.0.1