diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 7e31ac452a7f42fd3cc9dcb2dab391aae3445d21..a073a1d68e5560fdac1605e487d03258786c8737 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -13,7 +13,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/commands/vacuum.c,v 1.365 2008/02/20 14:31:35 alvherre Exp $ + * $PostgreSQL: pgsql/src/backend/commands/vacuum.c,v 1.366 2008/03/10 02:04:08 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -3461,7 +3461,7 @@ vac_update_fsm(Relation onerel, VacPageList fraged_pages, int nPages = fraged_pages->num_pages; VacPage *pagedesc = fraged_pages->pagedesc; Size threshold; - PageFreeSpaceInfo *pageSpaces; + FSMPageData *pageSpaces; int outPages; int i; @@ -3477,8 +3477,7 @@ vac_update_fsm(Relation onerel, VacPageList fraged_pages, */ threshold = GetAvgFSMRequestSize(&onerel->rd_node); - pageSpaces = (PageFreeSpaceInfo *) - palloc(nPages * sizeof(PageFreeSpaceInfo)); + pageSpaces = (FSMPageData *) palloc(nPages * sizeof(FSMPageData)); outPages = 0; for (i = 0; i < nPages; i++) @@ -3493,8 +3492,8 @@ vac_update_fsm(Relation onerel, VacPageList fraged_pages, if (pagedesc[i]->free >= threshold) { - pageSpaces[outPages].blkno = pagedesc[i]->blkno; - pageSpaces[outPages].avail = pagedesc[i]->free; + FSMPageSetPageNum(&pageSpaces[outPages], pagedesc[i]->blkno); + FSMPageSetSpace(&pageSpaces[outPages], pagedesc[i]->free); outPages++; } } diff --git a/src/backend/commands/vacuumlazy.c b/src/backend/commands/vacuumlazy.c index 7adde03f4ac6819d518a8a357e08bb8bfcf39cb8..d524e52b55522b66a5ba84e6438c3622e0723943 100644 --- a/src/backend/commands/vacuumlazy.c +++ b/src/backend/commands/vacuumlazy.c @@ -38,7 +38,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/commands/vacuumlazy.c,v 1.103 2008/01/01 19:45:49 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/commands/vacuumlazy.c,v 1.104 2008/03/10 02:04:09 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -98,7 +98,7 @@ typedef struct LVRelStats bool fs_is_heap; /* are we using heap organization? */ int num_free_pages; /* current # of entries */ int max_free_pages; /* # slots allocated in array */ - PageFreeSpaceInfo *free_pages; /* array or heap of blkno/avail */ + FSMPageData *free_pages; /* array or heap of blkno/avail */ BlockNumber tot_free_pages; /* total pages with >= threshold space */ int num_index_scans; } LVRelStats; @@ -813,7 +813,7 @@ lazy_truncate_heap(Relation onerel, LVRelStats *vacrelstats) { BlockNumber old_rel_pages = vacrelstats->rel_pages; BlockNumber new_rel_pages; - PageFreeSpaceInfo *pageSpaces; + FSMPageData *pageSpaces; int n; int i, j; @@ -881,7 +881,7 @@ lazy_truncate_heap(Relation onerel, LVRelStats *vacrelstats) j = 0; for (i = 0; i < n; i++) { - if (pageSpaces[i].blkno < new_rel_pages) + if (FSMPageGetPageNum(&pageSpaces[i]) < new_rel_pages) { pageSpaces[j] = pageSpaces[i]; j++; @@ -1028,7 +1028,7 @@ lazy_space_alloc(LVRelStats *vacrelstats, BlockNumber relblocks) palloc(maxtuples * sizeof(ItemPointerData)); maxpages = MaxFSMPages; - maxpages = Min(maxpages, MaxAllocSize / sizeof(PageFreeSpaceInfo)); + maxpages = Min(maxpages, MaxAllocSize / sizeof(FSMPageData)); /* No need to allocate more pages than the relation has blocks */ if (relblocks < (BlockNumber) maxpages) maxpages = (int) relblocks; @@ -1036,8 +1036,8 @@ lazy_space_alloc(LVRelStats *vacrelstats, BlockNumber relblocks) vacrelstats->fs_is_heap = false; vacrelstats->num_free_pages = 0; vacrelstats->max_free_pages = maxpages; - vacrelstats->free_pages = (PageFreeSpaceInfo *) - palloc(maxpages * sizeof(PageFreeSpaceInfo)); + vacrelstats->free_pages = (FSMPageData *) + palloc(maxpages * sizeof(FSMPageData)); vacrelstats->tot_free_pages = 0; } @@ -1068,7 +1068,7 @@ lazy_record_free_space(LVRelStats *vacrelstats, BlockNumber page, Size avail) { - PageFreeSpaceInfo *pageSpaces; + FSMPageData *pageSpaces; int n; /* @@ -1098,8 +1098,8 @@ lazy_record_free_space(LVRelStats *vacrelstats, /* If we haven't filled the array yet, just keep adding entries */ if (vacrelstats->num_free_pages < n) { - pageSpaces[vacrelstats->num_free_pages].blkno = page; - pageSpaces[vacrelstats->num_free_pages].avail = avail; + FSMPageSetPageNum(&pageSpaces[vacrelstats->num_free_pages], page); + FSMPageSetSpace(&pageSpaces[vacrelstats->num_free_pages], avail); vacrelstats->num_free_pages++; return; } @@ -1127,8 +1127,8 @@ lazy_record_free_space(LVRelStats *vacrelstats, while (--l >= 0) { - BlockNumber R = pageSpaces[l].blkno; - Size K = pageSpaces[l].avail; + BlockNumber R = FSMPageGetPageNum(&pageSpaces[l]); + Size K = FSMPageGetSpace(&pageSpaces[l]); int i; /* i is where the "hole" is */ i = l; @@ -1138,22 +1138,22 @@ lazy_record_free_space(LVRelStats *vacrelstats, if (j >= n) break; - if (j + 1 < n && pageSpaces[j].avail > pageSpaces[j + 1].avail) + if (j + 1 < n && FSMPageGetSpace(&pageSpaces[j]) > FSMPageGetSpace(&pageSpaces[j + 1])) j++; - if (K <= pageSpaces[j].avail) + if (K <= FSMPageGetSpace(&pageSpaces[j])) break; pageSpaces[i] = pageSpaces[j]; i = j; } - pageSpaces[i].blkno = R; - pageSpaces[i].avail = K; + FSMPageSetPageNum(&pageSpaces[i], R); + FSMPageSetSpace(&pageSpaces[i], K); } vacrelstats->fs_is_heap = true; } /* If new page has more than zero'th entry, insert it into heap */ - if (avail > pageSpaces[0].avail) + if (avail > FSMPageGetSpace(&pageSpaces[0])) { /* * Notionally, we replace the zero'th entry with the new data, and @@ -1169,15 +1169,15 @@ lazy_record_free_space(LVRelStats *vacrelstats, if (j >= n) break; - if (j + 1 < n && pageSpaces[j].avail > pageSpaces[j + 1].avail) + if (j + 1 < n && FSMPageGetSpace(&pageSpaces[j]) > FSMPageGetSpace(&pageSpaces[j + 1])) j++; - if (avail <= pageSpaces[j].avail) + if (avail <= FSMPageGetSpace(&pageSpaces[j])) break; pageSpaces[i] = pageSpaces[j]; i = j; } - pageSpaces[i].blkno = page; - pageSpaces[i].avail = avail; + FSMPageSetPageNum(&pageSpaces[i], page); + FSMPageSetSpace(&pageSpaces[i], avail); } } @@ -1210,14 +1210,14 @@ lazy_tid_reaped(ItemPointer itemptr, void *state) static void lazy_update_fsm(Relation onerel, LVRelStats *vacrelstats) { - PageFreeSpaceInfo *pageSpaces = vacrelstats->free_pages; + FSMPageData *pageSpaces = vacrelstats->free_pages; int nPages = vacrelstats->num_free_pages; /* * Sort data into order, as required by RecordRelationFreeSpace. */ if (nPages > 1) - qsort(pageSpaces, nPages, sizeof(PageFreeSpaceInfo), + qsort(pageSpaces, nPages, sizeof(FSMPageData), vac_cmp_page_spaces); RecordRelationFreeSpace(&onerel->rd_node, vacrelstats->tot_free_pages, @@ -1257,12 +1257,14 @@ vac_cmp_itemptr(const void *left, const void *right) static int vac_cmp_page_spaces(const void *left, const void *right) { - PageFreeSpaceInfo *linfo = (PageFreeSpaceInfo *) left; - PageFreeSpaceInfo *rinfo = (PageFreeSpaceInfo *) right; + FSMPageData *linfo = (FSMPageData *) left; + FSMPageData *rinfo = (FSMPageData *) right; + BlockNumber lblkno = FSMPageGetPageNum(linfo); + BlockNumber rblkno = FSMPageGetPageNum(rinfo); - if (linfo->blkno < rinfo->blkno) + if (lblkno < rblkno) return -1; - else if (linfo->blkno > rinfo->blkno) + else if (lblkno > rblkno) return 1; return 0; } diff --git a/src/backend/storage/freespace/freespace.c b/src/backend/storage/freespace/freespace.c index 7b66340f56c566ee0db305387de2d2acbfc00a7b..9373675b8cca6e1b3ce01ece6933c3a227076939 100644 --- a/src/backend/storage/freespace/freespace.c +++ b/src/backend/storage/freespace/freespace.c @@ -8,7 +8,7 @@ * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/storage/freespace/freespace.c,v 1.59 2008/01/01 19:45:51 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/storage/freespace/freespace.c,v 1.60 2008/03/10 02:04:09 tgl Exp $ * * * NOTES: @@ -143,7 +143,7 @@ static bool lookup_fsm_page_entry(FSMRelation *fsmrel, BlockNumber page, static void compact_fsm_storage(void); static void push_fsm_rels_after(FSMRelation *afterRel); static void pack_incoming_pages(FSMPageData *newLocation, int newPages, - PageFreeSpaceInfo *pageSpaces, int nPages); + FSMPageData *pageSpaces, int nPages); static void pack_existing_pages(FSMPageData *newLocation, int newPages, FSMPageData *oldLocation, int oldPages); static int fsm_calc_request(FSMRelation *fsmrel); @@ -375,7 +375,7 @@ void RecordRelationFreeSpace(RelFileNode *rel, BlockNumber interestingPages, int nPages, - PageFreeSpaceInfo *pageSpaces) + FSMPageData *pageSpaces) { FSMRelation *fsmrel; @@ -415,14 +415,12 @@ RecordRelationFreeSpace(RelFileNode *rel, for (i = 0; i < nPages; i++) { - BlockNumber page = pageSpaces[i].blkno; - Size avail = pageSpaces[i].avail; + BlockNumber page = FSMPageGetPageNum(&pageSpaces[i]); /* Check caller provides sorted data */ - if (i > 0 && page <= pageSpaces[i - 1].blkno) + if (i > 0 && page <= FSMPageGetPageNum(&pageSpaces[i - 1])) elog(ERROR, "free-space data is not in page order"); - FSMPageSetPageNum(newLocation, page); - FSMPageSetSpace(newLocation, avail); + *newLocation = pageSpaces[i]; newLocation++; } fsmrel->storedPages = nPages; @@ -1534,7 +1532,7 @@ push_fsm_rels_after(FSMRelation *afterRel) static void pack_incoming_pages(FSMPageData *newLocation, int newPages, - PageFreeSpaceInfo *pageSpaces, int nPages) + FSMPageData *pageSpaces, int nPages) { int histogram[HISTOGRAM_BINS]; int above, @@ -1548,7 +1546,7 @@ pack_incoming_pages(FSMPageData *newLocation, int newPages, MemSet(histogram, 0, sizeof(histogram)); for (i = 0; i < nPages; i++) { - Size avail = pageSpaces[i].avail; + Size avail = FSMPageGetSpace(&pageSpaces[i]); if (avail >= BLCKSZ) elog(ERROR, "bogus freespace amount"); @@ -1572,18 +1570,17 @@ pack_incoming_pages(FSMPageData *newLocation, int newPages, /* And copy the appropriate data */ for (i = 0; i < nPages; i++) { - BlockNumber page = pageSpaces[i].blkno; - Size avail = pageSpaces[i].avail; + BlockNumber page = FSMPageGetPageNum(&pageSpaces[i]); + Size avail = FSMPageGetSpace(&pageSpaces[i]); /* Check caller provides sorted data */ - if (i > 0 && page <= pageSpaces[i - 1].blkno) + if (i > 0 && page <= FSMPageGetPageNum(&pageSpaces[i - 1])) elog(ERROR, "free-space data is not in page order"); /* Save this page? */ if (avail >= thresholdU || (avail >= thresholdL && (--binct >= 0))) { - FSMPageSetPageNum(newLocation, page); - FSMPageSetSpace(newLocation, avail); + *newLocation = pageSpaces[i]; newLocation++; newPages--; } diff --git a/src/include/storage/freespace.h b/src/include/storage/freespace.h index 0ef828ed54d8ac42ce70c75cc26b038aa7215df8..86dd22647c358abc386da571edc67e79c45de8c9 100644 --- a/src/include/storage/freespace.h +++ b/src/include/storage/freespace.h @@ -7,7 +7,7 @@ * Portions Copyright (c) 1996-2008, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $PostgreSQL: pgsql/src/include/storage/freespace.h,v 1.27 2008/01/01 19:45:59 momjian Exp $ + * $PostgreSQL: pgsql/src/include/storage/freespace.h,v 1.28 2008/03/10 02:04:10 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -18,16 +18,6 @@ #include "storage/itemptr.h" -/* - * exported types - */ -typedef struct PageFreeSpaceInfo -{ - BlockNumber blkno; /* which page in relation */ - Size avail; /* space available on this page */ -} PageFreeSpaceInfo; - - /* Initial value for average-request moving average */ #define INITIAL_AVERAGE ((Size) (BLCKSZ / 32)) @@ -144,7 +134,7 @@ extern Size GetAvgFSMRequestSize(RelFileNode *rel); extern void RecordRelationFreeSpace(RelFileNode *rel, BlockNumber interestingPages, int nPages, - PageFreeSpaceInfo *pageSpaces); + FSMPageData *pageSpaces); extern BlockNumber GetFreeIndexPage(RelFileNode *rel); extern void RecordIndexFreeSpace(RelFileNode *rel,