Also curious why query on pg_stat_activity is considering terminated
process ? Irrespective of corrupted state or not, ideally query on
pg_stat_activity
should ignore already terminated process.
My 2 cents.


On Fri, May 10, 2019 at 8:01 AM neeraj kumar <neeru....@gmail.com> wrote:

> There are multiple ways see this problem. One way I am seeing is : how
> system will auto-recover from this particular state.
>
> So ideally if st_procpid is set to zero it means this process is already
> terminated, however it might be have left some corrupted information in
> memory. So when other components tries to read beentry, they should also
> check if st_procpid is already set to zero, if yes it means this process
> is gone and no need to consider this process any more.
>
> Agree this is solving particular issue about pg_stat_activity however
> don't see any harm in adding that check.
>
>
> On Thu, May 9, 2019 at 9:29 PM Tom Lane <t...@sss.pgh.pa.us> wrote:
>
>> neeraj kumar <neeru....@gmail.com> writes:
>> > Tom, may be I didn't make my point clear.
>> > There are two issues :
>> > 1) Why this value was left as odd
>>
>> Because a function called by pgstat_bestart threw an error, is what
>> I'm guessing.
>>
>> > 2) Why backend entry is still pending in beentry for backend process
>> even
>> > after it was killed/terminated.
>> > I am talking about 2nd issue. My understanding is query on
>> pg_stat_activity
>> > goes via all backend entries via beentry and it finds this
>> wrong/corrupted
>> > entry. When a process terminates, ideally this backend entry into
>> beentery
>> > should have also been cleaned. But why this still there? Whose
>> > responsibility it is to remove entry from beentry when process
>> terminates ?
>>
>> If you're imagining that something takes an electronic hacksaw to shared
>> memory and physically removes that array entry, you're mistaken.  It's
>> still going to be there.  Now, there *is* cleanup code --- this bit of
>> pgstat_beshutdown_hook is supposed to mark the process's entry as
>> not-in-use:
>>
>>         /*
>>          * Clear my status entry, following the protocol of bumping
>> st_changecount
>>          * before and after.  We use a volatile pointer here to ensure the
>>          * compiler doesn't try to get cute.
>>          */
>>         pgstat_increment_changecount_before(beentry);
>>
>>         beentry->st_procpid = 0;        /* mark invalid */
>>
>>         pgstat_increment_changecount_after(beentry);
>>
>> However, if something had left st_changecount odd before we got to this,
>> it'd still be odd afterwards.  Sure, st_procpid is now zero, but that
>> doesn't help readers because they're not supposed to believe st_procpid
>> is valid unless the changecount is even.
>>
>> You could maybe argue that this cleanup code should be trying to ensure
>> that the changecount is left even, but I don't think that's an appropriate
>> response.  If it's not even when we get here, we already screwed up very
>> badly, because we were breaking the protocol for (potentially) as long as
>> the process has been in existence.  Moreover, if you're worried about
>> corner cases where we did mess that up, what of corner cases where process
>> exit fails before getting here?  I think the right answer is to bring the
>> hammer down as soon as we mess up, which is what the critical-section
>> mechanism is for.
>>
>>                         regards, tom lane
>>
>
>
> --
> -------------------------------------
> Thanks
> Neeraj Kumar,
> +1  (206) 427-7267
>


-- 
-------------------------------------
Thanks
Neeraj Kumar,
+1  (206) 427-7267

Reply via email to