diff --git a/src/backend/columnar/columnar_debug.c b/src/backend/columnar/columnar_debug.c index 220d259fe..e6b19f768 100644 --- a/src/backend/columnar/columnar_debug.c +++ b/src/backend/columnar/columnar_debug.c @@ -115,8 +115,6 @@ columnar_storage_info(PG_FUNCTION_ARGS) RelationGetRelationName(rel)))); } - RelationOpenSmgr(rel); - Datum values[STORAGE_INFO_NATTS] = { 0 }; bool nulls[STORAGE_INFO_NATTS] = { 0 }; diff --git a/src/backend/columnar/columnar_metadata.c b/src/backend/columnar/columnar_metadata.c index 62d64861f..ccea52b6d 100644 --- a/src/backend/columnar/columnar_metadata.c +++ b/src/backend/columnar/columnar_metadata.c @@ -1738,11 +1738,10 @@ ColumnarStorageUpdateIfNeeded(Relation rel, bool isUpgrade) return; } - RelationOpenSmgr(rel); - BlockNumber nblocks = smgrnblocks(rel->rd_smgr, MAIN_FORKNUM); + BlockNumber nblocks = smgrnblocks(RelationGetSmgr(rel), MAIN_FORKNUM); if (nblocks < 2) { - ColumnarStorageInit(rel->rd_smgr, ColumnarMetadataNewStorageId()); + ColumnarStorageInit(RelationGetSmgr(rel), ColumnarMetadataNewStorageId()); return; } diff --git a/src/backend/columnar/columnar_storage.c b/src/backend/columnar/columnar_storage.c index 71fc75ccb..9712e7160 100644 --- a/src/backend/columnar/columnar_storage.c +++ b/src/backend/columnar/columnar_storage.c @@ -44,6 +44,8 @@ #include "storage/bufmgr.h" #include "storage/lmgr.h" +#include "pg_version_compat.h" + #include "columnar/columnar.h" #include "columnar/columnar_storage.h" @@ -354,8 +356,7 @@ ColumnarStorageGetReservedOffset(Relation rel, bool force) bool ColumnarStorageIsCurrent(Relation rel) { - RelationOpenSmgr(rel); - BlockNumber nblocks = smgrnblocks(rel->rd_smgr, MAIN_FORKNUM); + BlockNumber nblocks = smgrnblocks(RelationGetSmgr(rel), MAIN_FORKNUM); if (nblocks < 2) { @@ -439,8 +440,7 @@ ColumnarStorageReserveData(Relation rel, uint64 amount) PhysicalAddr final = LogicalToPhysical(nextReservation - 1); /* extend with new pages */ - RelationOpenSmgr(rel); - BlockNumber nblocks = smgrnblocks(rel->rd_smgr, MAIN_FORKNUM); + BlockNumber nblocks = smgrnblocks(RelationGetSmgr(rel), MAIN_FORKNUM); while (nblocks <= final.blockno) { @@ -547,8 +547,7 @@ ColumnarStorageTruncate(Relation rel, uint64 newDataReservation) rel->rd_id, newDataReservation); } - RelationOpenSmgr(rel); - BlockNumber old_rel_pages = smgrnblocks(rel->rd_smgr, MAIN_FORKNUM); + BlockNumber old_rel_pages = smgrnblocks(RelationGetSmgr(rel), MAIN_FORKNUM); if (old_rel_pages == 0) { /* nothing to do */ @@ -627,8 +626,7 @@ ColumnarOverwriteMetapage(Relation relation, ColumnarMetapage columnarMetapage) static ColumnarMetapage ColumnarMetapageRead(Relation rel, bool force) { - RelationOpenSmgr(rel); - BlockNumber nblocks = smgrnblocks(rel->rd_smgr, MAIN_FORKNUM); + BlockNumber nblocks = smgrnblocks(RelationGetSmgr(rel), MAIN_FORKNUM); if (nblocks == 0) { /* diff --git a/src/backend/columnar/columnar_tableam.c b/src/backend/columnar/columnar_tableam.c index b6179ac8c..e64b7613e 100644 --- a/src/backend/columnar/columnar_tableam.c +++ b/src/backend/columnar/columnar_tableam.c @@ -913,8 +913,7 @@ columnar_relation_nontransactional_truncate(Relation rel) RelationTruncate(rel, 0); uint64 storageId = ColumnarMetadataNewStorageId(); - RelationOpenSmgr(rel); - ColumnarStorageInit(rel->rd_smgr, storageId); + ColumnarStorageInit(RelationGetSmgr(rel), storageId); } @@ -1136,8 +1135,7 @@ LogRelationStats(Relation rel, int elevel) totalStripeLength += stripe->dataLength; } - RelationOpenSmgr(rel); - uint64 relPages = smgrnblocks(rel->rd_smgr, MAIN_FORKNUM); + uint64 relPages = smgrnblocks(RelationGetSmgr(rel), MAIN_FORKNUM); RelationCloseSmgr(rel); Datum storageId = DirectFunctionCall1(columnar_relation_storageid, @@ -1239,8 +1237,7 @@ TruncateColumnar(Relation rel, int elevel) uint64 newDataReservation = Max(GetHighestUsedAddress(rel->rd_node) + 1, ColumnarFirstLogicalOffset); - RelationOpenSmgr(rel); - BlockNumber old_rel_pages = smgrnblocks(rel->rd_smgr, MAIN_FORKNUM); + BlockNumber old_rel_pages = smgrnblocks(RelationGetSmgr(rel), MAIN_FORKNUM); if (!ColumnarStorageTruncate(rel, newDataReservation)) { @@ -1248,8 +1245,7 @@ TruncateColumnar(Relation rel, int elevel) return; } - RelationOpenSmgr(rel); - BlockNumber new_rel_pages = smgrnblocks(rel->rd_smgr, MAIN_FORKNUM); + BlockNumber new_rel_pages = smgrnblocks(RelationGetSmgr(rel), MAIN_FORKNUM); /* * We can release the exclusive lock as soon as we have truncated. @@ -1784,20 +1780,17 @@ columnar_relation_size(Relation rel, ForkNumber forkNumber) uint64 nblocks = 0; - /* Open it at the smgr level if not already done */ - RelationOpenSmgr(rel); - /* InvalidForkNumber indicates returning the size for all forks */ if (forkNumber == InvalidForkNumber) { for (int i = 0; i < MAX_FORKNUM; i++) { - nblocks += smgrnblocks(rel->rd_smgr, i); + nblocks += smgrnblocks(RelationGetSmgr(rel), i); } } else { - nblocks = smgrnblocks(rel->rd_smgr, forkNumber); + nblocks = smgrnblocks(RelationGetSmgr(rel), forkNumber); } return nblocks * BLCKSZ; @@ -1819,8 +1812,7 @@ columnar_estimate_rel_size(Relation rel, int32 *attr_widths, double *allvisfrac) { CheckCitusColumnarVersion(ERROR); - RelationOpenSmgr(rel); - *pages = smgrnblocks(rel->rd_smgr, MAIN_FORKNUM); + *pages = smgrnblocks(RelationGetSmgr(rel), MAIN_FORKNUM); *tuples = ColumnarTableRowCount(rel); /* diff --git a/src/backend/distributed/test/fake_am.c b/src/backend/distributed/test/fake_am.c index ce7784510..63d5a69fe 100644 --- a/src/backend/distributed/test/fake_am.c +++ b/src/backend/distributed/test/fake_am.c @@ -20,6 +20,7 @@ #include "postgres.h" #include "distributed/pg_version_constants.h" +#include "pg_version_compat.h" #include "access/amapi.h" @@ -446,20 +447,17 @@ fake_relation_size(Relation rel, ForkNumber forkNumber) uint64 nblocks = 0; - /* Open it at the smgr level if not already done */ - RelationOpenSmgr(rel); - /* InvalidForkNumber indicates returning the size for all forks */ if (forkNumber == InvalidForkNumber) { for (int i = 0; i < MAX_FORKNUM; i++) { - nblocks += smgrnblocks(rel->rd_smgr, i); + nblocks += smgrnblocks(RelationGetSmgr(rel), i); } } else { - nblocks = smgrnblocks(rel->rd_smgr, forkNumber); + nblocks = smgrnblocks(RelationGetSmgr(rel), forkNumber); } return nblocks * BLCKSZ; diff --git a/src/include/pg_version_compat.h b/src/include/pg_version_compat.h index ad7a8bbb0..e298138d9 100644 --- a/src/include/pg_version_compat.h +++ b/src/include/pg_version_compat.h @@ -13,6 +13,25 @@ #include "distributed/pg_version_constants.h" +#if PG_VERSION_NUM >= PG_VERSION_15 +#else + +#include "storage/smgr.h" +#include "utils/rel.h" + +static inline SMgrRelation +RelationGetSmgr(Relation rel) +{ + if (unlikely(rel->rd_smgr == NULL)) + { + smgrsetowner(&(rel->rd_smgr), smgropen(rel->rd_node, rel->rd_backend)); + } + return rel->rd_smgr; +} + + +#endif + #if PG_VERSION_NUM >= PG_VERSION_14 #define AlterTableStmtObjType_compat(a) ((a)->objtype) #define getObjectTypeDescription_compat(a, b) getObjectTypeDescription(a, b)