• Tom Lane's avatar
    Redesign parallel dump/restore's wait-for-workers logic. · b7b8cc0c
    Tom Lane authored
    The ListenToWorkers/ReapWorkerStatus APIs were messy and hard to use.
    Instead, make DispatchJobForTocEntry register a callback function that
    will take care of state cleanup, doing whatever had been done by the caller
    of ReapWorkerStatus in the old design.  (This callback is essentially just
    the old mark_work_done function in the restore case, and a trivial test for
    worker failure in the dump case.)  Then we can have ListenToWorkers call
    the callback immediately on receipt of a status message, and return the
    worker to WRKR_IDLE state; so the WRKR_FINISHED state goes away.
    
    This allows us to design a unified wait-for-worker-messages loop:
    WaitForWorkers replaces EnsureIdleWorker and EnsureWorkersFinished as well
    as the mess in restore_toc_entries_parallel.  Also, we no longer need the
    fragile API spec that the caller of DispatchJobForTocEntry is responsible
    for ensuring there's an idle worker, since DispatchJobForTocEntry can just
    wait until there is one.
    
    In passing, I got rid of the ParallelArgs struct, which was a net negative
    in terms of notational verboseness, and didn't seem to be providing any
    noticeable amount of abstraction either.
    
    Tom Lane, reviewed by Kevin Grittner
    
    Discussion: <1188.1464544443@sss.pgh.pa.us>
    b7b8cc0c
pg_backup_custom.c 24 KB