Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit 1b468a1

Browse files
committed
Fix the fallback memory barrier implementation to be reentrant.
This was essentially "broken" since 0c8eda6; but until more recently (14e8803) barriers usage in signal handlers was infrequent. The failure to be reentrant was noticed because the test_shm_mq, which uses memory barriers at a high frequency, occasionally got stuck on some solaris buildfarm animals. Turns out, those machines use sun studio 12.1, which doesn't yet have efficient memory barrier support. A machine with a newer sun studio did not fail. Forcing the barrier fallback to be used on x86 allows to reproduce the problem. The new fallback is to use kill(PostmasterPid, 0) based on the theory that that'll always imply a barrier due to checking the liveliness of PostmasterPid on systems old enough to need fallback support. It's hard to come up with a good and performant fallback. I'm not backpatching this for now - the problem isn't active in the back branches, and we haven't backpatched barrier changes for now. Additionally master looks entirely different than the back branches due to the new atomics abstraction. It seems better to let this rest in master, where the non-reentrancy actively causes a problem, and then consider backpatching. Found-By: Robert Haas Discussion: 55626265.3060800@dunslane.net
1 parent 5ca6118 commit 1b468a1

File tree

1 file changed

+19
-2
lines changed

1 file changed

+19
-2
lines changed

src/backend/port/atomics.c

+19-2
Original file line numberDiff line numberDiff line change
@@ -20,15 +20,32 @@
2020
*/
2121
#define ATOMICS_INCLUDE_DEFINITIONS
2222

23+
#include "miscadmin.h"
2324
#include "port/atomics.h"
2425
#include "storage/spin.h"
2526

27+
#ifdef PG_HAVE_MEMORY_BARRIER_EMULATION
28+
#ifdef WIN32
29+
#error "barriers are required (and provided) on WIN32 platforms"
30+
#endif
31+
#include <sys/types.h>
32+
#include <signal.h>
33+
#endif
34+
2635
#ifdef PG_HAVE_MEMORY_BARRIER_EMULATION
2736
void
2837
pg_spinlock_barrier(void)
2938
{
30-
S_LOCK(&dummy_spinlock);
31-
S_UNLOCK(&dummy_spinlock);
39+
/*
40+
* NB: we have to be reentrant here, some barriers are placed in signal
41+
* handlers.
42+
*
43+
* We use kill(0) for the fallback barrier as we assume that kernels on
44+
* systems old enough to require fallback barrier support will include an
45+
* appropriate barrier while checking the existence of the postmaster
46+
* pid.
47+
*/
48+
(void) kill(PostmasterPid, 0);
3249
}
3350
#endif
3451

0 commit comments

Comments
 (0)