Commit 2455ab48 authored by Robert Haas's avatar Robert Haas

Defend against leaks into RelationBuildPartitionDesc.

In normal builds, this isn't very important, because the leaks go
into fairly short-lived contexts, but under CLOBBER_CACHE_ALWAYS,
this can result in leaking hundreds of megabytes into MessageContext,
which probably explains recent failures on hyrax.

This may or may not be the best long-term strategy for dealing
with this leak, but we can change it later if we come up with
something better.  For now, do this to make the buildfarm green
again (hopefully).  Commit 898e5e32
seems to have exacerbated this problem for reasons that are not
quite clear, but I don't believe it's actually the cause.

Discussion: http://postgr.es/m/CA+TgmoY3bRmGB6-DUnoVy5fJoreiBJ43rwMrQRCdPXuKt4Ykaw@mail.gmail.com
parent c6ff0b89
......@@ -68,6 +68,17 @@ RelationBuildPartitionDesc(Relation rel)
PartitionKey key = RelationGetPartitionKey(rel);
MemoryContext oldcxt;
int *mapping;
MemoryContext rbcontext = NULL;
/*
* While building the partition descriptor, we create various temporary
* data structures; in CLOBBER_CACHE_ALWAYS mode, at least, it's important
* not to leak them, since this can get called a lot.
*/
rbcontext = AllocSetContextCreate(CurrentMemoryContext,
"RelationBuildPartitionDesc",
ALLOCSET_DEFAULT_SIZES);
oldcxt = MemoryContextSwitchTo(rbcontext);
/*
* Get partition oids from pg_inherits. This uses a single snapshot to
......@@ -180,7 +191,7 @@ RelationBuildPartitionDesc(Relation rel)
MemoryContextCopyAndSetIdentifier(rel->rd_pdcxt,
RelationGetRelationName(rel));
oldcxt = MemoryContextSwitchTo(rel->rd_pdcxt);
MemoryContextSwitchTo(rel->rd_pdcxt);
partdesc = (PartitionDescData *) palloc0(sizeof(PartitionDescData));
partdesc->nparts = nparts;
/* oids and boundinfo are allocated below. */
......@@ -189,7 +200,11 @@ RelationBuildPartitionDesc(Relation rel)
if (nparts == 0)
{
/* We can exit early in this case. */
rel->rd_partdesc = partdesc;
/* Blow away the temporary context. */
MemoryContextDelete(rbcontext);
return;
}
......@@ -220,6 +235,9 @@ RelationBuildPartitionDesc(Relation rel)
MemoryContextSwitchTo(oldcxt);
rel->rd_partdesc = partdesc;
/* Blow away the temporary context. */
MemoryContextDelete(rbcontext);
}
/*
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment