• Tom Lane's avatar
    Don't MAXALIGN in the checks to decide whether a tuple is over TOAST's · a2e092e1
    Tom Lane authored
    threshold for tuple length.  On 4-byte-MAXALIGN machines, the toast code
    creates tuples that have t_len exactly TOAST_TUPLE_THRESHOLD ... but this
    number is not itself maxaligned, so if heap_insert maxaligns t_len before
    comparing to TOAST_TUPLE_THRESHOLD, it'll uselessly recurse back to
    tuptoaster.c, wasting cycles.  (It turns out that this does not happen on
    8-byte-MAXALIGN machines, because for them the outer MAXALIGN in the
    TOAST_MAX_CHUNK_SIZE macro reduces TOAST_MAX_CHUNK_SIZE so that toast tuples
    will be less than TOAST_TUPLE_THRESHOLD in size.  That MAXALIGN is really
    incorrect, but we can't remove it now, see below.)  There isn't any particular
    value in maxaligning before comparing to the thresholds, so just don't do
    that, which saves a small number of cycles in itself.
    
    These numbers should be rejiggered to minimize wasted space on toast-relation
    pages, but we can't do that in the back branches because changing
    TOAST_MAX_CHUNK_SIZE would force an initdb (by changing the contents of toast
    tables).  We can move the toast decision thresholds a bit, though, which is
    what this patch effectively does.
    
    Thanks to Pavan Deolasee for discovering the unintended recursion.
    
    Back-patch into 8.2, but not further, pending more testing.  (HEAD is about
    to get a further patch modifying the thresholds, so it won't help much
    for testing this form of the patch.)
    a2e092e1
tuptoaster.c 35.1 KB