Cancel CV sleep during subtransaction abort.
authorRobert Haas
Thu, 21 Dec 2017 14:09:04 +0000 (09:09 -0500)
committerRobert Haas
Thu, 21 Dec 2017 14:24:48 +0000 (09:24 -0500)
Generally, error recovery paths that need to do things like
LWLockReleaseAll and pgstat_report_wait_end also need to call
ConditionVariableCancelSleep, but AbortSubTransaction was missed.

Since subtransaction abort might destroy up the DSM segment that
contains the ConditionVariable stored in cv_sleep_target, this
can result in a crash for anything using condition variables.

Reported and diagnosed by Andres Freund.

Discussion: http://postgr.es/m/20171221110048[email protected]

src/backend/access/transam/xact.c

index 5e7e81220032b5b06ecd4f4a7bd53d4630878045..d43819a3e7f96207890bcd29ce126a9c55f56810 100644 (file)
@@ -4596,6 +4596,9 @@ AbortSubTransaction(void)
    /* Reset WAL record construction state */
    XLogResetInsertion();
 
+   /* Cancel condition variable sleep */
+   ConditionVariableCancelSleep();
+
    /*
     * Also clean up any open wait for lock, since the lock manager will choke
     * if we try to wait for another lock before doing this.