]> granicus.if.org Git - postgresql/commitdiff
Don't allocate memory inside an Assert() iff in a critical section.
authorAndres Freund <andres@anarazel.de>
Sat, 24 May 2014 23:37:52 +0000 (01:37 +0200)
committerAndres Freund <andres@anarazel.de>
Sun, 25 May 2014 15:54:53 +0000 (17:54 +0200)
HeapTupleHeaderGetCmax() asserts that it is only used if the tuple has
been updated by the current transaction. That check is correct and
sensible but requires allocating memory if xmax is a multixact. When
wal_level is set to logical cmax needs to be included in a wal record
, generated inside a critical section, which can trigger the assertion
added in 4a170ee9e.

Reported-By: Steve Singer
src/backend/utils/time/combocid.c

index 52b612b15a1cec78fa39e3f79399d4bc6e169b54..a70c7542c92d624114beeae6499a5db2abb7bb2d 100644 (file)
@@ -41,6 +41,7 @@
 
 #include "postgres.h"
 
+#include "miscadmin.h"
 #include "access/htup_details.h"
 #include "access/xact.h"
 #include "utils/combocid.h"
@@ -119,7 +120,14 @@ HeapTupleHeaderGetCmax(HeapTupleHeader tup)
        CommandId       cid = HeapTupleHeaderGetRawCommandId(tup);
 
        Assert(!(tup->t_infomask & HEAP_MOVED));
-       Assert(TransactionIdIsCurrentTransactionId(HeapTupleHeaderGetUpdateXid(tup)));
+       /*
+        * Because GetUpdateXid() performs memory allocations if xmax is a
+        * multixact we can't Assert() if we're inside a critical section. This
+        * weakens the check, but not using GetCmax() inside one would complicate
+        * things too much.
+        */
+       Assert(CritSectionCount > 0 ||
+                  TransactionIdIsCurrentTransactionId(HeapTupleHeaderGetUpdateXid(tup)));
 
        if (tup->t_infomask & HEAP_COMBOCID)
                return GetRealCmax(cid);