• Heikki Linnakangas's avatar
    Fix recycling of WAL segments after switching timeline during recovery. · 343ee00b
    Heikki Linnakangas authored
    This was broken before, we would recycle old WAL segments on wrong timeline
    after the recovery target timeline had changed, but my recent commit to
    not initialize ThisTimeLineID at all in a standby's checkpointer process
    broke this completely.
    
    The problem is that when installing a recycled WAL segment as a future one,
    ThisTimeLineID is used to construct the filename. To fix, always update
    ThisTimeLineID to the current timeline being recovered, before recycling
    WAL segments at a restartpoint.
    
    This still leaves a small window where we might install WAL segments under
    wrong timeline ID, if the timeline is changed just as we're about to start
    recycling. Also, even if we're replaying timeline X at the momnent, there's
    no guarantee that we'll need as many WAL segments on that timeline as we
    recycle. We might be just about to reach the point where we switch to next
    timeline, so might only need one more WAL segment on the current timeline.
    We'll live with the waste in that situation.
    
    Bug pointed out by Fujii Masao. 9.1 and 9.2 had the same issue, when
    recovery target timeline was changed, but I committed a slightly different
    version of this patch on those branches.
    343ee00b
xlog.c 304 KB