diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2004-09-30 23:21:26 +0000 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2004-09-30 23:21:26 +0000 |
commit | d2af5f8a3e89f02dd54949fa42e2dcd31ddcd5c7 (patch) | |
tree | 122463e70e53c0fd7ae418dc8eb9057ffedae130 /src/backend/commands | |
parent | d6748843069f7dd4205cd85b60977b5414647635 (diff) | |
download | postgresql-d2af5f8a3e89f02dd54949fa42e2dcd31ddcd5c7.tar.gz postgresql-d2af5f8a3e89f02dd54949fa42e2dcd31ddcd5c7.zip |
Adjust index locking rules as per my proposal of earlier today. You
now are supposed to take some kind of lock on an index whenever you
are going to access the index contents, rather than relying only on a
lock on the parent table.
Diffstat (limited to 'src/backend/commands')
-rw-r--r-- | src/backend/commands/analyze.c | 8 | ||||
-rw-r--r-- | src/backend/commands/vacuum.c | 37 | ||||
-rw-r--r-- | src/backend/commands/vacuumlazy.c | 6 |
3 files changed, 34 insertions, 17 deletions
diff --git a/src/backend/commands/analyze.c b/src/backend/commands/analyze.c index ce7db272113..486e86d677c 100644 --- a/src/backend/commands/analyze.c +++ b/src/backend/commands/analyze.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/commands/analyze.c,v 1.76 2004/08/29 05:06:41 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/commands/analyze.c,v 1.77 2004/09/30 23:21:19 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -243,7 +243,7 @@ analyze_rel(Oid relid, VacuumStmt *vacstmt) * if there was an explicit column list in the ANALYZE command, * however. */ - vac_open_indexes(onerel, &nindexes, &Irel); + vac_open_indexes(onerel, AccessShareLock, &nindexes, &Irel); hasindex = (nindexes > 0); indexdata = NULL; analyzableindex = false; @@ -310,7 +310,7 @@ analyze_rel(Oid relid, VacuumStmt *vacstmt) */ if (attr_cnt <= 0 && !analyzableindex) { - vac_close_indexes(nindexes, Irel); + vac_close_indexes(nindexes, Irel, AccessShareLock); relation_close(onerel, AccessShareLock); return; } @@ -427,7 +427,7 @@ analyze_rel(Oid relid, VacuumStmt *vacstmt) } /* Done with indexes */ - vac_close_indexes(nindexes, Irel); + vac_close_indexes(nindexes, Irel, NoLock); /* * Close source relation now, but keep lock so that no one deletes it diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index ec39789f097..6e6b15f724b 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.291 2004/09/13 20:06:29 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/commands/vacuum.c,v 1.292 2004/09/30 23:21:19 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -1062,7 +1062,7 @@ full_vacuum_rel(Relation onerel, VacuumStmt *vacstmt) scan_heap(vacrelstats, onerel, &vacuum_pages, &fraged_pages); /* Now open all indexes of the relation */ - vac_open_indexes(onerel, &nindexes, &Irel); + vac_open_indexes(onerel, AccessExclusiveLock, &nindexes, &Irel); if (nindexes > 0) vacrelstats->hasindex = true; @@ -1088,11 +1088,11 @@ full_vacuum_rel(Relation onerel, VacuumStmt *vacstmt) /* Try to shrink heap */ repair_frag(vacrelstats, onerel, &vacuum_pages, &fraged_pages, nindexes, Irel); - vac_close_indexes(nindexes, Irel); + vac_close_indexes(nindexes, Irel, NoLock); } else { - vac_close_indexes(nindexes, Irel); + vac_close_indexes(nindexes, Irel, NoLock); if (vacuum_pages.num_pages > 0) { /* Clean pages from vacuum_pages list */ @@ -3210,8 +3210,14 @@ vac_cmp_vtlinks(const void *left, const void *right) } +/* + * Open all the indexes of the given relation, obtaining the specified kind + * of lock on each. Return an array of Relation pointers for the indexes + * into *Irel, and the number of indexes into *nindexes. + */ void -vac_open_indexes(Relation relation, int *nindexes, Relation **Irel) +vac_open_indexes(Relation relation, LOCKMODE lockmode, + int *nindexes, Relation **Irel) { List *indexoidlist; ListCell *indexoidscan; @@ -3230,23 +3236,34 @@ vac_open_indexes(Relation relation, int *nindexes, Relation **Irel) foreach(indexoidscan, indexoidlist) { Oid indexoid = lfirst_oid(indexoidscan); + Relation ind; - (*Irel)[i] = index_open(indexoid); - i++; + ind = index_open(indexoid); + (*Irel)[i++] = ind; + LockRelation(ind, lockmode); } list_free(indexoidlist); } - +/* + * Release the resources acquired by vac_open_indexes. Optionally release + * the locks (say NoLock to keep 'em). + */ void -vac_close_indexes(int nindexes, Relation *Irel) +vac_close_indexes(int nindexes, Relation *Irel, LOCKMODE lockmode) { if (Irel == NULL) return; while (nindexes--) - index_close(Irel[nindexes]); + { + Relation ind = Irel[nindexes]; + + if (lockmode != NoLock) + UnlockRelation(ind, lockmode); + index_close(ind); + } pfree(Irel); } diff --git a/src/backend/commands/vacuumlazy.c b/src/backend/commands/vacuumlazy.c index f19001d6796..ebdb27f336f 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.45 2004/08/29 05:06:41 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/commands/vacuumlazy.c,v 1.46 2004/09/30 23:21:19 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -145,14 +145,14 @@ lazy_vacuum_rel(Relation onerel, VacuumStmt *vacstmt) vacrelstats->threshold = GetAvgFSMRequestSize(&onerel->rd_node); /* Open all indexes of the relation */ - vac_open_indexes(onerel, &nindexes, &Irel); + vac_open_indexes(onerel, ShareUpdateExclusiveLock, &nindexes, &Irel); hasindex = (nindexes > 0); /* Do the vacuuming */ lazy_scan_heap(onerel, vacrelstats, Irel, nindexes); /* Done with indexes */ - vac_close_indexes(nindexes, Irel); + vac_close_indexes(nindexes, Irel, NoLock); /* * Optionally truncate the relation. |