Thread

Commits

Same data as JSON: GET /api/v1/messages/:b64id/commits the thread's linked commits as JSON, with link sources. API reference →
  1. bufmgr: use I/O stats arguments in FlushUnlockedBuffer()

  1. bufmgr: pass through I/O stats context in FlushUnlockedBuffer()

    Chao Li <li.evan.chao@gmail.com> — 2026-04-01T02:15:09Z

    Hi,
    
    I noticed that FlushUnlockedBuffer() accepts io_object and io_context, but then ignores them and hardcodes IOOBJECT_RELATIONand IOCONTEXT_NORMAL instead:
    ```
    static void
    FlushUnlockedBuffer(BufferDesc *buf, SMgrRelation reln,
    					IOObject io_object, IOContext io_context)
    {
    	Buffer		buffer = BufferDescriptorGetBuffer(buf);
    
    	BufferLockAcquire(buffer, buf, BUFFER_LOCK_SHARE_EXCLUSIVE);
    	FlushBuffer(buf, reln, IOOBJECT_RELATION, IOCONTEXT_NORMAL); // <== HERE
    	BufferLockUnlock(buffer, buf);
    }
    ```
    
    Unless I am missing something, if a function accepts these parameters, they should generally be used.
    
    FlushBuffer() seems to have the same issue. It takes both io_object and io_context:
    ```
    static void
    FlushBuffer(BufferDesc *buf, SMgrRelation reln, IOObject io_object,
             IOContext io_context)
    ```
    
    but while io_context is used, io_object is ignored:
    ```
        pgstat_count_io_op_time(IOOBJECT_RELATION, io_context,
              IOOP_WRITE, io_start, 1, BLCKSZ);
    ```
    
    For comparison, in AsyncReadBuffers(), where io_object is also available locally, it is passed through and used directly:
    ```
        pgstat_count_io_op_time(io_object, io_context, IOOP_READ,
              io_start, 1, io_buffers_len * BLCKSZ);
    ```
    
    I raised the same point while reviewing patch [1], but that patch has not been updated yet.
    
    This tiny patch just makes FlushUnlockedBuffer() and FlushBuffer() use the io_object and io_context values passed in by the caller.
    
    [1] Discussion: https://postgr.es/m/377BC880-1616-4DEF-B9EF-5E297C358F7D@gmail.com
    
    Best regards,
    --
    Chao Li (Evan)
    HighGo Software Co., Ltd.
    https://www.highgo.com/
    
    
    
    
    
  2. Re: bufmgr: pass through I/O stats context in FlushUnlockedBuffer()

    Melanie Plageman <melanieplageman@gmail.com> — 2026-04-21T21:52:35Z

    On Tue, Mar 31, 2026 at 10:15 PM Chao Li <li.evan.chao@gmail.com> wrote:
    >
    > I noticed that FlushUnlockedBuffer() accepts io_object and io_context, but then ignores them and hardcodes IOOBJECT_RELATIONand IOCONTEXT_NORMAL instead:
    > ```
    > static void
    > FlushUnlockedBuffer(BufferDesc *buf, SMgrRelation reln,
    >                                         IOObject io_object, IOContext io_context)
    > {
    >         Buffer          buffer = BufferDescriptorGetBuffer(buf);
    >
    >         BufferLockAcquire(buffer, buf, BUFFER_LOCK_SHARE_EXCLUSIVE);
    >         FlushBuffer(buf, reln, IOOBJECT_RELATION, IOCONTEXT_NORMAL); // <== HERE
    >         BufferLockUnlock(buffer, buf);
    > }
    > ```
    >
    > Unless I am missing something, if a function accepts these parameters, they should generally be used.
    
    Thanks for the patch. Committed in 31b0544b32b
    
    - Melanie
    
    
    
    
  3. Re: bufmgr: pass through I/O stats context in FlushUnlockedBuffer()

    Chao Li <li.evan.chao@gmail.com> — 2026-04-21T22:24:04Z

    
    > On Apr 22, 2026, at 05:52, Melanie Plageman <melanieplageman@gmail.com> wrote:
    > 
    > On Tue, Mar 31, 2026 at 10:15 PM Chao Li <li.evan.chao@gmail.com> wrote:
    >> 
    >> I noticed that FlushUnlockedBuffer() accepts io_object and io_context, but then ignores them and hardcodes IOOBJECT_RELATIONand IOCONTEXT_NORMAL instead:
    >> ```
    >> static void
    >> FlushUnlockedBuffer(BufferDesc *buf, SMgrRelation reln,
    >>                                        IOObject io_object, IOContext io_context)
    >> {
    >>        Buffer          buffer = BufferDescriptorGetBuffer(buf);
    >> 
    >>        BufferLockAcquire(buffer, buf, BUFFER_LOCK_SHARE_EXCLUSIVE);
    >>        FlushBuffer(buf, reln, IOOBJECT_RELATION, IOCONTEXT_NORMAL); // <== HERE
    >>        BufferLockUnlock(buffer, buf);
    >> }
    >> ```
    >> 
    >> Unless I am missing something, if a function accepts these parameters, they should generally be used.
    > 
    > Thanks for the patch. Committed in 31b0544b32b
    > 
    > - Melanie
    
    Hi Melanie, thank you very much for pushing.
    
    Best regards,
    --
    Chao Li (Evan)
    HighGo Software Co., Ltd.
    https://www.highgo.com/