From 31309423c9fa0a50afb138760def0897969f727f Mon Sep 17 00:00:00 2001 From: Bruce Momjian Date: Thu, 20 Aug 1998 15:16:59 +0000 Subject: [PATCH] Another vacuum fix. --- src/backend/catalog/index.c | 38 +++++++++++++++++++++++++++------- src/backend/catalog/indexing.c | 8 +++---- src/backend/commands/vacuum.c | 17 ++++++++------- src/bin/initdb/initdb.sh | 4 ++-- 4 files changed, 46 insertions(+), 21 deletions(-) diff --git a/src/backend/catalog/index.c b/src/backend/catalog/index.c index 05b7df7380..48a2cada29 100644 --- a/src/backend/catalog/index.c +++ b/src/backend/catalog/index.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/catalog/index.c,v 1.48 1998/08/19 02:01:32 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/catalog/index.c,v 1.49 1998/08/20 15:16:54 momjian Exp $ * * * INTERFACE ROUTINES @@ -1308,6 +1308,7 @@ UpdateStats(Oid relid, long reltuples, bool hasindex) Datum values[Natts_pg_class]; char nulls[Natts_pg_class]; char replace[Natts_pg_class]; + HeapScanDesc pg_class_scan = NULL; /* ---------------- * This routine handles updates for both the heap and index relation @@ -1340,11 +1341,30 @@ UpdateStats(Oid relid, long reltuples, bool hasindex) if (!RelationIsValid(pg_class)) elog(ERROR, "UpdateStats: could not open RELATION relation"); - tuple = SearchSysCacheTupleCopy(RELOID, - ObjectIdGetDatum(relid), - 0, 0, 0); + + if (!IsBootstrapProcessingMode()) + { + tuple = SearchSysCacheTupleCopy(RELOID, + ObjectIdGetDatum(relid), + 0, 0, 0); + } + else + { + ScanKeyData key[1]; + + ScanKeyEntryInitialize(&key[0], 0, + ObjectIdAttributeNumber, + F_OIDEQ, + ObjectIdGetDatum(relid)); + + pg_class_scan = heap_beginscan(pg_class, 0, SnapshotNow, 1, key); + tuple = heap_getnext(pg_class_scan, 0); + } + if (!HeapTupleIsValid(tuple)) { + if (IsBootstrapProcessingMode()) + heap_endscan(pg_class_scan); heap_close(pg_class); elog(ERROR, "UpdateStats: cannot scan RELATION relation"); } @@ -1385,11 +1405,11 @@ UpdateStats(Oid relid, long reltuples, bool hasindex) * At bootstrap time, we don't need to worry about concurrency or * visibility of changes, so we cheat. */ - rd_rel = (Form_pg_class) GETSTRUCT(tuple); rd_rel->relpages = relpages; rd_rel->reltuples = reltuples; rd_rel->relhasindex = hasindex; + WriteBuffer(pg_class_scan->rs_cbuf); } else { @@ -1402,14 +1422,18 @@ UpdateStats(Oid relid, long reltuples, bool hasindex) values[Anum_pg_class_relhasindex - 1] = CharGetDatum(hasindex); newtup = heap_modifytuple(tuple, pg_class, values, nulls, replace); - heap_replace(pg_class, &newtup->t_ctid, newtup); + heap_replace(pg_class, &tuple->t_ctid, newtup); pfree(newtup); CatalogOpenIndices(Num_pg_class_indices, Name_pg_class_indices, idescs); CatalogIndexInsert(idescs, Num_pg_class_indices, pg_class, newtup); CatalogCloseIndices(Num_pg_class_indices, idescs); } - pfree(tuple); + if (!IsBootstrapProcessingMode()) + pfree(tuple); + else + heap_endscan(pg_class_scan); + heap_close(pg_class); heap_close(whichRel); } diff --git a/src/backend/catalog/indexing.c b/src/backend/catalog/indexing.c index 5a4ab5ff03..8b50cee327 100644 --- a/src/backend/catalog/indexing.c +++ b/src/backend/catalog/indexing.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/catalog/indexing.c,v 1.20 1998/08/19 02:01:33 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/catalog/indexing.c,v 1.21 1998/08/20 15:16:55 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -254,7 +254,7 @@ CatalogIndexFetchTuple(Relation heapRelation, index_endscan(sd); pfree(sd); - return (tuple); + return tuple; } /* @@ -276,7 +276,7 @@ AttributeNameIndexScan(Relation heapRelation, (bits16) 0x0, (AttrNumber) 1, (RegProcedure)F_OIDEQ, - Int32GetDatum(relid)); + ObjectIdGetDatum(relid)); ScanKeyEntryInitialize(&skey[1], (bits16) 0x0, @@ -456,7 +456,7 @@ ClassNameIndexScan(Relation heapRelation, char *relName) (bits16) 0x0, (AttrNumber) 1, (RegProcedure) F_NAMEEQ, - (Datum) relName); + PointerGetDatum(relName)); idesc = index_openr(ClassNameIndex); tuple = CatalogIndexFetchTuple(heapRelation, idesc, skey, 1); diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index e4d215d452..6448d2e830 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/commands/vacuum.c,v 1.74 1998/08/19 23:48:21 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/commands/vacuum.c,v 1.75 1998/08/20 15:16:57 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -188,7 +188,7 @@ vc_init() if ((fd = open("pg_vlock", O_CREAT | O_EXCL, 0600)) < 0) { - elog(ERROR, "Can't create lock file -- another vacuum cleaner running?\n\ + elog(ERROR, "Can't create lock file. Is another vacuum cleaner running?\n\ \tIf not, you may remove the pg_vlock file in the pgsql/data/base/your_db\n\ \tdirectory"); } @@ -2204,24 +2204,25 @@ static void vc_mkindesc(Relation onerel, int nindices, Relation *Irel, IndDesc **Idesc) { IndDesc *idcur; - HeapTuple tuple; + HeapTuple tuple, cachetuple; AttrNumber *attnumP; int natts; int i; Buffer buffer; - + *Idesc = (IndDesc *) palloc(nindices * sizeof(IndDesc)); for (i = 0, idcur = *Idesc; i < nindices; i++, idcur++) { - tuple = SearchSysCacheTuple(INDEXRELID, - ObjectIdGetDatum(RelationGetRelid(Irel[i])), - 0, 0, 0); + cachetuple = SearchSysCacheTupleCopy(INDEXRELID, + ObjectIdGetDatum(RelationGetRelid(Irel[i])), + 0, 0, 0); Assert(tuple); /* get the buffer cache tuple */ - tuple = heap_fetch(onerel, SnapshotNow, &tuple->t_ctid, &buffer); + tuple = heap_fetch(onerel, SnapshotNow, &cachetuple->t_ctid, &buffer); Assert(tuple); + pfree(cachetuple); idcur->tform = (IndexTupleForm) GETSTRUCT(tuple); for (attnumP = &(idcur->tform->indkey[0]), natts = 0; diff --git a/src/bin/initdb/initdb.sh b/src/bin/initdb/initdb.sh index f7a6536126..02077511aa 100644 --- a/src/bin/initdb/initdb.sh +++ b/src/bin/initdb/initdb.sh @@ -26,7 +26,7 @@ # # # IDENTIFICATION -# $Header: /cvsroot/pgsql/src/bin/initdb/Attic/initdb.sh,v 1.48 1998/08/19 23:48:23 momjian Exp $ +# $Header: /cvsroot/pgsql/src/bin/initdb/Attic/initdb.sh,v 1.49 1998/08/20 15:16:59 momjian Exp $ # #------------------------------------------------------------------------- @@ -316,7 +316,7 @@ fi BACKENDARGS="-boot -C -F -D$PGDATA $BACKEND_TALK_ARG" -echo "$CMDNAME: creating template database in $PGDATA/base/template1" +echo "Creating template database in $PGDATA/base/template1" [ "$debug" -ne 0 ] && echo "Running: postgres $BACKENDARGS template1" cat $TEMPLATE \