/* * AppendOnlySegmentFileTruncateToEOF() * * Assumes that the segment file lock is already held. * * For the segment file is truncates to the eof. */ static void AppendOnlySegmentFileTruncateToEOF(Relation aorel, FileSegInfo *fsinfo) { const char* relname = RelationGetRelationName(aorel); MirroredAppendOnlyOpen mirroredOpened; int32 fileSegNo; char filenamepath[MAXPGPATH]; int segno; int64 segeof; Assert(fsinfo); Assert(RelationIsAoRows(aorel)); segno = fsinfo->segno; relname = RelationGetRelationName(aorel); segeof = (int64)fsinfo->eof; /* Open and truncate the relation segfile beyond its eof */ MakeAOSegmentFileName(aorel, segno, -1, &fileSegNo, filenamepath); elogif(Debug_appendonly_print_compaction, LOG, "Opening AO relation \"%s.%s\", relation id %u, relfilenode %u (physical segment file #%d, logical EOF " INT64_FORMAT ")", get_namespace_name(RelationGetNamespace(aorel)), relname, aorel->rd_id, aorel->rd_node.relNode, segno, segeof); if (OpenAOSegmentFile(aorel, filenamepath, fileSegNo, segeof, &mirroredOpened)) { TruncateAOSegmentFile(&mirroredOpened, aorel, segeof, ERROR); CloseAOSegmentFile(&mirroredOpened); elogif(Debug_appendonly_print_compaction, LOG, "Successfully truncated AO ROL relation \"%s.%s\", relation id %u, relfilenode %u (physical segment file #%d, logical EOF " INT64_FORMAT ")", get_namespace_name(RelationGetNamespace(aorel)), relname, aorel->rd_id, aorel->rd_node.relNode, segno, segeof); } else { elogif(Debug_appendonly_print_compaction, LOG, "No gp_relation_node entry for AO ROW relation \"%s.%s\", relation id %u, relfilenode %u (physical segment file #%d, logical EOF " INT64_FORMAT ")", get_namespace_name(RelationGetNamespace(aorel)), relname, aorel->rd_id, aorel->rd_node.relNode, segno, segeof); } }
/* * Drops a segment file. * * Actually, we just truncate the segfile to 0 bytes, to reclaim the space. * Before GPDB 6, we used to remove the file, but with WAL replication, we * no longer have a convenient function to remove a single segment of a * relation. An empty file is as almost as good as a non-existent file. If * the relation is dropped later, the code in mdunlink() will remove all * segments, including any empty ones we've left behind. */ static void AOCSCompaction_DropSegmentFile(Relation aorel, int segno) { int col; Assert(RelationIsAoCols(aorel)); for (col = 0; col < RelationGetNumberOfAttributes(aorel); col++) { char filenamepath[MAXPGPATH]; int pseudoSegNo; File fd; /* Open and truncate the relation segfile */ MakeAOSegmentFileName(aorel, segno, col, &pseudoSegNo, filenamepath); elogif(Debug_appendonly_print_compaction, LOG, "Drop segment file: " "segno %d", pseudoSegNo); fd = OpenAOSegmentFile(aorel, filenamepath, pseudoSegNo, 0); if (fd >= 0) { TruncateAOSegmentFile(fd, aorel, pseudoSegNo, 0); CloseAOSegmentFile(fd); } else { /* * The file we were about to drop/truncate didn't exist. That's normal, * for example, if a column is added with ALTER TABLE ADD COLUMN. */ elog(DEBUG1, "could not truncate segfile %s, because it does not exist", filenamepath); } } }
/* * AOCSSegmentFileTruncateToEOF() * * Assumes that the segment file lock is already held. * * For the segment file is truncates to the eof. */ static void AOCSSegmentFileTruncateToEOF(Relation aorel, AOCSFileSegInfo *fsinfo) { const char *relname = RelationGetRelationName(aorel); int segno; int j; Assert(fsinfo); Assert(RelationIsAoCols(aorel)); segno = fsinfo->segno; relname = RelationGetRelationName(aorel); for (j = 0; j < fsinfo->vpinfo.nEntry; ++j) { int64 segeof; char filenamepath[MAXPGPATH]; AOCSVPInfoEntry *entry; File fd; int32 fileSegNo; entry = getAOCSVPEntry(fsinfo, j); segeof = entry->eof; /* Open and truncate the relation segfile to its eof */ MakeAOSegmentFileName(aorel, segno, j, &fileSegNo, filenamepath); elogif(Debug_appendonly_print_compaction, LOG, "Opening AO COL relation \"%s.%s\", relation id %u, relfilenode %u column #%d, logical segment #%d (physical segment file #%d, logical EOF " INT64_FORMAT ")", get_namespace_name(RelationGetNamespace(aorel)), relname, aorel->rd_id, aorel->rd_node.relNode, j, segno, fileSegNo, segeof); fd = OpenAOSegmentFile(aorel, filenamepath, fileSegNo, segeof); if (fd >= 0) { TruncateAOSegmentFile(fd, aorel, fileSegNo, segeof); CloseAOSegmentFile(fd); elogif(Debug_appendonly_print_compaction, LOG, "Successfully truncated AO COL relation \"%s.%s\", relation id %u, relfilenode %u column #%d, logical segment #%d (physical segment file #%d, logical EOF " INT64_FORMAT ")", get_namespace_name(RelationGetNamespace(aorel)), relname, aorel->rd_id, aorel->rd_node.relNode, j, segno, fileSegNo, segeof); } else { elogif(Debug_appendonly_print_compaction, LOG, "No gp_relation_node entry for AO COL relation \"%s.%s\", relation id %u, relfilenode %u column #%d, logical segment #%d (physical segment file #%d, logical EOF " INT64_FORMAT ")", get_namespace_name(RelationGetNamespace(aorel)), relname, aorel->rd_id, aorel->rd_node.relNode, j, segno, fileSegNo, segeof); } } }