]> granicus.if.org Git - postgresql/commitdiff
Cancel CV sleep during subtransaction abort.
authorRobert Haas <rhaas@postgresql.org>
Thu, 21 Dec 2017 14:09:04 +0000 (09:09 -0500)
committerRobert Haas <rhaas@postgresql.org>
Thu, 21 Dec 2017 14:24:30 +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.rxk6464azzl5t2fi@alap3.anarazel.de

src/backend/access/transam/xact.c

index e93d740b210d636fc85b1c03f5ac29a740f1d408..d430e662e6763411f198e3e32bbd09aec585f0db 100644 (file)
@@ -4717,6 +4717,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.