| From: | Bharath Rupireddy <bharath(dot)rupireddyforpostgres(at)gmail(dot)com> |
|---|---|
| To: | Michael Paquier <michael(at)paquier(dot)xyz> |
| Cc: | Sami Imseih <samimseih(dot)pg(at)gmail(dot)com>, PostgreSQL Hackers <pgsql-hackers(at)lists(dot)postgresql(dot)org> |
| Subject: | Re: WAL segment file descriptor leak on read errors can PANIC the server |
| Date: | 2026-09-25 23:25:18 |
| Message-ID: | CALj2ACXakmsQtdNCOF9jcO-e5Wnfo8Vmdhg-9Gddak03n8g2QQ@mail.gmail.com |
| Views: | Whole Thread | Raw Message | Download mbox | Resend email |
| Thread: | |
| Lists: | pgsql-hackers |
Hi,
On Fri, Sep 25, 2026 at 1:54 AM Michael Paquier <michael(at)paquier(dot)xyz> wrote:
>
> While going quickly through the patch and the thread, my first
> reaction was: why not generalizing more the use of transaction-safe
> fds where we could for the WAL segment open, as well?
>
> That does not stand in the logical decoding path, as I am pretty sure
> that we may lost an fd we could still need. Looking at the segment
> open callbacks, the second case where it does not fit well is a WAL
> sender (WalSndSegmentOpen) with the segments that would be opened
> outside the transaction realm.
Right.
> However, could we consider the option of transient fds for anything
> else, particularly the users of wal_segment_open() in xlogutils.c?
I would prefer to avoid having two mechanisms to fix the same issue.
> With these two cases in mind, I can get behind the idea of a reset
> callback. However, I am not convinced that forcing the presence of a
> reset callback when the xlogreader state is *allocated* is a correct
> design, because it forces the decision to close a fd for everybody who
> uses a XLogReaderAllocate, unconditionally, all the time, and it may
> not even be required to open an fd at all in some cases (all WAL in
> some buffers, heh). The reason why we need to close these fds in the
> first place is due to the calls of segment_open, because we open a
> segment. I would imagine here that the sane move is to register a
> callback *iff* we open a segment. So, add a boolean flag in the state
> tracking if the reset callback is registered, and use
> GetMemoryChunkContext(state) to save the callback in the memory
> context of the xlogreader state, not the CurrentMemoryContext where
> the segment is opened.
Agreed. A reader whose page_read callback reads everything from WAL
buffers, for example with WALReadFromBuffers(), may not call
segment_open at all, so it has no file to close, and registering a
callback for it at allocation time is wasted. Registering it lazily on
the first segment_open call avoids that. I will do it that way in the
next version, with the callback on the reader's own context.
> Note that xlogreader.h declares a new variable that makes no sense in
> FRONTEND code. This needs an #ifdef.
Ah, missed that. I will fix it.
I will address the comments and post new patches soon.
--
Bharath Rupireddy
Amazon Web Services: https://aws.amazon.com
| From | Date | Subject | |
|---|---|---|---|
| Previous Message | Agustín Martínez Fayó | 2026-09-25 23:19:43 | Re: Proposal: Supporting URI SAN in Certificate Authentication |