• Tomas Vondra's avatar
    Use Size instead of int64 to track allocated memory · f2369bc6
    Tomas Vondra authored
    Commit 5dd7fc15 added block-level memory accounting, but used int64 variable to
    track the amount of allocated memory. That is incorrect, because we have Size for
    exactly these purposes, but it was mostly harmless until c477f3e4 which changed
    how we handle with repalloc() when downsizing the chunk. Previously we've ignored
    these cases and just kept using the original chunk, but now we need to update the
    accounting, and the code was doing this:
    
        context->mem_allocated += blksize - oldblksize;
    
    Both blksize and oldblksize are Size (so unsigned) which means the subtraction
    underflows, producing a very high positive value. On 64-bit platforms (where Size
    has the same size as mem_alllocated) this happens to work because the result wraps
    to the right value, but on (some) 32-bit platforms this fails.
    
    This fixes two things - it changes mem_allocated (and related variables) to Size,
    and it splits the update to two separate steps, to prevent any underflows.
    
    Discussion: https://www.postgresql.org/message-id/15151.1570163761%40sss.pgh.pa.us
    f2369bc6
generation.c 25.3 KB