Thread
Commits
GET /api/v1/messages/:b64id/commits
the thread's linked commits as JSON, with link sources.
API reference →
-
Remove HeapTupleheaderSetXminCommitted/Invalid functions
- cbef472558ca 19 (unreleased) landed
-
Convert macros to static inline functions (htup_details.h, itup.h)
- 34694ec888d6 18.0 cited
-
Change the way we mark tuples as frozen.
- 37484ad2aace 9.4.0 cited
-
Code review for HeapTupleHeader changes. Add version number to page headers
- c7a165adc64e 7.3.1 cited
-
This patch wraps all accesses to t_xmin, t_cmin, t_xmax, and t_cmax in
- 3c35face4108 7.3.1 cited
-
Remove HeapTupleheaderSetXmin{Committed,Invalid} functions
Andy Fan <zhihuifan1213@163.com> — 2025-06-25T07:47:27Z
Hi, When I am reading the code, I first thought I can do something in HeapTupleheaderSetXminCommitted, then I realized we have SetHintBits. After some research, I find HeapTupleHeaderSetXminCommitted is never used and it looks not safe to use after comparing with SetHintBits. So to avoid future confusion or misuse, I'd suggest to remove it. I think HeapTupleHeaderSetXminInvalid should be the same. So here is the patch. commit ed905d64c6b81a78627f895918d4ac723d46865c (HEAD -> heap_set_bits) Author: Andy Fan <zhihuifan1213@163.com> Date: Wed Jun 25 07:35:32 2025 +0000 Remove HeapTupleheaderSetXminCommitted/Invalid functions They are neither be used nor be safe to be used, User should use SetHintBits instead. What do you think? -- Best Regards Andy Fan -
Re: Remove HeapTupleheaderSetXmin{Committed,Invalid} functions
Michael Paquier <michael@paquier.xyz> — 2025-06-25T08:15:31Z
On Wed, Jun 25, 2025 at 07:47:27AM +0000, Andy Fan wrote: > When I am reading the code, I first thought I can do something in > HeapTupleheaderSetXminCommitted, then I realized we have SetHintBits. > After some research, I find HeapTupleHeaderSetXminCommitted is never > used and it looks not safe to use after comparing with SetHintBits. So > to avoid future confusion or misuse, I'd suggest to remove it. I think > HeapTupleHeaderSetXminInvalid should be the same. So here is the patch. There is a cost in removing such code, even if not used in core: extension code outside of core may use it, and they would fail to compile. This can break code, and keeping them around has no maintenance cost. -- Michael
-
Re: Remove HeapTupleheaderSetXmin{Committed,Invalid} functions
Andy Fan <zhihuifan1213@163.com> — 2025-06-25T09:28:50Z
Michael Paquier <michael@paquier.xyz> writes: > On Wed, Jun 25, 2025 at 07:47:27AM +0000, Andy Fan wrote: >> When I am reading the code, I first thought I can do something in >> HeapTupleheaderSetXminCommitted, then I realized we have SetHintBits. >> After some research, I find HeapTupleHeaderSetXminCommitted is never >> used and it looks not safe to use after comparing with SetHintBits. So >> to avoid future confusion or misuse, I'd suggest to remove it. I think >> HeapTupleHeaderSetXminInvalid should be the same. So here is the patch. > > There is a cost in removing such code, even if not used in core: > extension code outside of core may use it, and they would fail to > compile. This can break code, and keeping them around has no > maintenance cost. I did thought about the impact on third-party extension, but I suggested the patch not only because it is not used but also it is not safe to set the flags directly. What do you think about this? From comments of SetHintBits: * It is only safe to set a transaction-committed hint bit if we know the * transaction's commit record is guaranteed to be flushed to disk before the * buffer, or if the table is temporary or unlogged and will be obliterated by * a crash anyway. We cannot change the LSN of the page here, because we may Just in case someone use it, it may ask for public API for SetHintBits. Thanks for have a look. -- Best Regards Andy Fan
-
Re: Remove HeapTupleheaderSetXmin{Committed,Invalid} functions
Nathan Bossart <nathandbossart@gmail.com> — 2025-06-25T15:04:19Z
On Wed, Jun 25, 2025 at 09:28:50AM +0000, Andy Fan wrote: > Michael Paquier <michael@paquier.xyz> writes: >> On Wed, Jun 25, 2025 at 07:47:27AM +0000, Andy Fan wrote: >>> When I am reading the code, I first thought I can do something in >>> HeapTupleheaderSetXminCommitted, then I realized we have SetHintBits. >>> After some research, I find HeapTupleHeaderSetXminCommitted is never >>> used and it looks not safe to use after comparing with SetHintBits. So >>> to avoid future confusion or misuse, I'd suggest to remove it. I think >>> HeapTupleHeaderSetXminInvalid should be the same. So here is the patch. >> >> There is a cost in removing such code, even if not used in core: >> extension code outside of core may use it, and they would fail to >> compile. This can break code, and keeping them around has no >> maintenance cost. > > I did thought about the impact on third-party extension, but I suggested > the patch not only because it is not used but also it is not safe to set > the flags directly. What do you think about this? > > From comments of SetHintBits: > > * It is only safe to set a transaction-committed hint bit if we know the > * transaction's commit record is guaranteed to be flushed to disk before the > * buffer, or if the table is temporary or unlogged and will be obliterated by > * a crash anyway. We cannot change the LSN of the page here, because we may That doesn't mean they're fundamentally unsafe in all cases. And besides, there are many other ways to do unsafe things in extensions, including using the HEAP_XMIN_* macros directly instead of via these inline functions, so I don't think removing them gains us much. -- nathan
-
Re: Remove HeapTupleheaderSetXmin{Committed,Invalid} functions
Andy Fan <zhihuifan1213@163.com> — 2025-06-25T23:58:29Z
Nathan Bossart <nathandbossart@gmail.com> writes: > On Wed, Jun 25, 2025 at 09:28:50AM +0000, Andy Fan wrote: >> Michael Paquier <michael@paquier.xyz> writes: >>> On Wed, Jun 25, 2025 at 07:47:27AM +0000, Andy Fan wrote: >>>> When I am reading the code, I first thought I can do something in >>>> HeapTupleheaderSetXminCommitted, then I realized we have SetHintBits. >>>> After some research, I find HeapTupleHeaderSetXminCommitted is never >>>> used and it looks not safe to use after comparing with SetHintBits. So >>>> to avoid future confusion or misuse, I'd suggest to remove it. I think >>>> HeapTupleHeaderSetXminInvalid should be the same. So here is the patch. >>> >>> There is a cost in removing such code, even if not used in core: >>> extension code outside of core may use it, and they would fail to >>> compile. This can break code, and keeping them around has no >>> maintenance cost. >> >> I did thought about the impact on third-party extension, but I suggested >> the patch not only because it is not used but also it is not safe to set >> the flags directly. What do you think about this? >> >> From comments of SetHintBits: >> >> * It is only safe to set a transaction-committed hint bit if we know the >> * transaction's commit record is guaranteed to be flushed to disk before the >> * buffer, or if the table is temporary or unlogged and will be obliterated by >> * a crash anyway. We cannot change the LSN of the page here, because we may > > That doesn't mean they're fundamentally unsafe in all cases. And besides, > there are many other ways to do unsafe things in extensions, including > using the HEAP_XMIN_* macros directly instead of via these inline > functions, so I don't think removing them gains us much. Sure we can't avoid them totally, so I agree with your "removing them not gains us much*, but that doesn't mean core should provide convience for such purpose. In my opinion, if we find such things, we can try to avoid them if that would not cost us much. All of my opinion are based on the following fact for set a hintbits is not well konwn by most user. But if you are more confident it is well konwn by most people, then I'm agree with we could keep them. * It is only safe to set a transaction-committed hint bit if we know the * transaction's commit record is guaranteed to be flushed to disk before the * buffer, or if the table is temporary or unlogged and will be obliterated by * a crash anyway. -- Best Regards Andy Fan
-
Re: Remove HeapTupleheaderSetXmin{Committed,Invalid} functions
Álvaro Herrera <alvherre@kurilemu.de> — 2025-06-26T12:06:34Z
Hmm So these functions were created from macros in commit 34694ec888d6, which themselves had been added for the first time in commit 37484ad2aace. However, it appears that they were added only because they were mirroring HeapTupleHeaderSetXminFrozen(), and while the latter was immediately used, the other two weren't and never have been. (For a short while between June and September 2002 we had a different macro also called HeapTupleHeaderSetXminInvalid -- added by commit 3c35face4108 and removed by commit c7a165adc64e -- and curiously enough it was also entirely unused.) I think Andy is right that these should be removed, not only because they are unsafe but because they are dead code. codesearch.debian.net shows no matches by grep, other than htup_internals.h itself. -- Álvaro Herrera PostgreSQL Developer — https://www.EnterpriseDB.com/ "La rebeldía es la virtud original del hombre" (Arthur Schopenhauer)
-
Re: Remove HeapTupleheaderSetXmin{Committed,Invalid} functions
Andy Fan <zhihuifan1213@163.com> — 2025-06-27T00:02:17Z
Álvaro Herrera <alvherre@kurilemu.de> writes: > Hmm > > So these functions were created from macros in commit 34694ec888d6, > which themselves had been added for the first time in commit > 37484ad2aace. However, it appears that they were added only because > they were mirroring HeapTupleHeaderSetXminFrozen(), and while the latter > was immediately used, the other two weren't and never have been. > > (For a short while between June and September 2002 we had a different > macro also called HeapTupleHeaderSetXminInvalid -- added by commit > 3c35face4108 and removed by commit c7a165adc64e -- and curiously enough > it was also entirely unused.) Thanks for checking the history, and part of c7a165adc64e (removing HeapTupleHeaderSetXminInvalid from htup.h) is pretty similar with the case there. > I think Andy is right that these should be removed, not only because > they are unsafe but because they are dead code. Yes, I suggested with the two reasons. When I knew removing a public API has potential to break some third-party extension even they are not used in core, then the *unsafe* part encourage to do so. Acutally no maintaince cost for the dead code is only true when no one read/think about them, otherwise the cost is there. The HeapTupleheaderSetXminCommitted has misleaded me to think I can do something there, but the fact is (1) they are never used. (2) the right place is SetHintBits. > codesearch.debian.net shows no matches by grep, other than > htup_internals.h itself. Thanks for sharing codesearch.decbian.net which looks a great project. I just found even there is such code, core has already provided public API HeapTupleSetHintBits which can be used as a replacement and it is safe. -- Best Regards Andy Fan
-
Re: Remove HeapTupleheaderSetXmin{Committed,Invalid} functions
Andy Fan <zhihuifan1213@163.com> — 2025-06-28T05:00:04Z
Andy Fan <zhihuifan1213@163.com> writes: > Álvaro Herrera <alvherre@kurilemu.de> writes: > >> Hmm >> >> So these functions were created from macros in commit 34694ec888d6, >> which themselves had been added for the first time in commit >> 37484ad2aace. However, it appears that they were added only because >> they were mirroring HeapTupleHeaderSetXminFrozen(), and while the latter >> was immediately used, the other two weren't and never have been. >> >> (For a short while between June and September 2002 we had a different >> macro also called HeapTupleHeaderSetXminInvalid -- added by commit >> 3c35face4108 and removed by commit c7a165adc64e -- and curiously enough >> it was also entirely unused.) > > Thanks for checking the history, and part of c7a165adc64e (removing > HeapTupleHeaderSetXminInvalid from htup.h) is pretty similar with the > case there. > >> I think Andy is right that these should be removed, not only because >> they are unsafe but because they are dead code. > > Yes, I suggested with the two reasons. When I knew removing a public > API has potential to break some third-party extension even they are not > used in core, then the *unsafe* part encourage to do so. > > Acutally no maintaince cost for the dead code is only true when no one > read/think about them, otherwise the cost is there. The > HeapTupleheaderSetXminCommitted has misleaded me to think I can do > something there, but the fact is (1) they are never used. (2) the right > place is SetHintBits. > >> codesearch.debian.net shows no matches by grep, other than >> htup_internals.h itself. > > Thanks for sharing codesearch.decbian.net which looks a great project. > > I just found even there is such code, core has already provided public > API HeapTupleSetHintBits which can be used as a replacement and it is > safe. The attached is the v2, I just change the commit message to address the concern from Michael and Nathan. I also registed this into https://commitfest.postgresql.org/patch/5870/. Hi Michael and Nathan, has the new discussion addressed your concerns, or do you still think we should keep them as it is? Thanks -- Best Regards Andy Fan