Hi Steven, 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. Steven Niu <niush...@gmail.com> 于2025年9月4日周四 15:38写道: > _______________________________________ > From: Michael Paquier > Sent: Thursday, September 04, 2025 14:30 > To: Steven Niu > Cc: Mikhail Kot; pgsql-hackers@lists.postgresql.org; t...@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". >