]> granicus.if.org Git - postgresql/commitdiff
Pass DSA_ALLOC_HUGE when allocating a shared TIDBitmap.
authorRobert Haas <rhaas@postgresql.org>
Mon, 27 Mar 2017 12:30:19 +0000 (08:30 -0400)
committerRobert Haas <rhaas@postgresql.org>
Mon, 27 Mar 2017 12:32:57 +0000 (08:32 -0400)
When creating an unshared TIDBitmap, we pass MCXT_ALLOC_HUGE to allow
allocations >1GB, so by analogy we pass DSA_ALLOC_HUGE for a shared
TIDBitmap.

Bug introduced by commit 98e6e89040a0534ca26914c66cae9dd49ef62ad9.
Report by Rafia Sabih, fix by Dilip Kumar, adjusted by me.

Discussion: http://postgr.es/m/CAOGQiiPpSnkuKq+oUK_bvQFg2EPGFPN8RwgxTgBa6HU_kQa3EA@mail.gmail.com

src/backend/nodes/tidbitmap.c

index ae7a913c12c77c0e6ca1b13c10011fe32572c45c..eab8f68356426dbabf91713fbf44553966188524 100644 (file)
@@ -1533,9 +1533,11 @@ pagetable_allocate(pagetable_hash *pagetable, Size size)
         * new memory so that pagetable_free can free the old entry.
         */
        tbm->dsapagetableold = tbm->dsapagetable;
-       tbm->dsapagetable = dsa_allocate0(tbm->dsa, sizeof(PTEntryArray) + size);
-
+       tbm->dsapagetable = dsa_allocate_extended(tbm->dsa,
+                                                                                         sizeof(PTEntryArray) + size,
+                                                                                       DSA_ALLOC_HUGE | DSA_ALLOC_ZERO);
        ptbase = dsa_get_address(tbm->dsa, tbm->dsapagetable);
+
        return ptbase->ptentry;
 }