> On Sep 12, 2025, at 07:11, Melanie Plageman <[email protected]> wrote:
> 
> On Wed, Sep 10, 2025 at 4:24 AM Chao Li <[email protected]> wrote:
>> 
> 
> Thanks for the review!
> 
> For any of your feedback that I simply implemented, I omitted an
> inline comment about it. Those changes are included in the attached
> v6. My inline replies below are only for feedback requiring more
> discussion.
> 
>> On Sep 10, 2025, at 01:55, Melanie Plageman <[email protected]> 
>> wrote:
>> 
>> 2 - 0001
>> ```
>> --- a/src/backend/storage/buffer/freelist.c
>> +++ b/src/backend/storage/buffer/freelist.c
>> 
>> + if (XLogNeedsFlush(lsn))
>> + {
>> + /*
>> + * Remove the dirty buffer from the ring; necessary to prevent an
>> + * infinite loop if all ring members are dirty.
>> + */
>> + strategy->buffers[strategy->current] = InvalidBuffer;
>> + return true;
>> + }
>> 
>> - return true;
>> + return false;
>> }
>> ```
>> 
>> We can do:
>> ```
>>         If (!XLogNeedsFlush(lan))
>>            Return false
>> 
>>        /* Remove the dirty buffer ….
>>         */
>>       Return true;
>> }
>> ```
> 
> This would make the order of evaluation the same as master but I
> actually prefer it this way because then we only take the buffer
> header spinlock if there is a chance we will reject the buffer (e.g.
> we don't need to examine it for strategies except BAS_BULKREAD)
> 
> 

I don’t understand why the two versions are different:

    if (XLogNeedsFlush(lsn))
    {
        /*
         * Remove the dirty buffer from the ring; necessary to prevent an
         * infinite loop if all ring members are dirty.
         */
        strategy->buffers[strategy->current] = InvalidBuffer;
        return true;
    }

    return false;

VS

    if (XLogNeedsFlush(lsn))
        return false;

    /*
     * Remove the dirty buffer from the ring; necessary to prevent an
     * infinite loop if all ring members are dirty.
    */
    strategy->buffers[strategy->current] = InvalidBuffer;
    return true;

> 
>> 10 - 0004
>> ```
>> --- a/src/backend/storage/buffer/bufmgr.c
>> +++ b/src/backend/storage/buffer/bufmgr.c
>> 
>> + limit = Min(max_batch_size, limit);
>> ```
>> 
>> Do we need to check max_batch_size should be less than 
>> (MAX_IO_COMBINE_LIMIT-1)? Because BufWriteBatch.bufdescs is defined with 
>> length of MAX_IO_COMBINE_LIMIT, and the first place has been used to store 
>> “start”.
> 
> I assert that in StrategyMaxWriteBatchSize(). io_combine_limit is not
> allowed to exceed MAX_IO_COMBINE_LIMIT, so it shouldn't happen anyway,
> since we are capping ourselves at io_combine_limit. Or is that your
> point?
> 

Please ignore comment 10. I think I cross-line it in my original email. I added 
the comment, then lately I found you have checked MAX_IO_COMBINE_LIMIT in the 
other function, so tried to delete it by cross-lining the comment.

Best regards,
--
Chao Li (Evan)
HighGo Software Co., Ltd.
https://www.highgo.com/




Reply via email to