summaryrefslogtreecommitdiff
path: root/src/include/storage
diff options
context:
space:
mode:
Diffstat (limited to 'src/include/storage')
-rw-r--r--src/include/storage/buf_internals.h55
-rw-r--r--src/include/storage/relfilelocator.h12
-rw-r--r--src/include/storage/sinval.h7
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)