I think when an error is thrown within the PG_TRY block, the assignment to shheader is interrupted and never completes. As a result, shheader retains its initial, NULL value.
And, the PG_RE_THROW() within the PG_CATCH block causes a non-local jump, immediately aborting the current execution path to handle the error at a higher level. This guarantees that the code following PG_END_TRY is unreachable in the error scenario.
_______________________________________ From: Michael Paquier Sent: Thursday, September 04, 2025 14:30 To: Steven Niu Cc: Mikhail Kot; pgsql-hackers@lists.postgresql.org; to@myrrc.dev Subject: Re: 回复: Fix segfault while accessing half-initialized hash table in pgstat_shmem.c
On Thu, Sep 04, 2025 at 02:31:34AM +0000, Steven Niu wrote: > If pgstat_init_entry() errors on OOM, what would it returns to shheader, NULL? > That would bring trouble to dshash_delete_entry().
Based on the proposal of patch 0002, the code would throw an error after cleaning up the shared memory state. The generation and refcount number assigned inside pgstat_init_entry() would not matter as well because the entry created by dshash_find_or_insert() would be entirely gone. So I am not sure what's the point you are trying to make here. -- Michael
Sorry, I made a mistake. I should say: "If pgstat_init_entry() errors on OOM, the local variable shheader may be NULL. This would bring trouble to pgstat_acquire_entry_ref() in the line 30 of patch 002".