From e3bf618ff7ca46c533717320e4aebee32fc3e4ff Mon Sep 17 00:00:00 2001 From: Dilip Kumar Date: Thu, 22 Sep 2022 10:48:38 +0530 Subject: [PATCH v19 3/3] Don't need tabespace id to uniquely identify relation file within database Now relfilenumber is 56 bit wide and will never wrap around so they are always unique within a database. So now we do not need need tablespace Oid to uniquely identifying the relation file within a database. --- contrib/pg_prewarm/autoprewarm.c | 4 +- contrib/test_decoding/expected/rewrite.out | 2 +- contrib/test_decoding/sql/rewrite.sql | 2 +- src/backend/replication/logical/reorderbuffer.c | 5 +- src/backend/utils/adt/dbsize.c | 3 +- src/backend/utils/cache/relfilenumbermap.c | 69 +++++++++---------------- src/include/catalog/pg_class.h | 2 +- src/include/utils/relfilenumbermap.h | 3 +- 8 files changed, 36 insertions(+), 54 deletions(-) diff --git a/contrib/pg_prewarm/autoprewarm.c b/contrib/pg_prewarm/autoprewarm.c index 31caf10..b8bbe33 100644 --- a/contrib/pg_prewarm/autoprewarm.c +++ b/contrib/pg_prewarm/autoprewarm.c @@ -31,6 +31,7 @@ #include "access/relation.h" #include "access/xact.h" #include "catalog/pg_class.h" +#include "catalog/pg_tablespace.h" #include "catalog/pg_type.h" #include "miscadmin.h" #include "pgstat.h" @@ -511,7 +512,8 @@ autoprewarm_database_main(Datum main_arg) Assert(rel == NULL); StartTransactionCommand(); - reloid = RelidByRelfilenumber(blk->tablespace, blk->filenumber); + reloid = RelidByRelfilenumber(blk->filenumber, + blk->tablespace == GLOBALTABLESPACE_OID); if (OidIsValid(reloid)) rel = try_relation_open(reloid, AccessShareLock); diff --git a/contrib/test_decoding/expected/rewrite.out b/contrib/test_decoding/expected/rewrite.out index b30999c..8f1aa48 100644 --- a/contrib/test_decoding/expected/rewrite.out +++ b/contrib/test_decoding/expected/rewrite.out @@ -106,7 +106,7 @@ VACUUM FULL pg_class; -- reindexing of important relations / indexes REINDEX TABLE pg_class; REINDEX INDEX pg_class_oid_index; -REINDEX INDEX pg_class_tblspc_relfilenode_index; +REINDEX INDEX pg_class_relfilenode_index; INSERT INTO replication_example(somedata, testcolumn1) VALUES (5, 3); BEGIN; INSERT INTO replication_example(somedata, testcolumn1) VALUES (6, 4); diff --git a/contrib/test_decoding/sql/rewrite.sql b/contrib/test_decoding/sql/rewrite.sql index 62dead3..8983704 100644 --- a/contrib/test_decoding/sql/rewrite.sql +++ b/contrib/test_decoding/sql/rewrite.sql @@ -77,7 +77,7 @@ VACUUM FULL pg_class; -- reindexing of important relations / indexes REINDEX TABLE pg_class; REINDEX INDEX pg_class_oid_index; -REINDEX INDEX pg_class_tblspc_relfilenode_index; +REINDEX INDEX pg_class_relfilenode_index; INSERT INTO replication_example(somedata, testcolumn1) VALUES (5, 3); diff --git a/src/backend/replication/logical/reorderbuffer.c b/src/backend/replication/logical/reorderbuffer.c index a0f398b..e9e0c6b 100644 --- a/src/backend/replication/logical/reorderbuffer.c +++ b/src/backend/replication/logical/reorderbuffer.c @@ -91,6 +91,7 @@ #include "access/xact.h" #include "access/xlog_internal.h" #include "catalog/catalog.h" +#include "catalog/pg_tablespace.h" #include "lib/binaryheap.h" #include "miscadmin.h" #include "pgstat.h" @@ -2153,8 +2154,8 @@ ReorderBufferProcessTXN(ReorderBuffer *rb, ReorderBufferTXN *txn, case REORDER_BUFFER_CHANGE_DELETE: Assert(snapshot_now); - reloid = RelidByRelfilenumber(change->data.tp.rlocator.spcOid, - change->data.tp.rlocator.relNumber); + reloid = RelidByRelfilenumber(change->data.tp.rlocator.relNumber, + change->data.tp.rlocator.spcOid == GLOBALTABLESPACE_OID); /* * Mapped catalog tuple without data, emitted while diff --git a/src/backend/utils/adt/dbsize.c b/src/backend/utils/adt/dbsize.c index 9f70f35..4d33032 100644 --- a/src/backend/utils/adt/dbsize.c +++ b/src/backend/utils/adt/dbsize.c @@ -908,7 +908,8 @@ pg_filenode_relation(PG_FUNCTION_ARGS) if (!RelFileNumberIsValid(relfilenumber)) PG_RETURN_NULL(); - heaprel = RelidByRelfilenumber(reltablespace, relfilenumber); + heaprel = RelidByRelfilenumber(relfilenumber, + reltablespace== GLOBALTABLESPACE_OID); if (!OidIsValid(heaprel)) PG_RETURN_NULL(); diff --git a/src/backend/utils/cache/relfilenumbermap.c b/src/backend/utils/cache/relfilenumbermap.c index 2e0acf9..bef14b0 100644 --- a/src/backend/utils/cache/relfilenumbermap.c +++ b/src/backend/utils/cache/relfilenumbermap.c @@ -32,17 +32,11 @@ static HTAB *RelfilenumberMapHash = NULL; /* built first time through in InitializeRelfilenumberMap */ -static ScanKeyData relfilenumber_skey[2]; +static ScanKeyData relfilenumber_skey[1]; typedef struct { - Oid reltablespace; - RelFileNumber relfilenumber; -} RelfilenumberMapKey; - -typedef struct -{ - RelfilenumberMapKey key; /* lookup key - must be first */ + RelFileNumber relfilenumber; /* lookup key - must be first */ Oid relid; /* pg_class.oid */ } RelfilenumberMapEntry; @@ -72,7 +66,7 @@ RelfilenumberMapInvalidateCallback(Datum arg, Oid relid) entry->relid == relid) /* individual flushed relation */ { if (hash_search(RelfilenumberMapHash, - (void *) &entry->key, + (void *) &entry->relfilenumber, HASH_REMOVE, NULL) == NULL) elog(ERROR, "hash table corrupted"); @@ -88,7 +82,6 @@ static void InitializeRelfilenumberMap(void) { HASHCTL ctl; - int i; /* Make sure we've initialized CacheMemoryContext. */ if (CacheMemoryContext == NULL) @@ -97,25 +90,20 @@ InitializeRelfilenumberMap(void) /* build skey */ MemSet(&relfilenumber_skey, 0, sizeof(relfilenumber_skey)); - for (i = 0; i < 2; i++) - { - fmgr_info_cxt(F_OIDEQ, - &relfilenumber_skey[i].sk_func, - CacheMemoryContext); - relfilenumber_skey[i].sk_strategy = BTEqualStrategyNumber; - relfilenumber_skey[i].sk_subtype = InvalidOid; - relfilenumber_skey[i].sk_collation = InvalidOid; - } - - relfilenumber_skey[0].sk_attno = Anum_pg_class_reltablespace; - relfilenumber_skey[1].sk_attno = Anum_pg_class_relfilenode; + fmgr_info_cxt(F_INT8EQ, + &relfilenumber_skey[0].sk_func, + CacheMemoryContext); + relfilenumber_skey[0].sk_strategy = BTEqualStrategyNumber; + relfilenumber_skey[0].sk_subtype = InvalidOid; + relfilenumber_skey[0].sk_collation = InvalidOid; + relfilenumber_skey[0].sk_attno = Anum_pg_class_relfilenode; /* * Only create the RelfilenumberMapHash now, so we don't end up partially * initialized when fmgr_info_cxt() above ERRORs out with an out of memory * error. */ - ctl.keysize = sizeof(RelfilenumberMapKey); + ctl.keysize = sizeof(RelFileNumber); ctl.entrysize = sizeof(RelfilenumberMapEntry); ctl.hcxt = CacheMemoryContext; @@ -129,34 +117,25 @@ InitializeRelfilenumberMap(void) } /* - * Map a relation's (tablespace, relfilenumber) to a relation's oid and cache + * Map a relation's relfilenumber to a relation's oid and cache * the result. * * Returns InvalidOid if no relation matching the criteria could be found. */ Oid -RelidByRelfilenumber(Oid reltablespace, RelFileNumber relfilenumber) +RelidByRelfilenumber(RelFileNumber relfilenumber, bool is_shared) { - RelfilenumberMapKey key; RelfilenumberMapEntry *entry; bool found; SysScanDesc scandesc; Relation relation; HeapTuple ntp; - ScanKeyData skey[2]; + ScanKeyData skey[1]; Oid relid; if (RelfilenumberMapHash == NULL) InitializeRelfilenumberMap(); - /* pg_class will show 0 when the value is actually MyDatabaseTableSpace */ - if (reltablespace == MyDatabaseTableSpace) - reltablespace = 0; - - MemSet(&key, 0, sizeof(key)); - key.reltablespace = reltablespace; - key.relfilenumber = relfilenumber; - /* * Check cache and return entry if one is found. Even if no target * relation can be found later on we store the negative match and return a @@ -164,7 +143,8 @@ RelidByRelfilenumber(Oid reltablespace, RelFileNumber relfilenumber) * since querying invalid values isn't supposed to be a frequent thing, * but it's basically free. */ - entry = hash_search(RelfilenumberMapHash, (void *) &key, HASH_FIND, &found); + entry = hash_search(RelfilenumberMapHash, (void *) &relfilenumber, + HASH_FIND, &found); if (found) return entry->relid; @@ -174,7 +154,7 @@ RelidByRelfilenumber(Oid reltablespace, RelFileNumber relfilenumber) /* initialize empty/negative cache entry before doing the actual lookups */ relid = InvalidOid; - if (reltablespace == GLOBALTABLESPACE_OID) + if (is_shared) { /* * Ok, shared table, check relmapper. @@ -195,14 +175,13 @@ RelidByRelfilenumber(Oid reltablespace, RelFileNumber relfilenumber) memcpy(skey, relfilenumber_skey, sizeof(skey)); /* set scan arguments */ - skey[0].sk_argument = ObjectIdGetDatum(reltablespace); - skey[1].sk_argument = Int64GetDatum((int64) relfilenumber); + skey[0].sk_argument = Int64GetDatum((int64) relfilenumber); scandesc = systable_beginscan(relation, - ClassTblspcRelfilenodeIndexId, + ClassRelfilenodeIndexId, true, NULL, - 2, + 1, skey); found = false; @@ -213,11 +192,10 @@ RelidByRelfilenumber(Oid reltablespace, RelFileNumber relfilenumber) if (found) elog(ERROR, - "unexpected duplicate for tablespace %u, relfilenumber " UINT64_FORMAT, - reltablespace, relfilenumber); + "unexpected duplicate for relfilenumber " UINT64_FORMAT, + relfilenumber); found = true; - Assert(classform->reltablespace == reltablespace); Assert(classform->relfilenode == relfilenumber); relid = classform->oid; } @@ -235,7 +213,8 @@ RelidByRelfilenumber(Oid reltablespace, RelFileNumber relfilenumber) * caused cache invalidations to be executed which would have deleted a * new entry if we had entered it above. */ - entry = hash_search(RelfilenumberMapHash, (void *) &key, HASH_ENTER, &found); + entry = hash_search(RelfilenumberMapHash, (void *) &relfilenumber, + HASH_ENTER, &found); if (found) elog(ERROR, "corrupted hashtable"); entry->relid = relid; diff --git a/src/include/catalog/pg_class.h b/src/include/catalog/pg_class.h index 4768e5e..cacfc11 100644 --- a/src/include/catalog/pg_class.h +++ b/src/include/catalog/pg_class.h @@ -154,7 +154,7 @@ typedef FormData_pg_class *Form_pg_class; DECLARE_UNIQUE_INDEX_PKEY(pg_class_oid_index, 2662, ClassOidIndexId, on pg_class using btree(oid oid_ops)); DECLARE_UNIQUE_INDEX(pg_class_relname_nsp_index, 2663, ClassNameNspIndexId, on pg_class using btree(relname name_ops, relnamespace oid_ops)); -DECLARE_INDEX(pg_class_tblspc_relfilenode_index, 3455, ClassTblspcRelfilenodeIndexId, on pg_class using btree(reltablespace oid_ops, relfilenode int8_ops)); +DECLARE_INDEX(pg_class_relfilenode_index, 3455, ClassRelfilenodeIndexId, on pg_class using btree(relfilenode int8_ops)); #ifdef EXPOSE_TO_CLIENT_CODE diff --git a/src/include/utils/relfilenumbermap.h b/src/include/utils/relfilenumbermap.h index c149a93..ae81232 100644 --- a/src/include/utils/relfilenumbermap.h +++ b/src/include/utils/relfilenumbermap.h @@ -13,7 +13,6 @@ #ifndef RELFILENUMBERMAP_H #define RELFILENUMBERMAP_H -extern Oid RelidByRelfilenumber(Oid reltablespace, - RelFileNumber relfilenumber); +extern Oid RelidByRelfilenumber(RelFileNumber relfilenumber, bool is_shared); #endif /* RELFILENUMBERMAP_H */ -- 1.8.3.1