• Tom Lane's avatar
    Fix order of shutdown cleanup operations in PostgresNode.pm. · 08af9219
    Tom Lane authored
    Previously, database clusters created by a TAP test were shut down by
    DESTROY methods attached to the PostgresNode objects representing them.
    The trouble with that is that if the objects survive into the final global
    destruction phase (which they do), Perl executes the DESTROY methods in an
    unspecified order.  Thus, the order of shutdown of multiple clusters was
    indeterminate, which might lead to not-very-reproducible errors getting
    logged (eg from a slave whose master might or might not get killed first).
    Worse, the File::Temp objects representing the temporary PGDATA directories
    might get destroyed before the PostgresNode objects, resulting in attempts
    to delete PGDATA directories that still have live servers in them.  On
    Windows, this would lead to directory deletion failures; on Unix, it
    usually had no effects worse than erratic "could not open temporary
    statistics file "pg_stat/global.tmp": No such file or directory" log
    messages.
    
    While none of this would affect the reported result of the TAP test, which
    is already determined, it could be very confusing when one is trying to
    understand from the logs what went wrong with a failed test.
    
    To fix, do the postmaster shutdowns in an END block rather than at object
    destruction time.  The END block will execute at a well-defined (and
    reasonable) time during script termination, and it will stop the
    postmasters in order of PostgresNode object creation.  (Perhaps we should
    change that to be reverse order of creation, but the main point here is
    that we now have control which we did not before.)  Use "pg_ctl stop", not
    an asynchronous kill(SIGQUIT), so that we wait for the postmasters to shut
    down before proceeding with directory deletion.
    
    Deletion of temporary directories still happens in an unspecified order
    during global destruction, but I can see no reason to care about that
    once the postmasters are stopped.
    08af9219
PostgresNode.pm 29.7 KB