Re: elog(DEBUG2 in SpinLocked section.

Поиск
Список
Период
Сортировка
От Tom Lane
Тема Re: elog(DEBUG2 in SpinLocked section.
Дата
Msg-id 972559.1591162071@sss.pgh.pa.us
обсуждение исходный текст
Ответ на Re: elog(DEBUG2 in SpinLocked section.  (Tom Lane <tgl@sss.pgh.pa.us>)
Ответы Re: elog(DEBUG2 in SpinLocked section.  (Michael Paquier <michael@paquier.xyz>)
Re: elog(DEBUG2 in SpinLocked section.  (Tom Lane <tgl@sss.pgh.pa.us>)
Список pgsql-hackers
I wrote:
> Ugh, that is just horrid.  I experimented with the attached patch
> but it did not find any other problems.

It occurred to me to add NotHoldingSpinLock() into palloc and
friends, and look what I found in copy_replication_slot:

            SpinLockAcquire(&s->mutex);
            src_islogical = SlotIsLogical(s);
            src_restart_lsn = s->data.restart_lsn;
            temporary = s->data.persistency == RS_TEMPORARY;
            plugin = logical_slot ? pstrdup(NameStr(s->data.plugin)) : NULL;
            SpinLockRelease(&s->mutex);

That is not gonna do, of course.  And there is another pstrdup
inside another spinlock section a bit further down in the same
function.  Also, pg_get_replication_slots has a couple of
namecpy() calls inside a spinlock, which is maybe less dangerous
than palloc() but it's still willful disregard of the project coding
rule about "only straight-line code inside a spinlock".

I'm inclined to think that memcpy'ing the ReplicationSlot struct
into a local variable might be the best way, replacing all the
piecemeal copying these stanzas are doing right now.  memcpy() of
a fixed amount of data isn't quite straight-line code perhaps,
but it has a well-defined runtime and zero chance of throwing an
error, which are the two properties we should be most urgently
concerned about.

            regards, tom lane



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

Предыдущее
От: Michael Paquier
Дата:
Сообщение: Re: OpenSSL 3.0.0 compatibility
Следующее
От: Michael Paquier
Дата:
Сообщение: Re: elog(DEBUG2 in SpinLocked section.