Thread

Commits

  1. Fix stats_fetch_consistency with stats for fixed-numbered objects

  1. Fix bugs not to discard statistics when changing stats_fetch_consistency

    Shinya Kato <shinya11.kato@oss.nttdata.com> — 2024-01-11T09:18:38Z

    Hi, hackers
    
    There is below description in docs for stats_fetch_consistency.
    "Changing this parameter in a transaction discards the statistics 
    snapshot."
    
    However, I wonder if changes stats_fetch_consistency in a transaction, 
    statistics is not discarded in some cases.
    
    Example:
    --
    * session 1
    =# SET stats_fetch_consistency TO snapshot;
    =# BEGIN;
    =*# SELECT wal_records, wal_fpi, wal_bytes FROM pg_stat_wal;
      wal_records | wal_fpi | wal_bytes
    -------------+---------+-----------
            23592 |     628 |   5939027
    (1 row)
    
    * session 2
    =# CREATE TABLE test (i int); -- generate WAL records
    =# SELECT wal_records, wal_fpi, wal_bytes FROM pg_stat_wal;
      wal_records | wal_fpi | wal_bytes
    -------------+---------+-----------
            23631 |     644 |   6023411
    (1 row)
    
    * session 1
    =*# -- snapshot is not discarded, it is right
    =*# SELECT wal_records, wal_fpi, wal_bytes FROM pg_stat_wal;
      wal_records | wal_fpi | wal_bytes
    -------------+---------+-----------
            23592 |     628 |   5939027
    (1 row)
    
    =*# SET stats_fetch_consistency TO cache;
    
    =*# -- snapshot is not discarded, it is not right
    =*# SELECT wal_records, wal_fpi, wal_bytes FROM pg_stat_wal;
      wal_records | wal_fpi | wal_bytes
    -------------+---------+-----------
            23592 |     628 |   5939027
    (1 row)
    --
    
    I can see similar cases in pg_stat_archiver, pg_stat_bgwriter, 
    pg_stat_checkpointer, pg_stat_io, and pg_stat_slru.
    Is it a bug? I fixed it, and do you think?
    
    -- 
    Regards,
    Shinya Kato
    NTT DATA GROUP CORPORATION
  2. Re: Fix bugs not to discard statistics when changing stats_fetch_consistency

    Michael Paquier <michael@paquier.xyz> — 2024-02-01T08:33:37Z

    On Thu, Jan 11, 2024 at 06:18:38PM +0900, Shinya Kato wrote:
    > Hi, hackers
    
    (Sorry for the delay, this thread was on my TODO list for some time.)
    
    > There is below description in docs for stats_fetch_consistency.
    > "Changing this parameter in a transaction discards the statistics snapshot."
    > 
    > However, I wonder if changes stats_fetch_consistency in a transaction,
    > statistics is not discarded in some cases.
    
    Yep, you're right.  This is inconsistent with the documentation where
    we need to clean up the cached data when changing this GUC.  I was
    considering a few options regarding the location of the extra
    pgstat_clear_snapshot(), but at the end I see the point in doing it in
    a path even if it creates a duplicate with pgstat_build_snapshot()
    when pgstat_fetch_consistency is using the snapshot mode.  A location
    better than your patch is pgstat_snapshot_fixed(), though, so as new
    stats kinds will be able to get the call.
    
    I have been banging my head on my desk for a bit when thinking about a
    way to test that in a predictible way, until I remembered that these
    stats are only flushed at commit, so this requires at least two
    sessions, with one of them having a transaction opened while
    manipulating stats_fetch_consistency.  TAP would be one option, but
    I'm not really tempted about spending more cycles with a
    background_psql just for this case.  If I'm missing something, feel
    free.
    --
    Michael
    
  3. Re: Fix bugs not to discard statistics when changing stats_fetch_consistency

    Shinya Kato <shinya11.kato@oss.nttdata.com> — 2024-02-01T12:22:48Z

    On 2024-02-01 17:33, Michael Paquier wrote:
    > On Thu, Jan 11, 2024 at 06:18:38PM +0900, Shinya Kato wrote:
    >> Hi, hackers
    > 
    > (Sorry for the delay, this thread was on my TODO list for some time.)
    >> There is below description in docs for stats_fetch_consistency.
    >> "Changing this parameter in a transaction discards the statistics 
    >> snapshot."
    >> 
    >> However, I wonder if changes stats_fetch_consistency in a transaction,
    >> statistics is not discarded in some cases.
    > 
    > Yep, you're right.  This is inconsistent with the documentation where
    > we need to clean up the cached data when changing this GUC.  I was
    > considering a few options regarding the location of the extra
    > pgstat_clear_snapshot(), but at the end I see the point in doing it in
    > a path even if it creates a duplicate with pgstat_build_snapshot()
    > when pgstat_fetch_consistency is using the snapshot mode.  A location
    > better than your patch is pgstat_snapshot_fixed(), though, so as new
    > stats kinds will be able to get the call.
    > 
    > I have been banging my head on my desk for a bit when thinking about a
    > way to test that in a predictible way, until I remembered that these
    > stats are only flushed at commit, so this requires at least two
    > sessions, with one of them having a transaction opened while
    > manipulating stats_fetch_consistency.  TAP would be one option, but
    > I'm not really tempted about spending more cycles with a
    > background_psql just for this case.  If I'm missing something, feel
    > free.
    
    Thank you for the review and pushing!
    I think it is better and more concise than my implementation.
    
    -- 
    Regards,
    Shinya Kato
    NTT DATA GROUP CORPORATION