Re: How to accurately determine when a relation should use local buffers?

Поиск
Список
Период
Сортировка
От Vitaly Davydov
Тема Re: How to accurately determine when a relation should use local buffers?
Дата
Msg-id CAG5KqAaOLzbucPj84QbjO46-gJTbsiCihANn_bW8jAFjrJcHcQ@mail.gmail.com
обсуждение исходный текст
Ответ на Re: How to accurately determine when a relation should use local buffers?  (Aleksander Alekseev <aleksander@timescale.com>)
Ответы Re: How to accurately determine when a relation should use local buffers?  (Aleksander Alekseev <aleksander@timescale.com>)
Список pgsql-hackers

Hi Aleksander,

Thank you for the reply.

Could you please provide a specific example when the current code willdo something wrong/unintended?

I can't say that something is wrong in vanilla. But if you decide to replicate DDL in some solutions like multimaster, you might want to replicate CREATE TEMPORARY TABLE. Furthermore, there is some possible inconsistency in the code show below (REL_16_STABLE) in bufmgr.c file: 

  • FlushRelationBuffers, PrefetchBuffer uses RelationUsesLocalBuffers(rel).
  • ExtendBufferedRel_common finally use BufferManagerRelation.relpersistence which is actually rd_rel->relpersistence, works like RelationUsesLocalBuffers.
  • ReadBuffer_common uses isLocalBuf = SmgrIsTemp(smgr), that checks rlocator.backend for InvalidBackendId.

I would like to clarify, do we completely refuse the use of temporary tables in other contexts than in backends or there is some work-in-progress to allow some other usage contexts? If so, the check of rd_rel->relpersistence is enough. Not sure why we use SmgrIsTemp instead of RelationUsesLocalBuffers in ReadBuffer_common.


With best regards,

Vitaly Davydov


вт, 21 нояб. 2023 г. в 11:52, Aleksander Alekseev <aleksander@timescale.com>:
Hi,

> I would like to clarify, what the correct way is to determine that a given relation is using local buffers. Local buffers, as far as I know, are used for temporary tables in backends. There are two functions/macros (bufmgr.c): SmgrIsTemp, RelationUsesLocalBuffers. The first function verifies that the current process is a regular session backend, while the other macro verifies the relation persistence characteristic. It seems, the use of each function independently is not correct. I think, these functions should be applied in pair to check for local buffers use, but, it seems, these functions are used independently. It works until temporary tables are allowed only in session backends.

Could you please provide a specific example when the current code will
do something wrong/unintended?

> I'm concerned, how to determine the use of local buffers in some other theoretical cases? For example, if we decide to replicate temporary tables? Are there the other cases, when local buffers can be used with relations in the Vanilla? Do we allow the use of relations with RELPERSISTENCE_TEMP not only in session backends?

Temporary tables, by definition, are visible only within one session.
I can't imagine how and why they would be replicated.

--
Best regards,
Aleksander Alekseev


--
С уважением,
Давыдов Виталий
http://www.vdavydov.ru

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

Предыдущее
От: Aleksander Alekseev
Дата:
Сообщение: Re: Typo with amtype = 's' in opr_sanity.sql
Следующее
От: "Hayato Kuroda (Fujitsu)"
Дата:
Сообщение: RE: Random pg_upgrade test failure on drongo