a litter question about mdunlinkfiletag function

Started by px shiover 1 year ago4 messages
#1px shi
spxlyy123@gmail.com

*Hi, hackers*

*When calculating the path, *forknum* is hardcoded as *MAIN_FORKNUM*:*
/* Compute the path. */
p = relpathperm(ftag->rnode, MAIN_FORKNUM);

*But since the *ftag* structure already contains *forknum*:*
typedef struct FileTag
{
int16 handler; /* SyncRequestHandler value, saving space */
int16 forknum; /* ForkNumber, saving space */
RelFileNode rnode;
uint32 segno;
} FileTag;

*Wouldn’t it be more flexible to use the value from the *ftag* structure
directly?*

*Best regards, *

*Pixian Shi*

#2Bruce Momjian
bruce@momjian.us
In reply to: px shi (#1)
Re: a litter question about mdunlinkfiletag function

On Mon, Sep 30, 2024 at 10:43:17AM +0800, px shi wrote:

Hi, hackers

When calculating the path, forknum is hardcoded as MAIN_FORKNUM:

/* Compute the path. */
p = relpathperm(ftag->rnode, MAIN_FORKNUM);

But since the ftag structure already contains forknum:

typedef struct FileTag
{
int16 handler; /* SyncRequestHandler value, saving space */
int16 forknum; /* ForkNumber, saving space */
RelFileNode rnode;
uint32 segno;
} FileTag;

Wouldn’t it be more flexible to use the value from the ftag structure directly?

You will find other places where relpathperm() is called without having
a FileTag structure available, e.g. ReorderBufferProcessTXN().

--
Bruce Momjian <bruce@momjian.us> https://momjian.us
EDB https://enterprisedb.com

When a patient asks the doctor, "Am I going to die?", he means
"Am I going to die soon?"

#3px shi
spxlyy123@gmail.com
In reply to: Bruce Momjian (#2)
Re: a litter question about mdunlinkfiletag function

You will find other places where relpathperm() is called without having
a FileTag structure available, e.g. ReorderBufferProcessTXN().

I apologize for the confusion. What I meant to say is that in the
mdunlinkfiletag() function, the forknum is currently hardcoded as
MAIN_FORKNUM when calling relpathperm(). While mdunlinkfiletag currently
only handles MAIN_FORKNUM, wouldn’t it be more flexible to retrieve the
forknum from the ftag structure instead?

Bruce Momjian <bruce@momjian.us> 于2024年10月15日周二 04:59写道:

Show quoted text

On Mon, Sep 30, 2024 at 10:43:17AM +0800, px shi wrote:

Hi, hackers

When calculating the path, forknum is hardcoded as MAIN_FORKNUM:

/* Compute the path. */
p = relpathperm(ftag->rnode, MAIN_FORKNUM);

But since the ftag structure already contains forknum:

typedef struct FileTag
{
int16 handler; /* SyncRequestHandler value, saving space */
int16 forknum; /* ForkNumber, saving space */
RelFileNode rnode;
uint32 segno;
} FileTag;

Wouldn’t it be more flexible to use the value from the ftag structure

directly?

You will find other places where relpathperm() is called without having
a FileTag structure available, e.g. ReorderBufferProcessTXN().

--
Bruce Momjian <bruce@momjian.us> https://momjian.us
EDB https://enterprisedb.com

When a patient asks the doctor, "Am I going to die?", he means
"Am I going to die soon?"

#4Matthias van de Meent
boekewurm+postgres@gmail.com
In reply to: px shi (#3)
Re: a litter question about mdunlinkfiletag function

On Tue, 15 Oct 2024 at 04:50, px shi <spxlyy123@gmail.com> wrote:

You will find other places where relpathperm() is called without having
a FileTag structure available, e.g. ReorderBufferProcessTXN().

I apologize for the confusion. What I meant to say is that in the mdunlinkfiletag() function, the forknum is currently hardcoded as MAIN_FORKNUM when calling relpathperm(). While mdunlinkfiletag currently only handles MAIN_FORKNUM, wouldn’t it be more flexible to retrieve the forknum from the ftag structure instead?

I just noticed this mail thread as I was searching the archives for
other mentions of `mdunlinkfiletag` when doing some more digging on
uses of that function, to back my own bug report of what looks like
the same issue. See [0]/messages/by-id/CAEze2WiWt+9+OnqW1g9rKz0gqxymmt=oe6pKAEDrutdfpDMpTw@mail.gmail.com.

As was explained to me by Thomas, the reason why MAIN_FORKNUM is
hardcoded here (and why ftag.segno is also ignored) is that this code
is only ever reached for FileTag values with forknum=MAIN_FORKNUM (and
segno is also always 0) with the code in Postgres' repository. The
patch proposed in [0]/messages/by-id/CAEze2WiWt+9+OnqW1g9rKz0gqxymmt=oe6pKAEDrutdfpDMpTw@mail.gmail.com is supposed to make that more clear to
developers.

I suspect the code will be further updated to include the correct fork
number and segment number when there is a need to unlink
non-MAIN_FORKNUM or non-segno=0 files in mdunlinkfiletag.

Kind regards,

Matthias van de Meent

[0]: /messages/by-id/CAEze2WiWt+9+OnqW1g9rKz0gqxymmt=oe6pKAEDrutdfpDMpTw@mail.gmail.com