Re: A few patches to clarify snapshot management, part 2

Поиск
Список
Период
Сортировка
От Heikki Linnakangas
Тема Re: A few patches to clarify snapshot management, part 2
Дата
Msg-id 93081db6-35c1-4b49-ae85-eced58c20d52@iki.fi
обсуждение исходный текст
Ответ на Re: A few patches to clarify snapshot management, part 2  (Álvaro Herrera <alvherre@kurilemu.de>)
Список pgsql-hackers
On 05/01/2026 19:01, Álvaro Herrera wrote:
> On 2025-Dec-22, Heikki Linnakangas wrote:
> 
>> @@ -146,7 +146,11 @@ find_inheritance_children_extended(Oid parentrelId, bool omit_detached,
>>                   Snapshot    snap;
>>   
>>                   xmin = HeapTupleHeaderGetXmin(inheritsTuple->t_data);
>> +
>> +                /* XXX: what should we do with a non-MVCC snapshot? */
>>                   snap = GetActiveSnapshot();
>> +                if (snap->snapshot_type != SNAPSHOT_MVCC)
>> +                    elog(ERROR, "cannot look up partition information with a non-MVCC snapshot");
>>   
>>                   if (!XidInMVCCSnapshot(xmin, snap))
>>                   {
> 
> I think this code should be skipped when a non-MVCC snapshot is in use.
> I assume you won't hit the case unless you test for it specifically, so
> I'm not surprised that just adding an elog(ERROR) does not cause visible
> failures; however in production it probably would.  And looking up
> partition info in that case is, most likely, useless.  So changing the
> 'if' test
>         if (!XidInMVCCSnapshot(xmin, snap))
> to only do this dance if "->snapshot_type == SNAPSHOT_MVCC" seems
> reasonable to me.

Yeah, I suppose the most reasonable behavior is to treat a non-MVCC 
snapshot the same as no active snapshot at all here. Although I'm not 
convinced that this is reachable in any sensible scenario (see below).

> I'm not sure what's a good way to verify this, however.  We would need a
> test that adds partitions pending detach to partitioned tables used by
> as many other tests as possible ...  (Maybe: have test_setup.sql add an
> event trigger that runs on CREATE TABLE, detects PARTITION BY, and
> creates and partially detaches a partition.  Not sure how feasible this
> is.)

None of the built-in code pushes a historic snapshot to the active 
stack, so that won't find anything. The only known instance of that is 
pglogical's row filters. Is it sane for a row filter, or other 
hypothetical expression that is executed during logical decoding, to 
access a partitioned table?

We don't allow marking a partitioned table as a "user catalog table":

postgres=# CREATE TABLE parttab (i int) PARTITION BY RANGE (i);
CREATE TABLE
postgres=# ALTER TABLE parttab SET (user_catalog_table = true);
ERROR:  cannot specify storage parameters for a partitioned table
HINT:  Specify storage parameters for its leaf partitions instead.

And it's not sane to access tables other than catalog tables with a 
historic snapshot. So I'm not sure this reachable in any sensible scenario.

- Heikki




В списке pgsql-hackers по дате отправления: