• Tom Lane's avatar
    Improve management of statement timeouts. · 22f6f2c1
    Tom Lane authored
    Commit f8e5f156 added private state in postgres.c to track whether
    a statement timeout is running.  This seems like bad design to me;
    timeout.c's private state should be the single source of truth about
    that.  We already fixed one bug associated with failure to keep those
    states in sync (cf. be42015f), and I've got little faith that we
    won't find more in future.  So get rid of postgres.c's local variable
    by exposing a way to ask timeout.c whether a timeout is running.
    (Obviously, such an inquiry is subject to race conditions, but it
    seems fine for the purpose at hand.)
    
    To make get_timeout_active() as cheap as possible, add a flag in
    the per-timeout struct showing whether that timeout is active.
    This allows some small savings elsewhere in timeout.c, mainly
    elimination of unnecessary searches of the active_timeouts array.
    
    While at it, fix enable_statement_timeout to not call disable_timeout
    when statement_timeout is 0 and the timeout is not running.  This
    avoids a useless deschedule-and-reschedule-timeouts cycle, which
    represents a significant savings (at least one kernel call) when
    there is any other active timeout.  Right now, there usually isn't,
    but there are proposals around to change that.
    
    Discussion: https://postgr.es/m/16035-456e6e69ebfd4374@postgresql.org
    22f6f2c1
postgres.c 126 KB