diff options
author | Alvaro Herrera <alvherre@alvh.no-ip.org> | 2007-05-16 17:28:20 +0000 |
---|---|---|
committer | Alvaro Herrera <alvherre@alvh.no-ip.org> | 2007-05-16 17:28:20 +0000 |
commit | 90cbc63fd10adaeb01c3180156e0e48eee08b5ed (patch) | |
tree | 07fc1b8f4efd7d6c4e469ea41a7f9f13b4a23ac9 | |
parent | dfed0012bc03c3cda94e75af54e9c774556c9787 (diff) | |
download | postgresql-90cbc63fd10adaeb01c3180156e0e48eee08b5ed.tar.gz postgresql-90cbc63fd10adaeb01c3180156e0e48eee08b5ed.zip |
Have TRUNCATE advance the affected table's relfrozenxid to RecentXmin, to
avoid a later needless VACUUM for Xid-wraparound purposes. We can do this
since the table is known to be left empty, so no Xid remains on it.
Per discussion.
-rw-r--r-- | src/backend/catalog/index.c | 14 | ||||
-rw-r--r-- | src/backend/commands/tablecmds.c | 6 | ||||
-rw-r--r-- | src/include/catalog/index.h | 4 |
3 files changed, 16 insertions, 8 deletions
diff --git a/src/backend/catalog/index.c b/src/backend/catalog/index.c index 377bc9f4f2c..bd3ae31b076 100644 --- a/src/backend/catalog/index.c +++ b/src/backend/catalog/index.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/catalog/index.c,v 1.282 2007/03/29 00:15:37 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/catalog/index.c,v 1.283 2007/05/16 17:28:20 alvherre Exp $ * * * INTERFACE ROUTINES @@ -1188,9 +1188,12 @@ index_update_stats(Relation rel, bool hasindex, bool isprimary, * setNewRelfilenode - assign a new relfilenode value to the relation * * Caller must already hold exclusive lock on the relation. + * + * The relation is marked with relfrozenxid=freezeXid (InvalidTransactionId + * must be passed for indexes) */ void -setNewRelfilenode(Relation relation) +setNewRelfilenode(Relation relation, TransactionId freezeXid) { Oid newrelfilenode; RelFileNode newrnode; @@ -1204,6 +1207,10 @@ setNewRelfilenode(Relation relation) relation->rd_rel->relkind == RELKIND_INDEX); /* Can't change for shared tables or indexes */ Assert(!relation->rd_rel->relisshared); + /* Indexes must have Invalid frozenxid; other relations must not */ + Assert((relation->rd_rel->relkind == RELKIND_INDEX && + freezeXid == InvalidTransactionId) || + TransactionIdIsNormal(freezeXid)); /* Allocate a new relfilenode */ newrelfilenode = GetNewRelFileNode(relation->rd_rel->reltablespace, @@ -1241,6 +1248,7 @@ setNewRelfilenode(Relation relation) rd_rel->relfilenode = newrelfilenode; rd_rel->relpages = 0; /* it's empty until further notice */ rd_rel->reltuples = 0; + rd_rel->relfrozenxid = freezeXid; simple_heap_update(pg_class, &tuple->t_self, tuple); CatalogUpdateIndexes(pg_class, tuple); @@ -1957,7 +1965,7 @@ reindex_index(Oid indexId) /* * We'll build a new physical relation for the index. */ - setNewRelfilenode(iRel); + setNewRelfilenode(iRel, InvalidTransactionId); } /* Initialize the index and rebuild */ diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c index d7ad90d0217..cdfbc6f0829 100644 --- a/src/backend/commands/tablecmds.c +++ b/src/backend/commands/tablecmds.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/commands/tablecmds.c,v 1.223 2007/05/14 20:24:41 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/commands/tablecmds.c,v 1.224 2007/05/16 17:28:20 alvherre Exp $ * *------------------------------------------------------------------------- */ @@ -616,7 +616,7 @@ ExecuteTruncate(TruncateStmt *stmt) * the relfilenode value. The old storage file is scheduled for * deletion at commit. */ - setNewRelfilenode(rel); + setNewRelfilenode(rel, RecentXmin); heap_relid = RelationGetRelid(rel); toast_relid = rel->rd_rel->reltoastrelid; @@ -629,7 +629,7 @@ ExecuteTruncate(TruncateStmt *stmt) if (OidIsValid(toast_relid)) { rel = relation_open(toast_relid, AccessExclusiveLock); - setNewRelfilenode(rel); + setNewRelfilenode(rel, RecentXmin); heap_close(rel, NoLock); } diff --git a/src/include/catalog/index.h b/src/include/catalog/index.h index 32c704b71e6..7240ad600c3 100644 --- a/src/include/catalog/index.h +++ b/src/include/catalog/index.h @@ -7,7 +7,7 @@ * Portions Copyright (c) 1996-2007, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $PostgreSQL: pgsql/src/include/catalog/index.h,v 1.73 2007/01/09 02:14:15 tgl Exp $ + * $PostgreSQL: pgsql/src/include/catalog/index.h,v 1.74 2007/05/16 17:28:20 alvherre Exp $ * *------------------------------------------------------------------------- */ @@ -53,7 +53,7 @@ extern void FormIndexDatum(IndexInfo *indexInfo, Datum *values, bool *isnull); -extern void setNewRelfilenode(Relation relation); +extern void setNewRelfilenode(Relation relation, TransactionId freezeXid); extern void index_build(Relation heapRelation, Relation indexRelation, |