mirror of
https://github.com/postgres/postgres.git
synced 2025-12-18 05:01:01 +03:00
Switch memory contexts in ReinitializeParallelDSM.
We already do this in CreateParallelContext, InitializeParallelDSM, and LaunchParallelWorkers. I suspect the reason why the matching logic was omitted from ReinitializeParallelDSM is that I failed to realize that any memory allocation was happening here -- but shm_mq_attach does allocate, which could result in a shm_mq_handle being allocated in a shorter-lived context than the ParallelContext which points to it. That could result in a crash if the shorter-lived context is freed before the parallel context is destroyed. As far as I am currently aware, there is no way to reach a crash using only code that is present in core PostgreSQL, but extensions could potentially trip over this. Fixing this in the back-branches appears low-risk, so back-patch to all supported versions. Author: Jakub Wartak <jakub.wartak@enterprisedb.com> Co-authored-by: Jeevan Chalke <jeevan.chalke@enterprisedb.com> Backpatch-through: 14 Discussion: http://postgr.es/m/CAKZiRmwfVripa3FGo06=5D1EddpsLu9JY2iJOTgbsxUQ339ogQ@mail.gmail.com
This commit is contained in:
@@ -508,8 +508,12 @@ InitializeParallelDSM(ParallelContext *pcxt)
|
|||||||
void
|
void
|
||||||
ReinitializeParallelDSM(ParallelContext *pcxt)
|
ReinitializeParallelDSM(ParallelContext *pcxt)
|
||||||
{
|
{
|
||||||
|
MemoryContext oldcontext;
|
||||||
FixedParallelState *fps;
|
FixedParallelState *fps;
|
||||||
|
|
||||||
|
/* We might be running in a very short-lived memory context. */
|
||||||
|
oldcontext = MemoryContextSwitchTo(TopTransactionContext);
|
||||||
|
|
||||||
/* Wait for any old workers to exit. */
|
/* Wait for any old workers to exit. */
|
||||||
if (pcxt->nworkers_launched > 0)
|
if (pcxt->nworkers_launched > 0)
|
||||||
{
|
{
|
||||||
@@ -547,6 +551,9 @@ ReinitializeParallelDSM(ParallelContext *pcxt)
|
|||||||
pcxt->worker[i].error_mqh = shm_mq_attach(mq, pcxt->seg, NULL);
|
pcxt->worker[i].error_mqh = shm_mq_attach(mq, pcxt->seg, NULL);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Restore previous memory context. */
|
||||||
|
MemoryContextSwitchTo(oldcontext);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|||||||
Reference in New Issue
Block a user