Re: LogwrtResult contended spinlock
| От | Alvaro Herrera |
|---|---|
| Тема | Re: LogwrtResult contended spinlock |
| Дата | |
| Msg-id | 20200903183452.GA10634@alvherre.pgsql обсуждение исходный текст |
| Ответ на | Re: LogwrtResult contended spinlock (Andres Freund <andres@anarazel.de>) |
| Ответы |
Re: LogwrtResult contended spinlock
|
| Список | pgsql-hackers |
Looking at patterns like this
if (XLogCtl->LogwrtRqst.Write < EndPos)
XLogCtl->LogwrtRqst.Write = EndPos;
It seems possible to implement with
do {
XLogRecPtr currwrite;
currwrite = pg_atomic_read_u64(LogwrtRqst.Write);
if (currwrite > EndPos)
break; // already done by somebody else
if (pg_atomic_compare_exchange_u64(LogwrtRqst.Write,
currwrite, EndPos))
break; // successfully updated
} while (true);
This assumes that LogwrtRqst.Write never goes backwards, so it doesn't
seem good material for a general routine.
This *seems* correct to me, though this is muddy territory to me. Also,
are there better ways to go about this?
--
Álvaro Herrera https://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services
В списке pgsql-hackers по дате отправления: