Introduce StripeGetHighestRowNumber

pull/5088/head
Onur Tirtir 2021-07-05 14:03:00 +03:00
parent 8942086506
commit 7bfd84bc70
4 changed files with 26 additions and 25 deletions

View File

@ -101,7 +101,7 @@ static Oid ColumnarChunkIndexRelationId(void);
static Oid ColumnarChunkGroupIndexRelationId(void); static Oid ColumnarChunkGroupIndexRelationId(void);
static Oid ColumnarNamespaceId(void); static Oid ColumnarNamespaceId(void);
static uint64 LookupStorageId(RelFileNode relfilenode); static uint64 LookupStorageId(RelFileNode relfilenode);
static uint64 GetHighestUsedFirstRowNumber(uint64 storageId); static uint64 GetHighestUsedRowNumber(uint64 storageId);
static void DeleteStorageFromColumnarMetadataTable(Oid metadataTableId, static void DeleteStorageFromColumnarMetadataTable(Oid metadataTableId,
AttrNumber storageIdAtrrNumber, AttrNumber storageIdAtrrNumber,
Oid storageIdIndexId, Oid storageIdIndexId,
@ -666,9 +666,7 @@ FindStripeByRowNumber(Relation relation, uint64 rowNumber, Snapshot snapshot)
return NULL; return NULL;
} }
uint64 stripeMaxRowNumber = stripeMetadata->firstRowNumber + if (rowNumber > StripeGetHighestRowNumber(stripeMetadata))
stripeMetadata->rowCount - 1;
if (rowNumber > stripeMaxRowNumber)
{ {
return NULL; 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 * StripeMetadataLookupRowNumber returns StripeMetadata for the stripe whose
* firstRowNumber is less than or equal to (FIND_LESS_OR_EQUAL), or is * 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 reservedStripeId = highestId + 1;
uint64 reservedOffset = highestOffset + 1; uint64 reservedOffset = highestOffset + 1;
uint64 reservedRowNumber = GetHighestUsedFirstRowNumber(storageId) + 1; uint64 reservedRowNumber = GetHighestUsedRowNumber(storageId) + 1;
ColumnarStorageUpdateCurrent(rel, isUpgrade, reservedStripeId, ColumnarStorageUpdateCurrent(rel, isUpgrade, reservedStripeId,
reservedRowNumber, reservedOffset); reservedRowNumber, reservedOffset);
} }
/* /*
* GetHighestUsedFirstRowNumber returns the highest used first_row_number * GetHighestUsedRowNumber returns the highest used rowNumber for given
* for given storageId. Returns COLUMNAR_INVALID_ROW_NUMBER if storage with * storageId. Returns COLUMNAR_INVALID_ROW_NUMBER if storage with
* storageId has no stripes. * storageId has no stripes.
* Note that normally we would use ColumnarStorageGetReservedRowNumber * Note that normally we would use ColumnarStorageGetReservedRowNumber
* to decide that. However, this function is designed to be used when * to decide that. However, this function is designed to be used when
* building the metapage itself during upgrades. * building the metapage itself during upgrades.
*/ */
static uint64 static uint64
GetHighestUsedFirstRowNumber(uint64 storageId) GetHighestUsedRowNumber(uint64 storageId)
{ {
uint64 highestRowNumber = COLUMNAR_INVALID_ROW_NUMBER;
List *stripeMetadataList = ReadDataFileStripeList(storageId, List *stripeMetadataList = ReadDataFileStripeList(storageId,
GetTransactionSnapshot()); 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; StripeMetadata *stripeMetadata = NULL;
foreach_ptr(stripeMetadata, stripeMetadataList) foreach_ptr(stripeMetadata, stripeMetadataList)
{ {
highestFirstRowNumber = Max(highestFirstRowNumber, highestRowNumber = Max(highestRowNumber,
stripeMetadata->firstRowNumber); StripeGetHighestRowNumber(stripeMetadata));
stripeRowCount = stripeMetadata->rowCount;
} }
return highestFirstRowNumber + stripeRowCount - 1; return highestRowNumber;
} }

View File

@ -447,8 +447,8 @@ AdvanceStripeRead(ColumnarReadState *readState)
readState->chunkGroupsFiltered += readState->chunkGroupsFiltered +=
readState->stripeReadState->chunkGroupsFiltered; readState->stripeReadState->chunkGroupsFiltered;
uint64 lastReadRowNumber = readState->currentStripeMetadata->firstRowNumber + uint64 lastReadRowNumber =
readState->currentStripeMetadata->rowCount - 1; StripeGetHighestRowNumber(readState->currentStripeMetadata);
EndStripeRead(readState->stripeReadState); EndStripeRead(readState->stripeReadState);

View File

@ -1295,8 +1295,7 @@ ColumnarGetHighestItemPointer(Relation relation, Snapshot snapshot)
return invalidItemPtr; return invalidItemPtr;
} }
uint64 highestRowNumber = stripeWithHighestRowNumber->firstRowNumber + uint64 highestRowNumber = StripeGetHighestRowNumber(stripeWithHighestRowNumber);
stripeWithHighestRowNumber->rowCount - 1;
return row_number_to_tid(highestRowNumber); return row_number_to_tid(highestRowNumber);
} }

View File

@ -258,6 +258,7 @@ extern StripeMetadata * FindNextStripeByRowNumber(Relation relation, uint64 rowN
Snapshot snapshot); Snapshot snapshot);
extern StripeMetadata * FindStripeByRowNumber(Relation relation, uint64 rowNumber, extern StripeMetadata * FindStripeByRowNumber(Relation relation, uint64 rowNumber,
Snapshot snapshot); Snapshot snapshot);
extern uint64 StripeGetHighestRowNumber(StripeMetadata *stripeMetadata);
extern StripeMetadata * FindStripeWithHighestRowNumber(Relation relation, extern StripeMetadata * FindStripeWithHighestRowNumber(Relation relation,
Snapshot snapshot); Snapshot snapshot);
extern Datum columnar_relation_storageid(PG_FUNCTION_ARGS); extern Datum columnar_relation_storageid(PG_FUNCTION_ARGS);