From: Andres Freund Date: Mon, 10 Apr 2017 18:56:46 +0000 (-0700) Subject: Fix initialization of dsa.c free area counter. X-Git-Tag: REL_10_BETA1~313 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=c45b1d2283c6631b990de25098ea389a1b96277a;p=postgresql Fix initialization of dsa.c free area counter. 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 --- diff --git a/src/backend/utils/mmgr/dsa.c b/src/backend/utils/mmgr/dsa.c index 1456e21381..f09a9c0487 100644 --- a/src/backend/utils/mmgr/dsa.c +++ b/src/backend/utils/mmgr/dsa.c @@ -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;