CompactCheckpointerRequestQueue versus pad bytes

Поиск
Список
Период
Сортировка
От Tom Lane
Тема CompactCheckpointerRequestQueue versus pad bytes
Дата
Msg-id 23130.1342388184@sss.pgh.pa.us
обсуждение исходный текст
Ответы Re: CompactCheckpointerRequestQueue versus pad bytes  (Amit Kapila <amit.kapila@huawei.com>)
Re: CompactCheckpointerRequestQueue versus pad bytes  (Robert Haas <robertmhaas@gmail.com>)
Список pgsql-hackers
CompactCheckpointerRequestQueue supposes that it can use an entry of the
checkpointer request queue directly as a hash table key.  This will work
reliably only if there are no pad bytes in the CheckpointerRequest
struct, which means in turn that neither RelFileNodeBackend nor
RelFileNode can contain any pad bytes.

It might have accidentally failed to fail if tested on a compiler that
gives a full 32 bits to enum ForkNumber, but there absolutely would be
padding there if ForkNumber is allocated as short or char.

As best I can tell, a failure from uninitialized padding would not cause
visible misbehavior but only make it not notice that two requests are
identical, so that the queue compaction would not accomplish as much as
it should.  Nonetheless, this seems pretty broken.

We could fairly cheaply dodge the problem with padding after ForkNumber
if we were to zero out the whole request array at shmem initialization,
so that any such pad bytes are guaranteed zero.  However, padding in
RelFileNodeBackend would be more annoying to deal with, and at least
in the current instantiation of those structs it's probably impossible
anyway.  Should we document those structs as required to not contain
any padding, or do what's needful in checkpointer.c to not depend on
there not being padding?
        regards, tom lane


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

Предыдущее
От: Andrew Dunstan
Дата:
Сообщение: Re: isolation check takes a long time
Следующее
От: Tom Lane
Дата:
Сообщение: Re: [PERFORM] DELETE vs TRUNCATE explanation