• Thomas Munro's avatar
    Harden dsm_impl.c against unexpected EEXIST. · fb81a93a
    Thomas Munro authored
    Previously, we trusted the OS not to report EEXIST unless we'd passed in
    IPC_CREAT | IPC_EXCL or O_CREAT | O_EXCL, as appropriate.  Solaris's
    shm_open() can in fact do that, causing us to crash because we didn't
    ereport and then we blithely assumed the mapping was successful.
    
    Let's treat EEXIST just like any other error, unless we're actually
    trying to create a new segment.  This applies to shm_open(), where this
    behavior has been seen, and also to the equivalent operations for our
    sysv and mmap modes just on principle.
    
    Based on the underlying reason for the error, namely contention on a
    lock file managed by Solaris librt for each distinct name, this problem
    is only likely to happen on 15 and later, because the new shared memory
    stats system produces shm_open() calls for the same path from
    potentially large numbers of backends concurrently during
    authentication.  Earlier releases only shared memory segments between a
    small number of parallel workers under one Gather node.  You could
    probably hit it if you tried hard enough though, and we should have been
    more defensive in the first place.  Therefore, back-patch to all
    supported releases.
    
    Per build farm animal margay.  This isn't the end of the story, though,
    it just changes random crashes into random "File exists" errors; more
    work needed for a green build farm.
    Reviewed-by: default avatarRobert Haas <robertmhaas@gmail.com>
    Discussion: https://postgr.es/m/CA%2BhUKGKqKrCV5xKWfh9rnm%3Do%3DDwZLTLtnsj_XpUi9g5%3DV%2B9oyg%40mail.gmail.com
    fb81a93a
dsm_impl.c 29.6 KB