]> granicus.if.org Git - postgresql/commitdiff
Fix initialization of dsa.c free area counter.
authorAndres Freund <andres@anarazel.de>
Mon, 10 Apr 2017 18:56:46 +0000 (11:56 -0700)
committerAndres Freund <andres@anarazel.de>
Mon, 10 Apr 2017 18:56:46 +0000 (11:56 -0700)
The backend local copy of dsa_area_control->freed_segment_counter was
not properly initialized / maintained.  This could, if unlucky, lead
to keeping attached to a segment for too long.

Found via valgrind bleat on buildfarm animal skink.

Author: Thomas Munro
Discussion: https://postgr.es/m/20170407164935.obsf2jipjfos5zei@alap3.anarazel.de

src/backend/utils/mmgr/dsa.c

index 1456e213817283fafec657ef4dd80f3bd77ae914..f09a9c0487d475c8a399b5ecc217cccee9f967b1 100644 (file)
@@ -1244,6 +1244,7 @@ create_internal(void *place, size_t size,
        area->mapping_pinned = false;
        memset(area->segment_maps, 0, sizeof(dsa_segment_map) * DSA_MAX_SEGMENTS);
        area->high_segment_index = 0;
+       area->freed_segment_counter = 0;
        LWLockInitialize(&control->lock, control->lwlock_tranche_id);
        for (i = 0; i < DSA_NUM_SIZE_CLASSES; ++i)
                LWLockInitialize(DSA_SCLASS_LOCK(area, i),
@@ -1322,6 +1323,7 @@ attach_internal(void *place, dsm_segment *segment, dsa_handle handle)
                                 errmsg("could not attach to dynamic shared area")));
        }
        ++control->refcnt;
+       area->freed_segment_counter = area->control->freed_segment_counter;
        LWLockRelease(DSA_AREA_LOCK(area));
 
        return area;