Thread

  1. Small Bug in pgstat display during recovery conflict resolution

    Andres Freund <andres@anarazel.de> — 2010-02-07T20:47:39Z

    Hi Simon, Hi all,
    
    
    if (!logged && (wait_s > 0 || wait_us > 500000))
    {
            const char *oldactivitymsg;
            int                     len;
    
            oldactivitymsg = get_ps_display(&len);
            snprintf(waitactivitymsg, sizeof(waitactivitymsg),
                             "waiting for max_standby_delay (%u s)",
                             MaxStandbyDelay);
            set_ps_display(waitactivitymsg, false);
            if (len > 100)
                    len = 100;
            memcpy(waitactivitymsg, oldactivitymsg, len);
    
            pgstat_report_waiting(true);
    
            logged = true;
    }
    ..
    if (logged)
    {
            set_ps_display(waitactivitymsg, false);
            pgstat_report_waiting(false);
    }
    
    That doesnt work because get_ps_display returns the internal buffer. This 
    leads to the situation that after conflict resolution the 
    "waiting for max_standby_delay ..."
    message is displayed until the next segment starts where its replaced
    again by the 
    "... recovering ..." line.
    
    Additionally the old code may print unintialized memory if get_ps_display
     returns a string without a \0 terminator.
    
    The attached patch fixes that.
    
    Andres
    
  2. Re: Small Bug in pgstat display during recovery conflict resolution

    Simon Riggs <simon@2ndquadrant.com> — 2010-02-13T16:30:36Z

    Committed, thanks.
    
    On Sun, 2010-02-07 at 21:47 +0100, Andres Freund wrote:
    > Hi Simon, Hi all,
    > 
    > 
    > if (!logged && (wait_s > 0 || wait_us > 500000))
    > {
    >         const char *oldactivitymsg;
    >         int                     len;
    > 
    >         oldactivitymsg = get_ps_display(&len);
    >         snprintf(waitactivitymsg, sizeof(waitactivitymsg),
    >                          "waiting for max_standby_delay (%u s)",
    >                          MaxStandbyDelay);
    >         set_ps_display(waitactivitymsg, false);
    >         if (len > 100)
    >                 len = 100;
    >         memcpy(waitactivitymsg, oldactivitymsg, len);
    > 
    >         pgstat_report_waiting(true);
    > 
    >         logged = true;
    > }
    > ..
    > if (logged)
    > {
    >         set_ps_display(waitactivitymsg, false);
    >         pgstat_report_waiting(false);
    > }
    > 
    > That doesnt work because get_ps_display returns the internal buffer. This 
    > leads to the situation that after conflict resolution the 
    > "waiting for max_standby_delay ..."
    > message is displayed until the next segment starts where its replaced
    > again by the 
    > "... recovering ..." line.
    > 
    > Additionally the old code may print unintialized memory if get_ps_display
    >  returns a string without a \0 terminator.
    > 
    > The attached patch fixes that.
    > 
    > Andres
    -- 
     Simon Riggs           www.2ndQuadrant.com