void AppendOnlyBlockDirectory_End_addCol( AppendOnlyBlockDirectory *blockDirectory) { int groupNo; /* newly added columns have attribute number beginning with this */ AttrNumber colno = blockDirectory->aoRel->rd_att->natts - blockDirectory->numColumnGroups; if (blockDirectory->blkdirRel == NULL || blockDirectory->blkdirIdx == NULL) return; for (groupNo = 0; groupNo < blockDirectory->numColumnGroups; groupNo++) { MinipagePerColumnGroup *minipageInfo = &blockDirectory->minipages[groupNo]; if (minipageInfo->numMinipageEntries > 0) { write_minipage(blockDirectory, groupNo + colno, minipageInfo); ereportif(Debug_appendonly_print_blockdirectory, LOG, (errmsg("Append-only block directory end of insert write" " minipage: (columnGroupNo, nEntries) = (%d, %u)", groupNo, minipageInfo->numMinipageEntries))); } pfree(minipageInfo->minipage); } ereportif(Debug_appendonly_print_blockdirectory, LOG, (errmsg("Append-only block directory end for insert: " "(segno, numColumnGroups, isAOCol)=" "(%d, %d, %d)", blockDirectory->currentSegmentFileNum, blockDirectory->numColumnGroups, blockDirectory->isAOCol))); pfree(blockDirectory->values); pfree(blockDirectory->nulls); pfree(blockDirectory->minipages); pfree(blockDirectory->scanKeys); pfree(blockDirectory->strategyNumbers); /* * We already hold transaction-scope exclusive lock on the AOCS * relation. Let's defer release of locks on block directory as * well until the end of alter-table transaction. */ index_close(blockDirectory->blkdirIdx, NoLock); heap_close(blockDirectory->blkdirRel, NoLock); MemoryContextDelete(blockDirectory->memoryContext); }
void AppendOnlyBlockDirectory_End_forInsert( AppendOnlyBlockDirectory *blockDirectory) { int groupNo; if (blockDirectory->blkdirRel == NULL || blockDirectory->blkdirIdx == NULL) return; for (groupNo = 0; groupNo < blockDirectory->numColumnGroups; groupNo++) { MinipagePerColumnGroup *minipageInfo = &blockDirectory->minipages[groupNo]; if (minipageInfo->numMinipageEntries > 0) { write_minipage(blockDirectory, groupNo); if (Debug_appendonly_print_blockdirectory) ereport(LOG, (errmsg("Append-only block directory end of insert write minipage: " "(columnGroupNo, nEntries) = (%d, %u)", groupNo, minipageInfo->numMinipageEntries))); } pfree(minipageInfo->minipage); } if (Debug_appendonly_print_blockdirectory) ereport(LOG, (errmsg("Append-only block directory end for insert: " "(segno, numColumnGroups)=" "(%d, %d)", blockDirectory->currentSegmentFileNum, blockDirectory->numColumnGroups))); pfree(blockDirectory->values); pfree(blockDirectory->nulls); pfree(blockDirectory->minipages); pfree(blockDirectory->scanKeys); pfree(blockDirectory->strategyNumbers); index_close(blockDirectory->blkdirIdx, RowExclusiveLock); heap_close(blockDirectory->blkdirRel, RowExclusiveLock); MemoryContextDelete(blockDirectory->memoryContext); }
/* * Helper method used to insert a new minipage entry in the block * directory relation. Refer to AppendOnlyBlockDirectory_InsertEntry() * for more details. */ static bool insert_new_entry( AppendOnlyBlockDirectory *blockDirectory, int columnGroupNo, int64 firstRowNum, int64 fileOffset, int64 rowCount, MinipagePerColumnGroup *minipageInfo) { MinipageEntry *entry = NULL; int lastEntryNo; if (rowCount == 0) return false; if (blockDirectory->blkdirRel == NULL || blockDirectory->blkdirIdx == NULL) return false; Assert(minipageInfo->numMinipageEntries <= (uint32)NUM_MINIPAGE_ENTRIES); lastEntryNo = minipageInfo->numMinipageEntries - 1; if (lastEntryNo >= 0) { entry = &(minipageInfo->minipage->entry[lastEntryNo]); Assert(entry->firstRowNum < firstRowNum); Assert(entry->fileOffset < fileOffset); if (gp_blockdirectory_entry_min_range > 0 && fileOffset - entry->fileOffset < gp_blockdirectory_entry_min_range) return true; /* Update the rowCount in the latest entry */ Assert(entry->rowCount <= firstRowNum - entry->firstRowNum); ereportif(Debug_appendonly_print_blockdirectory, LOG, (errmsg("Append-only block directory update entry: " "(firstRowNum, columnGroupNo, fileOffset, rowCount) = (" INT64_FORMAT ", %d, " INT64_FORMAT ", " INT64_FORMAT ") at index %d to " "(firstRowNum, columnGroupNo, fileOffset, rowCount) = (" INT64_FORMAT ", %d, " INT64_FORMAT ", " INT64_FORMAT ")", entry->firstRowNum, columnGroupNo, entry->fileOffset, entry->rowCount, minipageInfo->numMinipageEntries - 1, entry->firstRowNum, columnGroupNo, entry->fileOffset, firstRowNum - entry->firstRowNum))); entry->rowCount = firstRowNum - entry->firstRowNum; } if (minipageInfo->numMinipageEntries >= (uint32)gp_blockdirectory_minipage_size) { write_minipage(blockDirectory, columnGroupNo, minipageInfo); /* Set tupleTid to invalid */ ItemPointerSetInvalid(&minipageInfo->tupleTid); /* * Clear out the entries. */ MemSet(minipageInfo->minipage->entry, 0, minipageInfo->numMinipageEntries * sizeof(MinipageEntry)); minipageInfo->numMinipageEntries = 0; } Assert(minipageInfo->numMinipageEntries < (uint32)gp_blockdirectory_minipage_size); entry = &(minipageInfo->minipage->entry[minipageInfo->numMinipageEntries]); entry->firstRowNum = firstRowNum; entry->fileOffset = fileOffset; entry->rowCount = rowCount; minipageInfo->numMinipageEntries++; ereportif(Debug_appendonly_print_blockdirectory, LOG, (errmsg("Append-only block directory insert entry: " "(firstRowNum, columnGroupNo, fileOffset, rowCount) = (" INT64_FORMAT ", %d, " INT64_FORMAT ", " INT64_FORMAT ") at index %d", entry->firstRowNum, columnGroupNo, entry->fileOffset, entry->rowCount, minipageInfo->numMinipageEntries - 1))); return true; }