Re: Failures in constraints regression test, "read only 0 of 8192 bytes"

From: Heikki Linnakangas <hlinnaka(at)iki(dot)fi>
To: Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>
Cc: Alexander Lakhin <exclusion(at)gmail(dot)com>, Thomas Munro <thomas(dot)munro(at)gmail(dot)com>, Tomas Vondra <tomas(dot)vondra(at)enterprisedb(dot)com>, Ronan Dunklau <ronan(dot)dunklau(at)aiven(dot)io>, PostgreSQL Hackers <pgsql-hackers(at)lists(dot)postgresql(dot)org>
Subject: Re: Failures in constraints regression test, "read only 0 of 8192 bytes"
Date: 2024-06-20 23:25:02
Message-ID: 7760b901-ef21-4d4f-a404-23fd0ffe48d0@iki.fi
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

On 21/06/2024 02:12, Tom Lane wrote:
> Heikki Linnakangas <hlinnaka(at)iki(dot)fi> writes:
>> In commit af0e7deb4a, I removed the call to RelationCloseSmgr() from
>> RelationCacheInvalidate(). I thought it was no longer needed, because we
>> no longer free the underlying SmgrRelation.
>
>> However, it meant that if the relfilenode of the relation was changed,
>> the relation keeps pointing to the SMgrRelation of the old relfilenode.
>> So we still need the RelationCloseSmgr() call, in case the relfilenode
>> has changed.
>
> Ouch. How come we did not see this immediately in testing? I'd have
> thought surely such a bug would be exposed by any command that
> rewrites a heap.

There is a RelationCloseSmgr() call in RelationClearRelation(), which
covers the common cases. This only occurs during
RelationCacheInvalidate(), when pg_class's relfilenumber was changed.

Hmm, looking closer, I think this might be a more appropriate place for
the RelationCloseSmgr() call:

> /*
> * If it's a mapped relation, immediately update its rd_locator in
> * case its relfilenumber changed. We must do this during phase 1
> * in case the relation is consulted during rebuild of other
> * relcache entries in phase 2. It's safe since consulting the
> * map doesn't involve any access to relcache entries.
> */
> if (RelationIsMapped(relation))
> RelationInitPhysicalAddr(relation);

That's where we change the relfilenumber, before the
RelationClearRelation() call.

--
Heikki Linnakangas
Neon (https://neon.tech)

In response to

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message Jacob Champion 2024-06-20 23:32:45 Re: Direct SSL connection and ALPN loose ends
Previous Message Michael Paquier 2024-06-20 23:13:15 Re: Pluggable cumulative statistics