The issue is clear: unlike other fixed-size stats kinds (archiver, bgwriter, checkpointer), the injection_points stats can be updated concurrently by multiple backends. Without synchronization, this can lead to inconsistent changecount state and assertion failures in pgstat_begin_changecount_write(), as shown in your reproduction.
On Mon, Sep 29, 2025 at 09:46:05AM +0800, Chao Li wrote:
I saw pg_state_begin_changecount_write() is called multiple places, as you mention, for example bgwriter.
I've mentioned that in my first email, and put in details: - pgstat_report_bgwriter() is called once, by the bgwriter. - pgstat_report_checkpointer() is called three time, all by the checkpointer. - pgstat_report_archiver() is called twice, all by pgarch.c.
So all of them don't have a problem, two calls cannot happen concurrently. -- Michael
Thanks for the clarification. Then the patch looks good to me.