col/remove-cgroup-row-cnt
Onur Tirtir 2021-03-31 12:58:30 +03:00
parent 67bc990c1c
commit ac40014d04
6 changed files with 43 additions and 99 deletions

View File

@ -83,8 +83,6 @@ static void GetHighestUsedAddressAndId(uint64 storageId,
static void LockForStripeReservation(Relation rel, LOCKMODE mode); static void LockForStripeReservation(Relation rel, LOCKMODE mode);
static void UnlockForStripeReservation(Relation rel, LOCKMODE mode); static void UnlockForStripeReservation(Relation rel, LOCKMODE mode);
static List * ReadDataFileStripeList(uint64 storageId, Snapshot snapshot); static List * ReadDataFileStripeList(uint64 storageId, Snapshot snapshot);
static uint32 * ReadChunkGroupRowCounts(uint64 storageId, uint64 stripe, uint32
chunkGroupCount);
static Oid ColumnarStorageIdSequenceRelationId(void); static Oid ColumnarStorageIdSequenceRelationId(void);
static Oid ColumnarStripeRelationId(void); static Oid ColumnarStripeRelationId(void);
static Oid ColumnarStripeIndexRelationId(void); static Oid ColumnarStripeIndexRelationId(void);
@ -151,11 +149,10 @@ typedef FormData_columnar_options *Form_columnar_options;
#define Anum_columnar_stripe_chunk_count 8 #define Anum_columnar_stripe_chunk_count 8
/* constants for columnar.chunk_group */ /* constants for columnar.chunk_group */
#define Natts_columnar_chunkgroup 4 #define Natts_columnar_chunkgroup 3
#define Anum_columnar_chunkgroup_storageid 1 #define Anum_columnar_chunkgroup_storageid 1
#define Anum_columnar_chunkgroup_stripe 2 #define Anum_columnar_chunkgroup_stripe 2
#define Anum_columnar_chunkgroup_chunk 3 #define Anum_columnar_chunkgroup_chunk 3
#define Anum_columnar_chunkgroup_row_count 4
/* constants for columnar.chunk */ /* constants for columnar.chunk */
#define Natts_columnar_chunk 14 #define Natts_columnar_chunk 14
@ -485,24 +482,19 @@ SaveStripeSkipList(RelFileNode relfilenode, uint64 stripe, StripeSkipList *chunk
*/ */
void void
SaveChunkGroups(RelFileNode relfilenode, uint64 stripe, SaveChunkGroups(RelFileNode relfilenode, uint64 stripe,
List *chunkGroupRowCounts) uint32 stripeChunkCount)
{ {
ColumnarMetapage *metapage = ReadMetapage(relfilenode, false); ColumnarMetapage *metapage = ReadMetapage(relfilenode, false);
Oid columnarChunkGroupOid = ColumnarChunkGroupRelationId(); Oid columnarChunkGroupOid = ColumnarChunkGroupRelationId();
Relation columnarChunkGroup = table_open(columnarChunkGroupOid, RowExclusiveLock); Relation columnarChunkGroup = table_open(columnarChunkGroupOid, RowExclusiveLock);
ModifyState *modifyState = StartModifyRelation(columnarChunkGroup); ModifyState *modifyState = StartModifyRelation(columnarChunkGroup);
ListCell *lc = NULL; for (uint32 chunkId = 0; chunkId < stripeChunkCount; chunkId++)
int chunkId = 0;
foreach(lc, chunkGroupRowCounts)
{ {
int64 rowCount = lfirst_int(lc);
Datum values[Natts_columnar_chunkgroup] = { Datum values[Natts_columnar_chunkgroup] = {
UInt64GetDatum(metapage->storageId), UInt64GetDatum(metapage->storageId),
Int64GetDatum(stripe), Int64GetDatum(stripe),
Int32GetDatum(chunkId), Int32GetDatum(chunkId)
Int64GetDatum(rowCount)
}; };
bool nulls[Natts_columnar_chunkgroup] = { false }; bool nulls[Natts_columnar_chunkgroup] = { false };
@ -518,6 +510,8 @@ SaveChunkGroups(RelFileNode relfilenode, uint64 stripe,
} }
static StripeMetadata * GetStripeById(uint64 storageId, uint64 stripeId, Snapshot snapshot);
/* /*
* ReadStripeSkipList fetches chunk metadata for a given stripe. * ReadStripeSkipList fetches chunk metadata for a given stripe.
*/ */
@ -623,72 +617,12 @@ ReadStripeSkipList(RelFileNode relfilenode, uint64 stripe, TupleDesc tupleDescri
index_close(index, AccessShareLock); index_close(index, AccessShareLock);
table_close(columnarChunk, AccessShareLock); table_close(columnarChunk, AccessShareLock);
chunkList->chunkGroupRowCounts = chunkList->chunkGroupRowCount = GetStripeById(metapage->storageId, stripe, NULL)->chunkGroupRowCount;
ReadChunkGroupRowCounts(metapage->storageId, stripe, chunkCount);
return chunkList; return chunkList;
} }
/*
* ReadChunkGroupRowCounts returns an array of row counts of chunk groups for the
* given stripe.
*/
static uint32 *
ReadChunkGroupRowCounts(uint64 storageId, uint64 stripe, uint32 chunkGroupCount)
{
Oid columnarChunkGroupOid = ColumnarChunkGroupRelationId();
Relation columnarChunkGroup = table_open(columnarChunkGroupOid, AccessShareLock);
Relation index = index_open(ColumnarChunkGroupIndexRelationId(), AccessShareLock);
ScanKeyData scanKey[2];
ScanKeyInit(&scanKey[0], Anum_columnar_chunkgroup_storageid,
BTEqualStrategyNumber, F_OIDEQ, UInt64GetDatum(storageId));
ScanKeyInit(&scanKey[1], Anum_columnar_chunkgroup_stripe,
BTEqualStrategyNumber, F_OIDEQ, Int32GetDatum(stripe));
SysScanDesc scanDescriptor =
systable_beginscan_ordered(columnarChunkGroup, index, NULL, 2, scanKey);
uint32 chunkGroupIndex = 0;
HeapTuple heapTuple = NULL;
uint32 *chunkGroupRowCounts = palloc0(chunkGroupCount * sizeof(uint32));
while (HeapTupleIsValid(heapTuple = systable_getnext(scanDescriptor)))
{
Datum datumArray[Natts_columnar_chunkgroup];
bool isNullArray[Natts_columnar_chunkgroup];
heap_deform_tuple(heapTuple,
RelationGetDescr(columnarChunkGroup),
datumArray, isNullArray);
uint32 tupleChunkGroupIndex =
DatumGetUInt32(datumArray[Anum_columnar_chunkgroup_chunk - 1]);
if (chunkGroupIndex >= chunkGroupCount ||
tupleChunkGroupIndex != chunkGroupIndex)
{
elog(ERROR, "unexpected chunk group");
}
chunkGroupRowCounts[chunkGroupIndex] =
(uint32) DatumGetUInt64(datumArray[Anum_columnar_chunkgroup_row_count - 1]);
chunkGroupIndex++;
}
if (chunkGroupIndex != chunkGroupCount)
{
elog(ERROR, "unexpected chunk group count");
}
systable_endscan_ordered(scanDescriptor);
index_close(index, AccessShareLock);
table_close(columnarChunkGroup, AccessShareLock);
return chunkGroupRowCounts;
}
/* /*
* InsertStripeMetadataRow adds a row to columnar.stripe. * InsertStripeMetadataRow adds a row to columnar.stripe.
*/ */
@ -896,6 +830,24 @@ ReserveStripe(Relation rel, uint64 sizeBytes,
return stripe; return stripe;
} }
#include "distributed/listutils.h"
static StripeMetadata *
GetStripeById(uint64 storageId, uint64 stripeId, Snapshot snapshot)
{
List *stripeList = ReadDataFileStripeList(storageId, snapshot);
StripeMetadata *stripeMetadata = NULL;
foreach_ptr(stripeMetadata, stripeList)
{
if (stripeMetadata->id == stripeId)
{
return stripeMetadata;
}
}
ereport(ERROR, (errmsg("Not expected")));
return NULL;
}
/* /*
* ReadDataFileStripeList reads the stripe list for a given storageId * ReadDataFileStripeList reads the stripe list for a given storageId

View File

@ -352,8 +352,7 @@ static ChunkGroupReadState *
BeginChunkGroupRead(StripeBuffers *stripeBuffers, int chunkIndex, TupleDesc tupleDesc, BeginChunkGroupRead(StripeBuffers *stripeBuffers, int chunkIndex, TupleDesc tupleDesc,
List *projectedColumnList, MemoryContext cxt) List *projectedColumnList, MemoryContext cxt)
{ {
uint32 chunkGroupRowCount = uint32 chunkGroupRowCount = stripeBuffers->stripeChunkGroupRowCount;
stripeBuffers->selectedChunkGroupRowCounts[chunkIndex];
MemoryContext oldContext = MemoryContextSwitchTo(cxt); MemoryContext oldContext = MemoryContextSwitchTo(cxt);
@ -577,8 +576,8 @@ LoadFilteredStripeBuffers(Relation relation, StripeMetadata *stripeMetadata,
stripeBuffers->columnCount = columnCount; stripeBuffers->columnCount = columnCount;
stripeBuffers->rowCount = StripeSkipListRowCount(selectedChunkSkipList); stripeBuffers->rowCount = StripeSkipListRowCount(selectedChunkSkipList);
stripeBuffers->columnBuffersArray = columnBuffersArray; stripeBuffers->columnBuffersArray = columnBuffersArray;
stripeBuffers->selectedChunkGroupRowCounts = stripeBuffers->stripeChunkGroupRowCount =
selectedChunkSkipList->chunkGroupRowCounts; selectedChunkSkipList->chunkGroupRowCount;
return stripeBuffers; return stripeBuffers;
} }
@ -899,22 +898,11 @@ SelectedChunkSkipList(StripeSkipList *stripeSkipList, bool *projectedColumnMask,
} }
} }
selectedChunkIndex = 0;
uint32 *chunkGroupRowCounts = palloc0(selectedChunkCount * sizeof(uint32));
for (chunkIndex = 0; chunkIndex < stripeSkipList->chunkCount; chunkIndex++)
{
if (selectedChunkMask[chunkIndex])
{
chunkGroupRowCounts[selectedChunkIndex++] =
stripeSkipList->chunkGroupRowCounts[chunkIndex];
}
}
StripeSkipList *selectedChunkSkipList = palloc0(sizeof(StripeSkipList)); StripeSkipList *selectedChunkSkipList = palloc0(sizeof(StripeSkipList));
selectedChunkSkipList->chunkSkipNodeArray = selectedChunkSkipNodeArray; selectedChunkSkipList->chunkSkipNodeArray = selectedChunkSkipNodeArray;
selectedChunkSkipList->chunkCount = selectedChunkCount; selectedChunkSkipList->chunkCount = selectedChunkCount;
selectedChunkSkipList->columnCount = stripeSkipList->columnCount; selectedChunkSkipList->columnCount = stripeSkipList->columnCount;
selectedChunkSkipList->chunkGroupRowCounts = chunkGroupRowCounts; selectedChunkSkipList->chunkGroupRowCount = stripeSkipList->chunkGroupRowCount;
return selectedChunkSkipList; return selectedChunkSkipList;
} }
@ -930,11 +918,11 @@ StripeSkipListRowCount(StripeSkipList *stripeSkipList)
{ {
uint32 stripeSkipListRowCount = 0; uint32 stripeSkipListRowCount = 0;
uint32 chunkIndex = 0; uint32 chunkIndex = 0;
uint32 *chunkGroupRowCounts = stripeSkipList->chunkGroupRowCounts; uint32 chunkGroupRowCount = stripeSkipList->chunkGroupRowCount;
/* TODO: multiplication */
for (chunkIndex = 0; chunkIndex < stripeSkipList->chunkCount; chunkIndex++) for (chunkIndex = 0; chunkIndex < stripeSkipList->chunkCount; chunkIndex++)
{ {
uint32 chunkGroupRowCount = chunkGroupRowCounts[chunkIndex];
stripeSkipListRowCount += chunkGroupRowCount; stripeSkipListRowCount += chunkGroupRowCount;
} }

View File

@ -45,7 +45,7 @@ struct ColumnarWriteState
ColumnarOptions options; ColumnarOptions options;
ChunkData *chunkData; ChunkData *chunkData;
List *chunkGroupRowCounts; uint32 chunkGroupRowCount;
/* /*
* compressionBuffer buffer is used as temporary storage during * compressionBuffer buffer is used as temporary storage during
@ -546,12 +546,12 @@ FlushStripe(ColumnarWriteState *writeState)
SaveChunkGroups(writeState->relfilenode, SaveChunkGroups(writeState->relfilenode,
stripeMetadata.id, stripeMetadata.id,
writeState->chunkGroupRowCounts); stripeSkipList->chunkCount);
SaveStripeSkipList(writeState->relfilenode, SaveStripeSkipList(writeState->relfilenode,
stripeMetadata.id, stripeMetadata.id,
stripeSkipList, tupleDescriptor); stripeSkipList, tupleDescriptor);
writeState->chunkGroupRowCounts = NIL; writeState->chunkGroupRowCount = 0;
relation_close(relation, NoLock); relation_close(relation, NoLock);
} }
@ -640,8 +640,7 @@ SerializeChunkData(ColumnarWriteState *writeState, uint32 chunkIndex, uint32 row
const uint32 columnCount = stripeBuffers->columnCount; const uint32 columnCount = stripeBuffers->columnCount;
StringInfo compressionBuffer = writeState->compressionBuffer; StringInfo compressionBuffer = writeState->compressionBuffer;
writeState->chunkGroupRowCounts = writeState->chunkGroupRowCount = rowCount;
lappend_int(writeState->chunkGroupRowCounts, rowCount);
/* serialize exist values, data values are already serialized */ /* serialize exist values, data values are already serialized */
for (columnIndex = 0; columnIndex < columnCount; columnIndex++) for (columnIndex = 0; columnIndex < columnCount; columnIndex++)

View File

@ -16,3 +16,5 @@ ALTER TABLE columnar.chunk_group DROP CONSTRAINT chunk_group_storage_id_fkey;
$$; $$;
END IF; END IF;
END$proc$; END$proc$;
ALTER TABLE columnar.chunk_group DROP COLUMN row_count;

View File

@ -1,5 +1,8 @@
/* columnar--10.1-1--10.0-3.sql */ /* columnar--10.1-1--10.0-3.sql */
-- TODO: populate row_count again and make it NOT NULL, or ... ?
ALTER TABLE columnar.chunk_group ADD COLUMN row_count bigint;
-- define foreign keys between columnar metadata tables -- define foreign keys between columnar metadata tables
ALTER TABLE columnar.chunk ALTER TABLE columnar.chunk
ADD FOREIGN KEY (storage_id, stripe_num, chunk_group_num) ADD FOREIGN KEY (storage_id, stripe_num, chunk_group_num)

View File

@ -112,7 +112,7 @@ typedef struct ColumnChunkSkipNode
typedef struct StripeSkipList typedef struct StripeSkipList
{ {
ColumnChunkSkipNode **chunkSkipNodeArray; ColumnChunkSkipNode **chunkSkipNodeArray;
uint32 *chunkGroupRowCounts; uint32 chunkGroupRowCount;
uint32 columnCount; uint32 columnCount;
uint32 chunkCount; uint32 chunkCount;
} StripeSkipList; } StripeSkipList;
@ -175,7 +175,7 @@ typedef struct StripeBuffers
uint32 rowCount; uint32 rowCount;
ColumnBuffers **columnBuffersArray; ColumnBuffers **columnBuffersArray;
uint32 *selectedChunkGroupRowCounts; uint32 stripeChunkGroupRowCount;
} StripeBuffers; } StripeBuffers;
@ -248,7 +248,7 @@ extern void SaveStripeSkipList(RelFileNode relfilenode, uint64 stripe,
StripeSkipList *stripeSkipList, StripeSkipList *stripeSkipList,
TupleDesc tupleDescriptor); TupleDesc tupleDescriptor);
extern void SaveChunkGroups(RelFileNode relfilenode, uint64 stripe, extern void SaveChunkGroups(RelFileNode relfilenode, uint64 stripe,
List *chunkGroupRowCounts); uint32 stripeChunkCount);
extern StripeSkipList * ReadStripeSkipList(RelFileNode relfilenode, uint64 stripe, extern StripeSkipList * ReadStripeSkipList(RelFileNode relfilenode, uint64 stripe,
TupleDesc tupleDescriptor, TupleDesc tupleDescriptor,
uint32 chunkCount); uint32 chunkCount);