Re: Atomic ops for unlogged LSN

Поиск
Список
Период
Сортировка
От Bharath Rupireddy
Тема Re: Atomic ops for unlogged LSN
Дата
Msg-id CALj2ACXRE1L3f4caGHOrm91TgLt0Z0gmh+QWheD=5sKBwJ-E7w@mail.gmail.com
обсуждение исходный текст
Ответ на Re: Atomic ops for unlogged LSN  (John Morris <john.morris@crunchydata.com>)
Ответы Re: Atomic ops for unlogged LSN
Список pgsql-hackers
On Thu, Jul 20, 2023 at 12:25 AM John Morris
<john.morris@crunchydata.com> wrote:
>
> >> Why don't we just use a barrier when around reading the value? It's not like
> >> CreateCheckPoint() is frequent?
>
> One reason is that a barrier isn’t needed, and adding unnecessary barriers can also be confusing.
>
> With respect to the “debug only” comment in the original code, whichever value is written to the structure during a
checkpointwill be reset when restarting. Nobody will ever see that value. We could just as easily write a zero. 

>
> Shutting down is a different story. It isn’t stated, but we require the unlogged LSN be quiescent before shutting
down.This patch doesn’t change that requirement. 
>
> We could also argue that memory ordering doesn’t matter when filling in a conventional, unlocked structure.  But the
factwe have only two cases 1) checkpoint where the value is ignored, and 2) shutdown where it is quiescent, makes the
additionalargument unnecessary. 
>
> Would you be more comfortable if I added comments describing the two cases? My intent was to be minimalistic, but the
originalcode could use better explanation. 

Here, the case for unloggedLSN is that there can exist multiple
backends incrementing/writing it (via GetFakeLSNForUnloggedRel), and
there can exist one reader at a time in CreateCheckPoint with
LWLockAcquire(ControlFileLock, LW_EXCLUSIVE);. Is incrementing
unloggedLSN atomically (with an implied memory barrier from
pg_atomic_fetch_add_u64) helping out synchronize multiple writers and
readers? With a spinlock, writers-readers synchronization is
guaranteed. With an atomic variable, it is guaranteed that the readers
don't see a torn-value, but no synchronization is provided.

If the above understanding is right, what happens if readers see an
old unloggedLSN value - reader here stores the old unloggedLSN value
to control file and the server restarts (clean exit). So, the old
value is loaded back to unloggedLSN upon restart and the callers of
GetFakeLSNForUnloggedRel() will see an old/repeated value too. Is it a
problem?

--
Bharath Rupireddy
PostgreSQL Contributors Team
RDS Open Source Databases
Amazon Web Services: https://aws.amazon.com



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

Предыдущее
От: Ashutosh Bapat
Дата:
Сообщение: Re: logical decoding and replication of sequences, take 2
Следующее
От: Daniel Gustafsson
Дата:
Сообщение: Re: Assertion failure in SnapBuildInitialSnapshot()