]> granicus.if.org Git - postgresql/commitdiff
Avoid useless palloc during transaction commit
authorAlvaro Herrera <alvherre@alvh.no-ip.org>
Fri, 20 Dec 2013 15:37:30 +0000 (12:37 -0300)
committerAlvaro Herrera <alvherre@alvh.no-ip.org>
Fri, 20 Dec 2013 15:37:30 +0000 (12:37 -0300)
We can allocate the initial relations-to-drop array when first needed,
instead of at function entry; this avoids allocating it when the
function is not going to do anything, which is most of the time.

Backpatch to 9.3, where this behavior was introduced by commit
279628a0a7cf5.

There's more that could be done here, such as possible reworking of the
code to avoid having to palloc anything, but that doesn't sound as
backpatchable as this relatively minor change.

Per complaint from Noah Misch in
20131031145234.GA621493@tornado.leadboat.com

src/backend/catalog/storage.c

index 971a149d590f72a3c0cc7cd0aa95ac1c86e73640..892f1636a90e854bb3bebec91b19d0167938307b 100644 (file)
@@ -314,8 +314,8 @@ smgrDoPendingDeletes(bool isCommit)
        PendingRelDelete *next;
        int                     nrels = 0,
                                i = 0,
-                               maxrels = 8;
-       SMgrRelation *srels = palloc(maxrels * sizeof(SMgrRelation));
+                               maxrels = 0;
+       SMgrRelation *srels = NULL;
 
        prev = NULL;
        for (pending = pendingDeletes; pending != NULL; pending = next)
@@ -340,8 +340,13 @@ smgrDoPendingDeletes(bool isCommit)
 
                                srel = smgropen(pending->relnode, pending->backend);
 
-                               /* extend the array if needed (double the size) */
-                               if (maxrels <= nrels)
+                               /* allocate the initial array, or extend it, if needed */
+                               if (maxrels == 0)
+                               {
+                                       maxrels = 8;
+                                       srels = palloc(sizeof(SMgrRelation) * maxrels );
+                               }
+                               else if (maxrels <= nrels)
                                {
                                        maxrels *= 2;
                                        srels = repalloc(srels, sizeof(SMgrRelation) * maxrels);
@@ -361,10 +366,9 @@ smgrDoPendingDeletes(bool isCommit)
 
                for (i = 0; i < nrels; i++)
                        smgrclose(srels[i]);
-       }
-
-       pfree(srels);
 
+               pfree(srels);
+       }
 }
 
 /*