aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndres Freund <andres@anarazel.de>2017-04-10 11:56:46 -0700
committerAndres Freund <andres@anarazel.de>2017-04-10 11:56:46 -0700
commitc45b1d2283c6631b990de25098ea389a1b96277a (patch)
treeac2dadd948c23e315308822a775a5f339a049af4
parent8f0530f58061b185dc385df42e62d78a18d4ae3e (diff)
downloadpostgresql-c45b1d2283c6631b990de25098ea389a1b96277a.tar.gz
postgresql-c45b1d2283c6631b990de25098ea389a1b96277a.zip
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
-rw-r--r--src/backend/utils/mmgr/dsa.c2
1 files changed, 2 insertions, 0 deletions
diff --git a/src/backend/utils/mmgr/dsa.c b/src/backend/utils/mmgr/dsa.c
index 1456e213817..f09a9c0487d 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;