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 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;
}

View File

@ -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);

View File

@ -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);
}

View File

@ -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);