Re: [RFC] Lock-free XLog Reservation from WAL - Mailing list pgsql-hackers

From Zhou, Zhiguo
Subject Re: [RFC] Lock-free XLog Reservation from WAL
Date
Msg-id 7ba1d18a-e120-4424-a614-b3de68658570@intel.com
Whole thread Raw
In response to Re: [RFC] Lock-free XLog Reservation from WAL  (wenhui qiu <qiuwenhuifx@gmail.com>)
Responses Re: [RFC] Lock-free XLog Reservation from WAL
List pgsql-hackers
Maybe we could leave the NUM_XLOGINSERT_LOCKS unchanged in this patch, 
as it is not a hard dependency of the lock-free algorithm. And when this 
patch has been fully accepted, we could then investigate the more proper 
way of increasing NUM_XLOGINSERT_LOCKS. WDYT?

On 1/6/2025 4:35 PM, wenhui qiu wrote:
> HI Zhiguo
>      Thank you for your reply ,Then you'll have to prove that 128 is the 
> optimal value, otherwise they'll have a hard time agreeing with you on 
> this patch.
> 
> Thanks
> 
> On Mon, Jan 6, 2025 at 2:46 PM Zhou, Zhiguo <zhiguo.zhou@intel.com 
> <mailto:zhiguo.zhou@intel.com>> wrote:
> 
>     Hi Yura and Wenhui,
> 
>     Thanks for kindly reviewing this work!
> 
>     On 1/3/2025 9:01 PM, wenhui qiu wrote:
>      > Hi
>      >      Thank you for your path,NUM_XLOGINSERT_LOCKS increase to
>     128,I
>      > think it will be challenged,do we make it guc ?
>      >
> 
>     I noticed there have been some discussions (for example, [1] and its
>     responses) about making NUM_XLOGINSERT_LOCKS a GUC, which seems to be a
>     controversial proposal. Given that, we may first focus on the lock-free
>     XLog reservation implementation, and leave the increase of
>     NUM_XLOGINSERT_LOCKS for a future patch, where we would provide more
>     quantitative evidence for the various implementations. WDYT?
> 
> 
>      > On Fri, 3 Jan 2025 at 20:36, Yura Sokolov
>     <y.sokolov@postgrespro.ru <mailto:y.sokolov@postgrespro.ru>
>      > <mailto:y.sokolov@postgrespro.ru
>     <mailto:y.sokolov@postgrespro.ru>>> wrote:
>      >
>      >     Good day, Zhiguo.
>      >
>      >     Idea looks great.
>      >
>      >     Minor issue:
>      >     - you didn't remove use of `insertpos_lck` from
>     `ReserveXLogSwitch`.
>      >
>      >     I initially thought it became un-synchronized against
>      >     `ReserveXLogInsertLocation`, but looking closer I found it is
>      >     synchronized with `WALInsertLockAcquireExclusive`.
>      >     Since there are no other `insertpos_lck` usages after your
>     patch, I
>      >     don't see why it should exists and be used in
>     `ReserveXLogSwitch`.
>      >
>      >     Still I'd prefer to see CAS loop in this place to be
>     consistent with
>      >     other non-locking access. And it will allow to get rid of
>      >     `WALInsertLockAcquireExclusive`, (though probably it is not a big
>      >     issue).
>      >
> 
>     Exactly, it should be safe to remove `insertpos_lck`. And I agree with
>     you on getting rid of `WALInsertLockAcquireExclusive` with CAS loop
>     which should significantly reduce the synchronization cost here
>     especially when we intend to increase NUM_XLOGINSERT_LOCKS. I will try
>     it in the next version of patch.
> 
> 
>      >     Major issue:
>      >     - `SetPrevRecPtr` and `GetPrevRecPtr` do non-atomic write/
>     read with on
>      >     platforms where MAXALIGN != 8 or without native 64 load/
>     store. Branch
>      >     with 'memcpy` is rather obvious, but even pointer de-
>     referencing on
>      >     "lucky case" is not safe either.
>      >
>      >     I have no idea how to fix it at the moment.
>      >
> 
>     Indeed, non-atomic write/read operations can lead to safety issues in
>     some situations. My initial thought is to define a bit near the
>     prev-link to flag the completion of the update. In this way, we could
>     allow non-atomic or even discontinuous write/read operations on the
>     prev-link, while simultaneously guaranteeing its atomicity through
>     atomic operations (as well as memory barriers) on the flag bit. What do
>     you think of this as a viable solution?
> 
> 
>      >     Readability issue:
>      >     - It would be good to add `Assert(ptr >= upto)` into
>     `GetXLogBuffer`.
>      >     I had hard time to recognize `upto` is strictly not in the
>     future.
>      >     - Certainly, final version have to have fixed and improved
>     comments.
>      >     Many patch's ideas are strictly non-obvious. I had hard time to
>      >     recognize patch is not a piece of ... (excuse me for the swear
>      >     sentence).
> 
>     Thanks for the suggestion and patience. It's really more readable after
>     inserting the assertion, I will fix it and improve other comments in
>     the
>     following patches.
> 
> 
>      >     Indeed, patch is much better than it looks on first sight.
>      >     I came with alternative idea yesterday, but looking closer to
>     your
>      >     patch
>      >     today I see it is superior to mine (if atomic access will be
>     fixed).
>      >
>      >     ----
>      >
>      >     regards,
>      >     Yura Sokolov aka funny-falcon
>      >
>      >
> 
>     Regards,
>     Zhiguo
> 
> 
>     [1] https://www.postgresql.org/message-
>     id/2266698.1704854297%40sss.pgh.pa.us <https://www.postgresql.org/
>     message-id/2266698.1704854297%40sss.pgh.pa.us>
> 




pgsql-hackers by date:

Previous
From: Pavel Stehule
Date:
Subject: Re: Re: proposal: schema variables
Next
From: wenhui qiu
Date:
Subject: Re: [RFC] Lock-free XLog Reservation from WAL