Re: can while loop in ClockSweepTick function be kind of infinite loop in some cases?

Поиск
Список
Период
Сортировка
От Andres Freund
Тема Re: can while loop in ClockSweepTick function be kind of infinite loop in some cases?
Дата
Msg-id 20230110173946.33r7jzxy6geu5qvt@awork3.anarazel.de
обсуждение исходный текст
Ответ на can while loop in ClockSweepTick function be kind of infinite loop in some cases?  (斯波隼斗 <shibahayaton@gmail.com>)
Ответы Re: can while loop in ClockSweepTick function be kind of infinite loop in some cases?
Список pgsql-hackers
Hi,

On 2023-01-11 01:25:06 +0900, 斯波隼斗 wrote:
> This question is about ClockSweepTick function and the code is below.
>
https://github.com/postgres/postgres/blob/24d2b2680a8d0e01b30ce8a41c4eb3b47aca5031/src/backend/storage/buffer/freelist.c#L146-L165
> 
>  The value of expected, NBuffers, wrapped variable is fixed in the while
> loop, so that when the value of expected variable is not equal to
> StrategyControl->nextVictimBuffer, CAS operation fails and the while loop
> will be run kind-of infinitely.
> It is possible for this problem to occur when ClockSweepTick function is
> concurrently called and nextVictimBuffer is incremented by other process
> before CAS operation in the loop (ex: in this case, the value of expected
> variable is NBuffers+1 while the value of nextVictimBuffer variable is
> NBuffers+2. so CAS operation fails)
> I think. `expected = originalVictim + 1;` line should be in while loop
> (before acquiring spin lock) so that, even in the case above, expected
> variable is incremented for each loop and CAS operation will be successful
> at some point.
> Is my understanding correct? If so, I will send PR for fixing this issue.

Yes, I think your understanding might be correct. Interesting that this
apparently has never occurred.

Yes, please send a patch.

Thanks,

Andres



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

Предыдущее
От: Mark Dilger
Дата:
Сообщение: Re: Transparent column encryption
Следующее
От: Aleksander Alekseev
Дата:
Сообщение: Re: Add 64-bit XIDs into PostgreSQL 15