mirror of https://github.com/citusdata/citus.git
Introduce StripeGetHighestRowNumber
parent
8942086506
commit
7bfd84bc70
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue