]> git.ipfire.org Git - thirdparty/postgresql.git/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: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.rxk6464azzl5t2fi@alap3.anarazel.de

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.