RE: [HACKERS] double opens

From: "Hiroshi Inoue" <Inoue(at)tpf(dot)co(dot)jp>
To: "Bruce Momjian" <maillist(at)candle(dot)pha(dot)pa(dot)us>
Cc: "pgsql-hackers" <pgsql-hackers(at)postgreSQL(dot)org>
Subject: RE: [HACKERS] double opens
Date: 1999-07-29 08:29:38
Message-ID: 001201bed99c$7f466d00$2801007e@cadzone.tpf.co.jp
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

>
> [Charset iso-8859-1 unsupported, filtering to ASCII...]
> > Hi all,
> >
> > There is a TODO item
> > * Overhaul mdmgr/smgr to fix double unlinking and double opens, cleanup
> >
> > In Windows-NT,we could see the following error reported by
> > yutaka tanida [yutaka(at)marin(dot)or(dot)jp](dot)
> >
> > > version
> > > ------------------------------------------------------------
> > > PostgreSQL 6.5.1 on i686-pc-cygwin, compiled by gcc gcc-2.95
> > > (1 row)
> > >
> > > template1=> create table table1 ( i int,j int);
> > > CREATE
> > > template1=> create view view1 as select * from table1;
> > > CREATE
> > > template1=> drop view view1;
> > > DROP
> > > template1=> create view view1 as select * from table1;
> > > ERROR: cannot create view1
> >
> > "drop view" couldn't unlink the base file of target view because
> > it is doubly opened and so "create view" coundn't create the view.
> >

[snip]

> >
> > *** utils/cache/relcache.c.orig Wed May 26 16:05:38 1999
> > --- utils/cache/relcache.c Wed Jul 28 13:23:49 1999
> > ***************
> > *** 1282,1287 ****
> > --- 1282,1288 ----
> > oldcxt = MemoryContextSwitchTo((MemoryContext) CacheCxt);
> >
> > RelationCacheDelete(relation);
> > + smgrclose(DEFAULT_SMGR, relation);
> >
> > FreeTupleDesc(relation->rd_att);
> > SystemCacheRelationFlushed(RelationGetRelid(relation));
> >
> >
> >
>
> Basically, I thought the close was done already in the drop table code.
> Is it strange to do the close inside the cache? The cache does the
> opens, right?
>

No,relcache stuff doesn't do the opens.

First,my patch is not only for "drop view" case.
It's for cases such that
A backend registers an information to invalidate a relcache
entry and another backend removes the relcache entry trig-
gered by the information.

"drop view" plays both of the part alone and doubly opens
as follows.

RemoveView()
RemoveRewriteRule()
prs2_deleteFromRelation()
heap_open(relid of view) ---- opens a new file descriptor
for the base file of the view
setRelhasrulesInRelations()
heap_replace(tuple of "pg_class") ---- registers an informat-
ion to invalidate the view's
relcache entry.
heap_close() ---- doesn't close the file descriptor
CommandCounterIncrement()
.................
RelationFlushRelation() --- removes the relcache entry
of the view
heap_destroy_with_catalog()
heap_openr(viewName) --- opens another file descriptor
for the same view because
heap_openr() couldn't find the
relcache entry

Regards.

Hiroshi Inoue
Inoue(at)tpf(dot)co(dot)jp

In response to

Browse pgsql-hackers by date

  From Date Subject
Next Message Oleg Bartunov 1999-07-29 08:40:56 vacuum analyze and index file
Previous Message Hannu Krosing 1999-07-29 06:04:12 Re: [HACKERS] pg_dump not dumping all tables