Re: "could not reattach to shared memory" on buildfarm member dory
Noah Misch <noah@leadboat.com>
On Mon, Apr 30, 2018 at 08:01:40PM -0400, Tom Lane wrote: > It's clear from dory's results that something is causing a 4MB chunk > of memory to get reserved in the process's address space, sometimes. > It might happen during the main MapViewOfFileEx call, or during the > preceding VirtualFree, or with my map/unmap dance in place, it might > happen during that. Frequently it doesn't happen at all, at least not > before the point where we've successfully done MapViewOfFileEx. But > if it does happen, and the chunk happens to get put in a spot that > overlaps where we want to put the shmem block, kaboom. > > What seems like a plausible theory at this point is that the apparent > asynchronicity is due to the allocation being triggered by a different > thread, and the fact that our added monitoring code seems to make the > failure more likely can be explained by that code changing the timing. > But what thread could it be? It doesn't really look to me like either > the signal thread or the timer thread could eat 4MB. syslogger.c > also spawns a thread, on Windows, but AFAICS that's not being used in > this test configuration. Maybe the reason dory is showing the problem > is something or other is spawning a thread we don't even know about? Likely some privileged daemon is creating a thread in every new process. (On Windows, it's not unusual for one process to create a thread in another process.) We don't have good control over that. > I'm at a loss for a reasonable way to fix it > for real. Is there a way to seize control of a Windows process so that > there are no other running threads? I think not. > Any other ideas? PostgreSQL could retry the whole process creation, analogous to internal_forkexec() retries. Have the failed process exit after recording the fact that it couldn't attach. Make the postmaster notice and spawn a replacement. Give up after 100 failed attempts.
Commits
-
Avoid "could not reattach" by providing space for concurrent allocation.
- 203886d3ae22 9.4.22 landed
- f5989b379cef 10.8 landed
- 7a5677818556 9.5.17 landed
- 57ebbbb8f15a 9.6.13 landed
- e45a8ff87149 11.3 landed
- 617dc6d299c9 12.0 landed
-
Assert that pgwin32_signal_initialize() has been called early enough.
- ab9ed9be2378 12.0 landed
-
Remove investigative code for can't-reattach-to-shared-memory errors.
- bcbf2346d69f 11.0 landed
-
Does it help to wait before reattaching?
- 23078689a992 11.0 landed
-
Map and unmap the shared memory block before risking VirtualFree.
- 73042b8d136f 11.0 landed
-
Further effort at preventing memory map dump from affecting the results.
- ce07aff48f15 11.0 landed
-
Remove Windows module-list-dumping code.
- f7df8043f08a 11.0 landed
-
Dump full memory maps around failing Windows reattach code.
- 6ba0cc4bd3a6 11.0 landed
-
Get still more info about Windows can't-reattach-to-shared-memory errors.
- eb16011f4c08 11.0 landed
-
Get more info about Windows can't-reattach-to-shared-memory errors.
- 68e7e973d222 11.0 landed
-
Try to get some info about Windows can't-reattach-to-shared-memory errors.
- 63ca350ef9f5 11.0 landed