Skip to content

Commit 3ccde31

Browse files
committed
Have autovacuum consider processing TOAST tables separately from their
main tables. This requires vacuum() to accept processing a toast table standalone, so there's a user-visible change in that it's now possible (for a superuser) to execute "VACUUM pg_toast.pg_toast_XXX".
1 parent 010eebf commit 3ccde31

File tree

4 files changed

+172
-141
lines changed

4 files changed

+172
-141
lines changed

src/backend/commands/vacuum.c

Lines changed: 22 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
*
1414
*
1515
* IDENTIFICATION
16-
* $PostgreSQL: pgsql/src/backend/commands/vacuum.c,v 1.375 2008/06/05 15:47:32 alvherre Exp $
16+
* $PostgreSQL: pgsql/src/backend/commands/vacuum.c,v 1.376 2008/08/13 00:07:50 alvherre Exp $
1717
*
1818
*-------------------------------------------------------------------------
1919
*/
@@ -213,8 +213,8 @@ static BufferAccessStrategy vac_strategy;
213213
static List *get_rel_oids(Oid relid, const RangeVar *vacrel,
214214
const char *stmttype);
215215
static void vac_truncate_clog(TransactionId frozenXID);
216-
static void vacuum_rel(Oid relid, VacuumStmt *vacstmt, char expected_relkind,
217-
bool for_wraparound);
216+
static void vacuum_rel(Oid relid, VacuumStmt *vacstmt, bool do_toast,
217+
bool for_wraparound);
218218
static void full_vacuum_rel(Relation onerel, VacuumStmt *vacstmt);
219219
static void scan_heap(VRelStats *vacrelstats, Relation onerel,
220220
VacPageList vacuum_pages, VacPageList fraged_pages);
@@ -268,6 +268,9 @@ static Size PageGetFreeSpaceWithFillFactor(Relation relation, Page page);
268268
* OID to be processed, and vacstmt->relation is ignored. (The non-invalid
269269
* case is currently only used by autovacuum.)
270270
*
271+
* do_toast is passed as FALSE by autovacuum, because it processes TOAST
272+
* tables separately.
273+
*
271274
* for_wraparound is used by autovacuum to let us know when it's forcing
272275
* a vacuum for wraparound, which should not be auto-cancelled.
273276
*
@@ -281,7 +284,7 @@ static Size PageGetFreeSpaceWithFillFactor(Relation relation, Page page);
281284
* at transaction commit.
282285
*/
283286
void
284-
vacuum(VacuumStmt *vacstmt, Oid relid,
287+
vacuum(VacuumStmt *vacstmt, Oid relid, bool do_toast,
285288
BufferAccessStrategy bstrategy, bool for_wraparound, bool isTopLevel)
286289
{
287290
const char *stmttype = vacstmt->vacuum ? "VACUUM" : "ANALYZE";
@@ -433,7 +436,7 @@ vacuum(VacuumStmt *vacstmt, Oid relid,
433436
Oid relid = lfirst_oid(cur);
434437

435438
if (vacstmt->vacuum)
436-
vacuum_rel(relid, vacstmt, RELKIND_RELATION, for_wraparound);
439+
vacuum_rel(relid, vacstmt, do_toast, for_wraparound);
437440

438441
if (vacstmt->analyze)
439442
{
@@ -975,8 +978,7 @@ vac_truncate_clog(TransactionId frozenXID)
975978
* At entry and exit, we are not inside a transaction.
976979
*/
977980
static void
978-
vacuum_rel(Oid relid, VacuumStmt *vacstmt, char expected_relkind,
979-
bool for_wraparound)
981+
vacuum_rel(Oid relid, VacuumStmt *vacstmt, bool do_toast, bool for_wraparound)
980982
{
981983
LOCKMODE lmode;
982984
Relation onerel;
@@ -1013,8 +1015,8 @@ vacuum_rel(Oid relid, VacuumStmt *vacstmt, char expected_relkind,
10131015
* by autovacuum; it's used to avoid cancelling a vacuum that was
10141016
* invoked in an emergency.
10151017
*
1016-
* Note: this flag remains set until CommitTransaction or
1017-
* AbortTransaction. We don't want to clear it until we reset
1018+
* Note: these flags remain set until CommitTransaction or
1019+
* AbortTransaction. We don't want to clear them until we reset
10181020
* MyProc->xid/xmin, else OldestXmin might appear to go backwards,
10191021
* which is probably Not Good.
10201022
*/
@@ -1087,10 +1089,11 @@ vacuum_rel(Oid relid, VacuumStmt *vacstmt, char expected_relkind,
10871089
}
10881090

10891091
/*
1090-
* Check that it's a plain table; we used to do this in get_rel_oids() but
1091-
* seems safer to check after we've locked the relation.
1092+
* Check that it's a vacuumable table; we used to do this in get_rel_oids()
1093+
* but seems safer to check after we've locked the relation.
10921094
*/
1093-
if (onerel->rd_rel->relkind != expected_relkind)
1095+
if (onerel->rd_rel->relkind != RELKIND_RELATION &&
1096+
onerel->rd_rel->relkind != RELKIND_TOASTVALUE)
10941097
{
10951098
ereport(WARNING,
10961099
(errmsg("skipping \"%s\" --- cannot vacuum indexes, views, or special system tables",
@@ -1132,9 +1135,13 @@ vacuum_rel(Oid relid, VacuumStmt *vacstmt, char expected_relkind,
11321135
LockRelationIdForSession(&onerelid, lmode);
11331136

11341137
/*
1135-
* Remember the relation's TOAST relation for later
1138+
* Remember the relation's TOAST relation for later, if the caller asked
1139+
* us to process it.
11361140
*/
1137-
toast_relid = onerel->rd_rel->reltoastrelid;
1141+
if (do_toast)
1142+
toast_relid = onerel->rd_rel->reltoastrelid;
1143+
else
1144+
toast_relid = InvalidOid;
11381145

11391146
/*
11401147
* Switch to the table owner's userid, so that any index functions are
@@ -1173,7 +1180,7 @@ vacuum_rel(Oid relid, VacuumStmt *vacstmt, char expected_relkind,
11731180
* totally unimportant for toast relations.
11741181
*/
11751182
if (toast_relid != InvalidOid)
1176-
vacuum_rel(toast_relid, vacstmt, RELKIND_TOASTVALUE, for_wraparound);
1183+
vacuum_rel(toast_relid, vacstmt, false, for_wraparound);
11771184

11781185
/*
11791186
* Now release the session-level lock on the master table.

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy