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 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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Reference in New Issue