• Robert Haas's avatar
    Fix confusion of max_parallel_workers mechanism following crash. · 8ff51869
    Robert Haas authored
    Commit b460f5d6 failed to contemplate
    the possibilit that a parallel worker registered before a crash would
    be unregistered only after the crash; if that happened, we'd end up
    with parallel_terminate_count > parallel_register_count and the
    system would refuse to launch any more parallel workers.
    
    The easiest way to fix that seems to be to forget BGW_NEVER_RESTART
    workers in ResetBackgroundWorkerCrashTimes() rather than leaving them
    around to be cleaned up after the conclusion of the restart, so that
    they go away before rather than after shared memory is reset.
    
    To make sure that this fix is water-tight, don't allow parallel
    workers to be anything other than BGW_NEVER_RESTART, so that after
    recovering from a crash, 0 is guaranteed to be the correct starting
    value for parallel_register_count.  The core code wouldn't do this
    anyway, but somebody might try to do it in extension code.
    
    Report by Thomas Vondra.  Patch by me, reviewed by Kuntal Ghosh.
    
    Discussion: http://postgr.es/m/CAGz5QC+AVEVS+3rBKRq83AxkJLMZ1peMt4nnrQwczxOrmo3CNw@mail.gmail.com
    8ff51869
bgworker.c 34.3 KB