diff options
Diffstat (limited to 'src/backend/commands')
-rw-r--r-- | src/backend/commands/cluster.c | 13 | ||||
-rw-r--r-- | src/backend/commands/sequence.c | 45 | ||||
-rw-r--r-- | src/backend/commands/tablecmds.c | 7 | ||||
-rw-r--r-- | src/backend/commands/trigger.c | 14 | ||||
-rw-r--r-- | src/backend/commands/typecmds.c | 4 | ||||
-rw-r--r-- | src/backend/commands/vacuum.c | 17 | ||||
-rw-r--r-- | src/backend/commands/vacuumlazy.c | 38 |
7 files changed, 51 insertions, 87 deletions
diff --git a/src/backend/commands/cluster.c b/src/backend/commands/cluster.c index e16afa0559d..f0cbaefd60e 100644 --- a/src/backend/commands/cluster.c +++ b/src/backend/commands/cluster.c @@ -11,7 +11,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/commands/cluster.c,v 1.151 2006/07/31 01:16:37 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/commands/cluster.c,v 1.152 2006/07/31 20:09:00 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -314,8 +314,7 @@ check_index_is_clusterable(Relation OldHeap, Oid indexOid, bool recheck) { Relation OldIndex; - OldIndex = index_open(indexOid); - LockRelation(OldIndex, AccessExclusiveLock); + OldIndex = index_open(indexOid, AccessExclusiveLock); /* * Check that index is in fact an index on the given relation @@ -406,7 +405,7 @@ check_index_is_clusterable(Relation OldHeap, Oid indexOid, bool recheck) errmsg("cannot cluster temporary tables of other sessions"))); /* Drop relcache refcnt on OldIndex, but keep lock */ - index_close(OldIndex); + index_close(OldIndex, NoLock); } /* @@ -649,7 +648,7 @@ copy_heap_data(Oid OIDNewHeap, Oid OIDOldHeap, Oid OIDOldIndex) */ NewHeap = heap_open(OIDNewHeap, AccessExclusiveLock); OldHeap = heap_open(OIDOldHeap, AccessExclusiveLock); - OldIndex = index_open(OIDOldIndex); + OldIndex = index_open(OIDOldIndex, AccessExclusiveLock); /* * Their tuple descriptors should be exactly alike, but here we only need @@ -669,7 +668,7 @@ copy_heap_data(Oid OIDNewHeap, Oid OIDOldHeap, Oid OIDOldIndex) * Scan through the OldHeap on the OldIndex and copy each tuple into the * NewHeap. */ - scan = index_beginscan(OldHeap, OldIndex, true, + scan = index_beginscan(OldHeap, OldIndex, SnapshotNow, 0, (ScanKey) NULL); while ((tuple = index_getnext(scan, ForwardScanDirection)) != NULL) @@ -724,7 +723,7 @@ copy_heap_data(Oid OIDNewHeap, Oid OIDOldHeap, Oid OIDOldIndex) pfree(values); pfree(nulls); - index_close(OldIndex); + index_close(OldIndex, NoLock); heap_close(OldHeap, NoLock); heap_close(NewHeap, NoLock); } diff --git a/src/backend/commands/sequence.c b/src/backend/commands/sequence.c index a3b35a640ea..6154a4ed3da 100644 --- a/src/backend/commands/sequence.c +++ b/src/backend/commands/sequence.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/commands/sequence.c,v 1.137 2006/07/14 14:52:18 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/commands/sequence.c,v 1.138 2006/07/31 20:09:00 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -79,7 +79,7 @@ static SeqTable seqtab = NULL; /* Head of list of SeqTable items */ static SeqTableData *last_used_seq = NULL; static int64 nextval_internal(Oid relid); -static void acquire_share_lock(Relation seqrel, SeqTable seq); +static Relation open_share_lock(SeqTable seq); static void init_sequence(Oid relid, SeqTable *p_elm, Relation *p_rel); static Form_pg_sequence read_info(SeqTable elm, Relation rel, Buffer *buf); static void init_params(List *options, Form_pg_sequence new, bool isInit); @@ -650,8 +650,7 @@ lastval(PG_FUNCTION_ARGS) (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), errmsg("lastval is not yet defined in this session"))); - seqrel = relation_open(last_used_seq->relid, NoLock); - acquire_share_lock(seqrel, last_used_seq); + seqrel = open_share_lock(last_used_seq); /* nextval() must have already been called for this sequence */ Assert(last_used_seq->increment != 0); @@ -802,16 +801,19 @@ setval3_oid(PG_FUNCTION_ARGS) /* + * Open the sequence and acquire AccessShareLock if needed + * * If we haven't touched the sequence already in this transaction, * we need to acquire AccessShareLock. We arrange for the lock to * be owned by the top transaction, so that we don't need to do it * more than once per xact. */ -static void -acquire_share_lock(Relation seqrel, SeqTable seq) +static Relation +open_share_lock(SeqTable seq) { TransactionId thisxid = GetTopTransactionId(); + /* Get the lock if not already held in this xact */ if (seq->xid != thisxid) { ResourceOwner currentOwner; @@ -820,7 +822,7 @@ acquire_share_lock(Relation seqrel, SeqTable seq) PG_TRY(); { CurrentResourceOwner = TopTransactionResourceOwner; - LockRelation(seqrel, AccessShareLock); + LockRelationOid(seq->relid, AccessShareLock); } PG_CATCH(); { @@ -831,9 +833,12 @@ acquire_share_lock(Relation seqrel, SeqTable seq) PG_END_TRY(); CurrentResourceOwner = currentOwner; - /* Flag that we have a lock in the current xact. */ + /* Flag that we have a lock in the current xact */ seq->xid = thisxid; } + + /* We now know we have AccessShareLock, and can safely open the rel */ + return relation_open(seq->relid, NoLock); } /* @@ -843,19 +848,8 @@ acquire_share_lock(Relation seqrel, SeqTable seq) static void init_sequence(Oid relid, SeqTable *p_elm, Relation *p_rel) { + SeqTable elm; Relation seqrel; - volatile SeqTable elm; - - /* - * Open the sequence relation. - */ - seqrel = relation_open(relid, NoLock); - - if (seqrel->rd_rel->relkind != RELKIND_SEQUENCE) - ereport(ERROR, - (errcode(ERRCODE_WRONG_OBJECT_TYPE), - errmsg("\"%s\" is not a sequence", - RelationGetRelationName(seqrel)))); /* Look to see if we already have a seqtable entry for relation */ for (elm = seqtab; elm != NULL; elm = elm->next) @@ -890,7 +884,16 @@ init_sequence(Oid relid, SeqTable *p_elm, Relation *p_rel) seqtab = elm; } - acquire_share_lock(seqrel, elm); + /* + * Open the sequence relation. + */ + seqrel = open_share_lock(elm); + + if (seqrel->rd_rel->relkind != RELKIND_SEQUENCE) + ereport(ERROR, + (errcode(ERRCODE_WRONG_OBJECT_TYPE), + errmsg("\"%s\" is not a sequence", + RelationGetRelationName(seqrel)))); *p_elm = elm; *p_rel = seqrel; diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c index 53382ff3d47..3b408b411a6 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.197 2006/07/31 01:16:37 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/commands/tablecmds.c,v 1.198 2006/07/31 20:09:00 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -5863,7 +5863,10 @@ ATExecSetTableSpace(Oid tableOid, Oid newTableSpace) HeapTuple tuple; Form_pg_class rd_rel; - rel = relation_open(tableOid, NoLock); + /* + * Need lock here in case we are recursing to toast table or index + */ + rel = relation_open(tableOid, AccessExclusiveLock); /* * We can never allow moving of shared or nailed-in-cache relations, diff --git a/src/backend/commands/trigger.c b/src/backend/commands/trigger.c index 158e783c575..13e7cab721b 100644 --- a/src/backend/commands/trigger.c +++ b/src/backend/commands/trigger.c @@ -7,7 +7,7 @@ * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/commands/trigger.c,v 1.204 2006/07/14 14:52:18 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/commands/trigger.c,v 1.205 2006/07/31 20:09:00 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -36,7 +36,6 @@ #include "utils/inval.h" #include "utils/lsyscache.h" #include "utils/memutils.h" -#include "utils/relcache.h" #include "utils/syscache.h" @@ -2986,7 +2985,6 @@ AfterTriggerSetState(ConstraintsSetStmt *stmt) while (HeapTupleIsValid(htup = systable_getnext(tgscan))) { Form_pg_trigger pg_trigger = (Form_pg_trigger) GETSTRUCT(htup); - Relation constraintRel; Oid constraintNamespaceId; /* @@ -3010,13 +3008,9 @@ AfterTriggerSetState(ConstraintsSetStmt *stmt) pg_trigger->tgfoid == F_RI_FKEY_SETNULL_DEL || pg_trigger->tgfoid == F_RI_FKEY_SETDEFAULT_UPD || pg_trigger->tgfoid == F_RI_FKEY_SETDEFAULT_DEL) - { - constraintRel = RelationIdGetRelation(pg_trigger->tgconstrrelid); - } else { - constraintRel = RelationIdGetRelation(pg_trigger->tgrelid); - } - constraintNamespaceId = RelationGetNamespace(constraintRel); - RelationClose(constraintRel); + constraintNamespaceId = get_rel_namespace(pg_trigger->tgconstrrelid); + else + constraintNamespaceId = get_rel_namespace(pg_trigger->tgrelid); /* * If this constraint is not in the schema we're diff --git a/src/backend/commands/typecmds.c b/src/backend/commands/typecmds.c index 1304e686813..6dfa6296d5a 100644 --- a/src/backend/commands/typecmds.c +++ b/src/backend/commands/typecmds.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/commands/typecmds.c,v 1.95 2006/07/14 14:52:18 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/commands/typecmds.c,v 1.96 2006/07/31 20:09:00 tgl Exp $ * * DESCRIPTION * The "DefineFoo" routines take the parse tree and pick out the @@ -1625,6 +1625,8 @@ get_rels_with_domain(Oid domainOid, LOCKMODE lockmode) SysScanDesc depScan; HeapTuple depTup; + Assert(lockmode != NoLock); + /* * We scan pg_depend to find those things that depend on the domain. (We * assume we can ignore refobjsubid for a domain.) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index eb0fce72edb..c21be2f4788 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.336 2006/07/30 02:07:18 alvherre Exp $ + * $PostgreSQL: pgsql/src/backend/commands/vacuum.c,v 1.337 2006/07/31 20:09:00 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -1138,7 +1138,7 @@ vacuum_rel(Oid relid, VacuumStmt *vacstmt, char expected_relkind) * same process. */ onerelid = onerel->rd_lockInfo.lockRelId; - LockRelationForSession(&onerelid, onerel->rd_istemp, lmode); + LockRelationIdForSession(&onerelid, lmode); /* * Remember the relation's TOAST relation for later @@ -1175,7 +1175,7 @@ vacuum_rel(Oid relid, VacuumStmt *vacstmt, char expected_relkind) /* * Now release the session-level lock on the master table. */ - UnlockRelationForSession(&onerelid, lmode); + UnlockRelationIdForSession(&onerelid, lmode); return; } @@ -3476,6 +3476,8 @@ vac_open_indexes(Relation relation, LOCKMODE lockmode, ListCell *indexoidscan; int i; + Assert(lockmode != NoLock); + indexoidlist = RelationGetIndexList(relation); *nindexes = list_length(indexoidlist); @@ -3489,11 +3491,8 @@ vac_open_indexes(Relation relation, LOCKMODE lockmode, foreach(indexoidscan, indexoidlist) { Oid indexoid = lfirst_oid(indexoidscan); - Relation ind; - ind = index_open(indexoid); - (*Irel)[i++] = ind; - LockRelation(ind, lockmode); + (*Irel)[i++] = index_open(indexoid, lockmode); } list_free(indexoidlist); @@ -3513,9 +3512,7 @@ vac_close_indexes(int nindexes, Relation *Irel, LOCKMODE lockmode) { Relation ind = Irel[nindexes]; - if (lockmode != NoLock) - UnlockRelation(ind, lockmode); - index_close(ind); + index_close(ind, lockmode); } pfree(Irel); } diff --git a/src/backend/commands/vacuumlazy.c b/src/backend/commands/vacuumlazy.c index d2727c4a470..2202e7b7e9a 100644 --- a/src/backend/commands/vacuumlazy.c +++ b/src/backend/commands/vacuumlazy.c @@ -31,7 +31,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/commands/vacuumlazy.c,v 1.75 2006/07/14 14:52:18 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/commands/vacuumlazy.c,v 1.76 2006/07/31 20:09:00 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -164,7 +164,7 @@ lazy_vacuum_rel(Relation onerel, VacuumStmt *vacstmt) vacrelstats->minxid = RecentXmin; /* Open all indexes of the relation */ - vac_open_indexes(onerel, ShareUpdateExclusiveLock, &nindexes, &Irel); + vac_open_indexes(onerel, RowExclusiveLock, &nindexes, &Irel); hasindex = (nindexes > 0); /* Do the vacuuming */ @@ -621,15 +621,6 @@ lazy_vacuum_index(Relation indrel, pg_rusage_init(&ru0); - /* - * Acquire appropriate type of lock on index: must be exclusive if index - * AM isn't concurrent-safe. - */ - if (indrel->rd_am->amconcurrent) - LockRelation(indrel, RowExclusiveLock); - else - LockRelation(indrel, AccessExclusiveLock); - ivinfo.index = indrel; ivinfo.vacuum_full = false; ivinfo.message_level = elevel; @@ -640,14 +631,6 @@ lazy_vacuum_index(Relation indrel, *stats = index_bulk_delete(&ivinfo, *stats, lazy_tid_reaped, (void *) vacrelstats); - /* - * Release lock acquired above. - */ - if (indrel->rd_am->amconcurrent) - UnlockRelation(indrel, RowExclusiveLock); - else - UnlockRelation(indrel, AccessExclusiveLock); - ereport(elevel, (errmsg("scanned index \"%s\" to remove %d row versions", RelationGetRelationName(indrel), @@ -668,15 +651,6 @@ lazy_cleanup_index(Relation indrel, pg_rusage_init(&ru0); - /* - * Acquire appropriate type of lock on index: must be exclusive if index - * AM isn't concurrent-safe. - */ - if (indrel->rd_am->amconcurrent) - LockRelation(indrel, RowExclusiveLock); - else - LockRelation(indrel, AccessExclusiveLock); - ivinfo.index = indrel; ivinfo.vacuum_full = false; ivinfo.message_level = elevel; @@ -684,14 +658,6 @@ lazy_cleanup_index(Relation indrel, stats = index_vacuum_cleanup(&ivinfo, stats); - /* - * Release lock acquired above. - */ - if (indrel->rd_am->amconcurrent) - UnlockRelation(indrel, RowExclusiveLock); - else - UnlockRelation(indrel, AccessExclusiveLock); - if (!stats) return; |