• Tom Lane's avatar
    Fix race conditions and missed wakeups in syncrep worker signaling. · 1f201a81
    Tom Lane authored
    When a sync worker is waiting for the associated apply worker to notice
    that it's in SYNCWAIT state, wait_for_worker_state_change() would just
    patiently wait for that to happen.  This generally required waiting for
    the 1-second timeout in LogicalRepApplyLoop to elapse.  Kicking the worker
    via its latch makes things significantly snappier.
    
    While at it, fix race conditions that could potentially result in crashes:
    we can *not* call logicalrep_worker_wakeup_ptr() once we've released the
    LogicalRepWorkerLock, because worker->proc might've been reset to NULL
    after we do that (indeed, there's no really solid reason to believe that
    the LogicalRepWorker slot even belongs to the same worker anymore).
    In logicalrep_worker_wakeup(), we can just move the wakeup inside the
    lock scope.  In process_syncing_tables_for_apply(), a bit more code
    rearrangement is needed.
    
    Also improve some nearby comments.
    1f201a81
launcher.c 24.7 KB