Another vacuum fix.

This commit is contained in:
Bruce Momjian 1998-08-20 15:16:59 +00:00
parent 09e125084a
commit 31309423c9
4 changed files with 46 additions and 21 deletions

View File

@ -7,7 +7,7 @@
* *
* *
* IDENTIFICATION * 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 * INTERFACE ROUTINES
@ -1308,6 +1308,7 @@ UpdateStats(Oid relid, long reltuples, bool hasindex)
Datum values[Natts_pg_class]; Datum values[Natts_pg_class];
char nulls[Natts_pg_class]; char nulls[Natts_pg_class];
char replace[Natts_pg_class]; char replace[Natts_pg_class];
HeapScanDesc pg_class_scan = NULL;
/* ---------------- /* ----------------
* This routine handles updates for both the heap and index relation * 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)) if (!RelationIsValid(pg_class))
elog(ERROR, "UpdateStats: could not open RELATION relation"); elog(ERROR, "UpdateStats: could not open RELATION relation");
tuple = SearchSysCacheTupleCopy(RELOID,
ObjectIdGetDatum(relid), if (!IsBootstrapProcessingMode())
0, 0, 0); {
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 (!HeapTupleIsValid(tuple))
{ {
if (IsBootstrapProcessingMode())
heap_endscan(pg_class_scan);
heap_close(pg_class); heap_close(pg_class);
elog(ERROR, "UpdateStats: cannot scan RELATION relation"); 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 * At bootstrap time, we don't need to worry about concurrency or
* visibility of changes, so we cheat. * visibility of changes, so we cheat.
*/ */
rd_rel = (Form_pg_class) GETSTRUCT(tuple); rd_rel = (Form_pg_class) GETSTRUCT(tuple);
rd_rel->relpages = relpages; rd_rel->relpages = relpages;
rd_rel->reltuples = reltuples; rd_rel->reltuples = reltuples;
rd_rel->relhasindex = hasindex; rd_rel->relhasindex = hasindex;
WriteBuffer(pg_class_scan->rs_cbuf);
} }
else else
{ {
@ -1402,14 +1422,18 @@ UpdateStats(Oid relid, long reltuples, bool hasindex)
values[Anum_pg_class_relhasindex - 1] = CharGetDatum(hasindex); values[Anum_pg_class_relhasindex - 1] = CharGetDatum(hasindex);
newtup = heap_modifytuple(tuple, pg_class, values, nulls, replace); 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); pfree(newtup);
CatalogOpenIndices(Num_pg_class_indices, Name_pg_class_indices, idescs); CatalogOpenIndices(Num_pg_class_indices, Name_pg_class_indices, idescs);
CatalogIndexInsert(idescs, Num_pg_class_indices, pg_class, newtup); CatalogIndexInsert(idescs, Num_pg_class_indices, pg_class, newtup);
CatalogCloseIndices(Num_pg_class_indices, idescs); CatalogCloseIndices(Num_pg_class_indices, idescs);
} }
pfree(tuple); if (!IsBootstrapProcessingMode())
pfree(tuple);
else
heap_endscan(pg_class_scan);
heap_close(pg_class); heap_close(pg_class);
heap_close(whichRel); heap_close(whichRel);
} }

View File

@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * 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); index_endscan(sd);
pfree(sd); pfree(sd);
return (tuple); return tuple;
} }
/* /*
@ -276,7 +276,7 @@ AttributeNameIndexScan(Relation heapRelation,
(bits16) 0x0, (bits16) 0x0,
(AttrNumber) 1, (AttrNumber) 1,
(RegProcedure)F_OIDEQ, (RegProcedure)F_OIDEQ,
Int32GetDatum(relid)); ObjectIdGetDatum(relid));
ScanKeyEntryInitialize(&skey[1], ScanKeyEntryInitialize(&skey[1],
(bits16) 0x0, (bits16) 0x0,
@ -456,7 +456,7 @@ ClassNameIndexScan(Relation heapRelation, char *relName)
(bits16) 0x0, (bits16) 0x0,
(AttrNumber) 1, (AttrNumber) 1,
(RegProcedure) F_NAMEEQ, (RegProcedure) F_NAMEEQ,
(Datum) relName); PointerGetDatum(relName));
idesc = index_openr(ClassNameIndex); idesc = index_openr(ClassNameIndex);
tuple = CatalogIndexFetchTuple(heapRelation, idesc, skey, 1); tuple = CatalogIndexFetchTuple(heapRelation, idesc, skey, 1);

View File

@ -7,7 +7,7 @@
* *
* *
* IDENTIFICATION * 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) 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\ \tIf not, you may remove the pg_vlock file in the pgsql/data/base/your_db\n\
\tdirectory"); \tdirectory");
} }
@ -2204,24 +2204,25 @@ static void
vc_mkindesc(Relation onerel, int nindices, Relation *Irel, IndDesc **Idesc) vc_mkindesc(Relation onerel, int nindices, Relation *Irel, IndDesc **Idesc)
{ {
IndDesc *idcur; IndDesc *idcur;
HeapTuple tuple; HeapTuple tuple, cachetuple;
AttrNumber *attnumP; AttrNumber *attnumP;
int natts; int natts;
int i; int i;
Buffer buffer; Buffer buffer;
*Idesc = (IndDesc *) palloc(nindices * sizeof(IndDesc)); *Idesc = (IndDesc *) palloc(nindices * sizeof(IndDesc));
for (i = 0, idcur = *Idesc; i < nindices; i++, idcur++) for (i = 0, idcur = *Idesc; i < nindices; i++, idcur++)
{ {
tuple = SearchSysCacheTuple(INDEXRELID, cachetuple = SearchSysCacheTupleCopy(INDEXRELID,
ObjectIdGetDatum(RelationGetRelid(Irel[i])), ObjectIdGetDatum(RelationGetRelid(Irel[i])),
0, 0, 0); 0, 0, 0);
Assert(tuple); Assert(tuple);
/* get the buffer cache 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); Assert(tuple);
pfree(cachetuple);
idcur->tform = (IndexTupleForm) GETSTRUCT(tuple); idcur->tform = (IndexTupleForm) GETSTRUCT(tuple);
for (attnumP = &(idcur->tform->indkey[0]), natts = 0; for (attnumP = &(idcur->tform->indkey[0]), natts = 0;

View File

@ -26,7 +26,7 @@
# #
# #
# IDENTIFICATION # 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" 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" [ "$debug" -ne 0 ] && echo "Running: postgres $BACKENDARGS template1"
cat $TEMPLATE \ cat $TEMPLATE \