Re: try_relation_open and relation_open behave different.

2021-10-18 Thread Alvaro Herrera
On 2021-Oct-18, Xing GUO wrote:

> However, I can open an "uncommitted" relation using relation_open() and
> cannot open it using try_relation_open().
> Since Postgres doesn't write the "uncommitted" relation descriptor to
> SysCache and try_relation_open() checks if the
> relation exists in SysCache while relation_open() doesn't check it.

Hmm, is it sufficient to do CommandCounterIncrement() after your
"uncommitted" relation change and the place where you do
try_relation_open()?

-- 
Álvaro Herrera  Valdivia, Chile  —  https://www.EnterpriseDB.com/
"Linux transformó mi computadora, de una `máquina para hacer cosas',
en un aparato realmente entretenido, sobre el cual cada día aprendo
algo nuevo" (Jaime Salinas)




Re: try_relation_open and relation_open behave different.

2021-10-18 Thread Xing GUO
On Mon, Oct 18, 2021 at 2:45 PM Michael Paquier  wrote:

> On Mon, Oct 18, 2021 at 01:56:07PM +0800, Xing GUO wrote:
> > My question is, is it a deliberate design that makes try_relation_open
> and
> > relation_open different? Shall we mention it in the comment of
> > try_relation_open OR adding the checker to relation_open?
>
> I am not sure what you mean here, both functions are include comments
> to explain their differences, so..
>

The comments in try_relation_open says:

```
/* 
 * try_relation_open - open any relation by relation OID
 *
 * Same as relation_open, except return NULL instead of failing
 * if the relation does not exist.
 * 
 */
```

However, I can open an "uncommitted" relation using relation_open() and
cannot open it using try_relation_open().
Since Postgres doesn't write the "uncommitted" relation descriptor to
SysCache and try_relation_open() checks if the
relation exists in SysCache while relation_open() doesn't check it.


> --
> Michael
>


Re: try_relation_open and relation_open behave different.

2021-10-18 Thread Michael Paquier
On Mon, Oct 18, 2021 at 01:56:07PM +0800, Xing GUO wrote:
> My question is, is it a deliberate design that makes try_relation_open and
> relation_open different? Shall we mention it in the comment of
> try_relation_open OR adding the checker to relation_open?

I am not sure what you mean here, both functions are include comments
to explain their differences, so..
--
Michael


signature.asc
Description: PGP signature


try_relation_open and relation_open behave different.

2021-10-17 Thread Xing GUO
Hi hackers,

I'm writing an extension that employs `object_access_hook`. I want to
monitor the table creation event and record the mapping between `reloid`
and `relfilenode` during a transaction. Here's my code snippet,

```
static void
my_object_access_hook(ObjectAccessType access,
  Oid classId,
  Oid objectId,
  int subId, void *arg)
{
do_some_checks(access, classId, ...);
// open the relation using relation_open
rel = relation_open(objectId, AccessShareLock);

// record the reloid and relfilenode.
record(objectId, rel->rd_node);
relation_close(rel, AccessShareLock);
}
```

However, when I replace the relation_open with try_relation_open, the
relation cannot be opened. I've checked the source code, it looks that
try_relation_open has an additional checker which causes the relation_open
and try_relation_open behavior different:

```
Relation
try_relation_open(Oid relationId, LOCKMODE lockmode)
{
...
/*
 * Now that we have the lock, probe to see if the relation really exists
 * or not.
 */
if (!SearchSysCacheExists1(RELOID, ObjectIdGetDatum(relationId)))
{
/* Release useless lock */
if (lockmode != NoLock)
   UnlockRelationOid(relationId, lockmode);

return NULL;
}
...
}
```

See:
https://github.com/postgres/postgres/blob/c30f54ad732ca5c8762bb68bbe0f51de9137dd72/src/backend/access/common/relation.c#L47

My question is, is it a deliberate design that makes try_relation_open and
relation_open different? Shall we mention it in the comment of
try_relation_open OR adding the checker to relation_open?

Best Regards,
Xing