diff options
Diffstat (limited to 'src/include/storage')
| -rw-r--r-- | src/include/storage/buf_internals.h | 55 | ||||
| -rw-r--r-- | src/include/storage/relfilelocator.h | 12 | ||||
| -rw-r--r-- | src/include/storage/sinval.h | 7 |
3 files changed, 15 insertions, 59 deletions
diff --git a/src/include/storage/buf_internals.h b/src/include/storage/buf_internals.h index d4dc9eb3429..406db6be783 100644 --- a/src/include/storage/buf_internals.h +++ b/src/include/storage/buf_internals.h @@ -92,66 +92,29 @@ typedef struct buftag { Oid spcOid; /* tablespace oid */ Oid dbOid; /* database oid */ - - /* - * relForkDetails[] stores the fork number in the high 8 bits of the first - * integer; the remaining 56 bits are used to store the relfilenmber. - * Expanding the relfilenumber to a full 64 bits would require widening - * the BufferTag, which is undesirable for performance reasons. We use - * two 32-bit values here rather than a single 64-bit value to avoid - * padding the struct out to a multiple of 8 bytes. - */ - uint32 relForkDetails[2]; + RelFileNumber relNumber; /* relation file number */ + ForkNumber forkNum; /* fork number */ BlockNumber blockNum; /* blknum relative to begin of reln */ } BufferTag; -/* High relNumber bits in relForkDetails[0] */ -#define BUFTAG_RELNUM_HIGH_BITS 24 - -/* Low relNumber bits in relForkDetails[1] */ -#define BUFTAG_RELNUM_LOW_BITS 32 - -/* Mask to fetch high bits of relNumber from relForkDetails[0] */ -#define BUFTAG_RELNUM_HIGH_MASK ((1U << BUFTAG_RELNUM_HIGH_BITS) - 1) - -/* Mask to fetch low bits of relNumber from relForkDetails[1] */ -#define BUFTAG_RELNUM_LOW_MASK 0XFFFFFFFF - static inline RelFileNumber BufTagGetRelNumber(const BufferTag *tag) { - uint64 relnum; - - relnum = ((uint64) tag->relForkDetails[0]) & BUFTAG_RELNUM_HIGH_MASK; - relnum = (relnum << BUFTAG_RELNUM_LOW_BITS) | tag->relForkDetails[1]; - - Assert(relnum <= MAX_RELFILENUMBER); - return (RelFileNumber) relnum; + return tag->relNumber; } static inline ForkNumber BufTagGetForkNum(const BufferTag *tag) { - ForkNumber ret; - - StaticAssertStmt(MAX_FORKNUM <= INT8_MAX, - "MAX_FORKNUM can't be greater than INT8_MAX"); - - ret = (ForkNumber) (tag->relForkDetails[0] >> BUFTAG_RELNUM_HIGH_BITS); - return ret; + return tag->forkNum; } static inline void BufTagSetRelForkDetails(BufferTag *tag, RelFileNumber relnumber, ForkNumber forknum) { - Assert(relnumber <= MAX_RELFILENUMBER); - Assert(forknum <= MAX_FORKNUM); - - tag->relForkDetails[0] = (relnumber >> BUFTAG_RELNUM_LOW_BITS) & - BUFTAG_RELNUM_HIGH_MASK; - tag->relForkDetails[0] |= (forknum << BUFTAG_RELNUM_HIGH_BITS); - tag->relForkDetails[1] = relnumber & BUFTAG_RELNUM_LOW_MASK; + tag->relNumber = relnumber; + tag->forkNum = forknum; } static inline RelFileLocator @@ -190,9 +153,9 @@ BufferTagsEqual(const BufferTag *tag1, const BufferTag *tag2) { return (tag1->spcOid == tag2->spcOid) && (tag1->dbOid == tag2->dbOid) && - (tag1->relForkDetails[0] == tag2->relForkDetails[0]) && - (tag1->relForkDetails[1] == tag2->relForkDetails[1]) && - (tag1->blockNum == tag2->blockNum); + (tag1->relNumber == tag2->relNumber) && + (tag1->blockNum == tag2->blockNum) && + (tag1->forkNum == tag2->forkNum); } static inline bool diff --git a/src/include/storage/relfilelocator.h b/src/include/storage/relfilelocator.h index ef904644fa4..10f41f3abb3 100644 --- a/src/include/storage/relfilelocator.h +++ b/src/include/storage/relfilelocator.h @@ -32,11 +32,10 @@ * Nonzero dbOid values correspond to pg_database.oid. * * relNumber identifies the specific relation. relNumber corresponds to - * pg_class.relfilenode. Notice that relNumber values are assigned by - * GetNewRelFileNumber(), which will only ever assign the same value once - * during the lifetime of a cluster. However, since CREATE DATABASE duplicates - * the relfilenumbers of the template database, the values are in practice only - * unique within a database, not globally. + * pg_class.relfilenode (NOT pg_class.oid, because we need to be able + * to assign new physical files to relations in some situations). + * Notice that relNumber is only unique within a database in a particular + * tablespace. * * Note: spcOid must be GLOBALTABLESPACE_OID if and only if dbOid is * zero. We support shared relations only in the "global" tablespace. @@ -76,9 +75,6 @@ typedef struct RelFileLocatorBackend BackendId backend; } RelFileLocatorBackend; -#define SizeOfRelFileLocatorBackend \ - (offsetof(RelFileLocatorBackend, backend) + sizeof(BackendId)) - #define RelFileLocatorBackendIsTemp(rlocator) \ ((rlocator).backend != InvalidBackendId) diff --git a/src/include/storage/sinval.h b/src/include/storage/sinval.h index 4a267be935c..aca0347a3d3 100644 --- a/src/include/storage/sinval.h +++ b/src/include/storage/sinval.h @@ -86,14 +86,11 @@ typedef struct typedef struct { - /* note: field layout chosen to pack into 20 bytes */ + /* note: field layout chosen to pack into 16 bytes */ int8 id; /* type field --- must be first */ int8 backend_hi; /* high bits of backend ID, if temprel */ uint16 backend_lo; /* low bits of backend ID, if temprel */ - Oid dbOid; - Oid spcOid; - uint32 relNumber_hi; /* avoid 8 byte alignment requirement */ - uint32 relNumber_lo; + RelFileLocator rlocator; /* spcOid, dbOid, relNumber */ } SharedInvalSmgrMsg; #define SHAREDINVALRELMAP_ID (-4) |
