From 7bfd84bc705bb4cceecc9e2f6ce76defaa3e144d Mon Sep 17 00:00:00 2001 From: Onur Tirtir Date: Mon, 5 Jul 2021 14:03:00 +0300 Subject: [PATCH] Introduce StripeGetHighestRowNumber --- src/backend/columnar/columnar_metadata.c | 43 ++++++++++++------------ src/backend/columnar/columnar_reader.c | 4 +-- src/backend/columnar/columnar_tableam.c | 3 +- src/include/columnar/columnar.h | 1 + 4 files changed, 26 insertions(+), 25 deletions(-) diff --git a/src/backend/columnar/columnar_metadata.c b/src/backend/columnar/columnar_metadata.c index 7f3efc588..c87ccd8fb 100644 --- a/src/backend/columnar/columnar_metadata.c +++ b/src/backend/columnar/columnar_metadata.c @@ -101,7 +101,7 @@ static Oid ColumnarChunkIndexRelationId(void); static Oid ColumnarChunkGroupIndexRelationId(void); static Oid ColumnarNamespaceId(void); static uint64 LookupStorageId(RelFileNode relfilenode); -static uint64 GetHighestUsedFirstRowNumber(uint64 storageId); +static uint64 GetHighestUsedRowNumber(uint64 storageId); static void DeleteStorageFromColumnarMetadataTable(Oid metadataTableId, AttrNumber storageIdAtrrNumber, Oid storageIdIndexId, @@ -666,9 +666,7 @@ FindStripeByRowNumber(Relation relation, uint64 rowNumber, Snapshot snapshot) return NULL; } - uint64 stripeMaxRowNumber = stripeMetadata->firstRowNumber + - stripeMetadata->rowCount - 1; - if (rowNumber > stripeMaxRowNumber) + if (rowNumber > StripeGetHighestRowNumber(stripeMetadata)) { return NULL; } @@ -677,6 +675,17 @@ FindStripeByRowNumber(Relation relation, uint64 rowNumber, Snapshot snapshot) } +/* + * StripeGetHighestRowNumber returns rowNumber of the row with highest + * rowNumber in given stripe. + */ +uint64 +StripeGetHighestRowNumber(StripeMetadata *stripeMetadata) +{ + return stripeMetadata->firstRowNumber + stripeMetadata->rowCount - 1; +} + + /* * StripeMetadataLookupRowNumber returns StripeMetadata for the stripe whose * firstRowNumber is less than or equal to (FIND_LESS_OR_EQUAL), or is @@ -1489,41 +1498,33 @@ ColumnarStorageUpdateIfNeeded(Relation rel, bool isUpgrade) uint64 reservedStripeId = highestId + 1; uint64 reservedOffset = highestOffset + 1; - uint64 reservedRowNumber = GetHighestUsedFirstRowNumber(storageId) + 1; + uint64 reservedRowNumber = GetHighestUsedRowNumber(storageId) + 1; ColumnarStorageUpdateCurrent(rel, isUpgrade, reservedStripeId, reservedRowNumber, reservedOffset); } /* - * GetHighestUsedFirstRowNumber returns the highest used first_row_number - * for given storageId. Returns COLUMNAR_INVALID_ROW_NUMBER if storage with + * GetHighestUsedRowNumber returns the highest used rowNumber for given + * storageId. Returns COLUMNAR_INVALID_ROW_NUMBER if storage with * storageId has no stripes. * Note that normally we would use ColumnarStorageGetReservedRowNumber * to decide that. However, this function is designed to be used when * building the metapage itself during upgrades. */ static uint64 -GetHighestUsedFirstRowNumber(uint64 storageId) +GetHighestUsedRowNumber(uint64 storageId) { + uint64 highestRowNumber = COLUMNAR_INVALID_ROW_NUMBER; + List *stripeMetadataList = ReadDataFileStripeList(storageId, GetTransactionSnapshot()); - if (list_length(stripeMetadataList) == 0) - { - return COLUMNAR_INVALID_ROW_NUMBER; - } - - /* XXX: Better to have an invalid value for StripeMetadata.rowCount too */ - uint64 stripeRowCount = -1; - uint64 highestFirstRowNumber = COLUMNAR_INVALID_ROW_NUMBER; - StripeMetadata *stripeMetadata = NULL; foreach_ptr(stripeMetadata, stripeMetadataList) { - highestFirstRowNumber = Max(highestFirstRowNumber, - stripeMetadata->firstRowNumber); - stripeRowCount = stripeMetadata->rowCount; + highestRowNumber = Max(highestRowNumber, + StripeGetHighestRowNumber(stripeMetadata)); } - return highestFirstRowNumber + stripeRowCount - 1; + return highestRowNumber; } diff --git a/src/backend/columnar/columnar_reader.c b/src/backend/columnar/columnar_reader.c index 216d5472c..685e3163d 100644 --- a/src/backend/columnar/columnar_reader.c +++ b/src/backend/columnar/columnar_reader.c @@ -447,8 +447,8 @@ AdvanceStripeRead(ColumnarReadState *readState) readState->chunkGroupsFiltered += readState->stripeReadState->chunkGroupsFiltered; - uint64 lastReadRowNumber = readState->currentStripeMetadata->firstRowNumber + - readState->currentStripeMetadata->rowCount - 1; + uint64 lastReadRowNumber = + StripeGetHighestRowNumber(readState->currentStripeMetadata); EndStripeRead(readState->stripeReadState); diff --git a/src/backend/columnar/columnar_tableam.c b/src/backend/columnar/columnar_tableam.c index 0e2099fb5..712932194 100644 --- a/src/backend/columnar/columnar_tableam.c +++ b/src/backend/columnar/columnar_tableam.c @@ -1295,8 +1295,7 @@ ColumnarGetHighestItemPointer(Relation relation, Snapshot snapshot) return invalidItemPtr; } - uint64 highestRowNumber = stripeWithHighestRowNumber->firstRowNumber + - stripeWithHighestRowNumber->rowCount - 1; + uint64 highestRowNumber = StripeGetHighestRowNumber(stripeWithHighestRowNumber); return row_number_to_tid(highestRowNumber); } diff --git a/src/include/columnar/columnar.h b/src/include/columnar/columnar.h index 739a7a95b..24c96e419 100644 --- a/src/include/columnar/columnar.h +++ b/src/include/columnar/columnar.h @@ -258,6 +258,7 @@ extern StripeMetadata * FindNextStripeByRowNumber(Relation relation, uint64 rowN Snapshot snapshot); extern StripeMetadata * FindStripeByRowNumber(Relation relation, uint64 rowNumber, Snapshot snapshot); +extern uint64 StripeGetHighestRowNumber(StripeMetadata *stripeMetadata); extern StripeMetadata * FindStripeWithHighestRowNumber(Relation relation, Snapshot snapshot); extern Datum columnar_relation_storageid(PG_FUNCTION_ARGS);