pgpool2.git / summary / log / commit / refs
commit 05a2891ecf0fd85c839dcd149b5c463ccbe24f6e
Author: Tatsuo Ishii <ishii@postgresql.org>
Date: Sat Apr 14 00:17:55 2012 +0000
Before using semaphore, block signals. Otherwise the process will exit
before unlocking semaphore by a signal interrupt.
child.c | 16 ++++++++++++++++
main.c | 7 +++++++
pool_memqcache.c | 37 +++++++++++++++++++++++++++++++++++--
3 files changed, 58 insertions(+), 2 deletions(-)
diff --git a/child.c b/child.c
index c3c087979..203e58000 100644
--- a/child.c
+++ b/child.c
@@ -1837,9 +1837,17 @@ static int s_do_auth(POOL_CONNECTION_POOL_SLOT *cp, char *password)
*/
static void connection_count_up(void)
{
+#ifdef HAVE_SIGPROCMASK
+ sigset_t oldmask;
+#else
+ int oldmask;
+#endif
+
+ POOL_SETMASK2(&BlockSig, &oldmask);
pool_semaphore_lock(CONN_COUNTER_SEM);
Req_info->conn_counter++;
pool_semaphore_unlock(CONN_COUNTER_SEM);
+ POOL_SETMASK(&oldmask);
}
/*
@@ -1848,6 +1856,13 @@ static void connection_count_up(void)
*/
static void connection_count_down(void)
{
+#ifdef HAVE_SIGPROCMASK
+ sigset_t oldmask;
+#else
+ int oldmask;
+#endif
+
+ POOL_SETMASK2(&BlockSig, &oldmask);
pool_semaphore_lock(CONN_COUNTER_SEM);
/*
* Make sure that we do not decrement too much. If failed to read
@@ -1860,6 +1875,7 @@ static void connection_count_down(void)
if (Req_info->conn_counter > 0)
Req_info->conn_counter--;
pool_semaphore_unlock(CONN_COUNTER_SEM);
+ POOL_SETMASK(&oldmask);
}
/*
diff --git a/main.c b/main.c
index d97af2b37..b2b3e0e93 100644
--- a/main.c
+++ b/main.c
@@ -1376,12 +1376,18 @@ void degenerate_backend_set(int *node_id_set, int count)
pid_t parent = getppid();
int i;
bool need_signal = false;
+#ifdef HAVE_SIGPROCMASK
+ sigset_t oldmask;
+#else
+ int oldmask;
+#endif
if (pool_config->parallel_mode)
{
return;
}
+ POOL_SETMASK2(&BlockSig, &oldmask);
pool_semaphore_lock(REQUEST_INFO_SEM);
Req_info->kind = NODE_DOWN_REQUEST;
for (i = 0; i < count; i++)
@@ -1408,6 +1414,7 @@ void degenerate_backend_set(int *node_id_set, int count)
kill(parent, SIGUSR1);
pool_semaphore_unlock(REQUEST_INFO_SEM);
+ POOL_SETMASK(&oldmask);
}
/* send promote node request using SIGUSR1 */
diff --git a/pool_memqcache.c b/pool_memqcache.c
index 7f4271a3f..5f1edbf3b 100644
--- a/pool_memqcache.c
+++ b/pool_memqcache.c
@@ -54,6 +54,12 @@
memcached_st *memc;
#endif
+#ifdef HAVE_SIGPROCMASK
+static sigset_t shmem_oldmask;
+#else
+static int shmem_oldmask;
+#endif
+
static char* encode_key(const char *s, char *buf, POOL_CONNECTION_POOL *backend);
#ifdef DEBUG
static void dump_cache_data(const char *data, size_t len);
@@ -550,8 +556,6 @@ POOL_STATUS pool_fetch_from_memory_cache(POOL_CONNECTION *frontend,
*foundp = false;
pool_shmem_lock();
-
-
sts = pool_fetch_cache(backend, contents, &qcache, &qcachelen);
pool_shmem_unlock();
@@ -2126,7 +2130,10 @@ static void pool_wipe_out_cache_block(POOL_CACHE_BLOCKID blockid)
static void pool_shmem_lock(void)
{
if (pool_is_shmem_cache())
+ {
+ POOL_SETMASK2(&BlockSig, &shmem_oldmask);
pool_semaphore_lock(SHM_CACHE_SEM);
+ }
}
/*
@@ -2135,7 +2142,10 @@ static void pool_shmem_lock(void)
static void pool_shmem_unlock(void)
{
if (pool_is_shmem_cache())
+ {
pool_semaphore_unlock(SHM_CACHE_SEM);
+ POOL_SETMASK2(&BlockSig, &shmem_oldmask);
+ }
}
/*
@@ -2789,14 +2799,21 @@ int pool_init_memqcache_stats(void)
POOL_QUERY_CACHE_STATS *pool_get_memqcache_stats(void)
{
static POOL_QUERY_CACHE_STATS mystats;
+#ifdef HAVE_SIGPROCMASK
+ sigset_t oldmask;
+#else
+ int oldmask;
+#endif
memset(&mystats, 0, sizeof(POOL_QUERY_CACHE_STATS));
if (stats)
{
+ POOL_SETMASK2(&BlockSig, &oldmask);
pool_semaphore_lock(QUERY_CACHE_STATS_SEM);
memcpy(&mystats, stats, sizeof(POOL_QUERY_CACHE_STATS));
pool_semaphore_unlock(QUERY_CACHE_STATS_SEM);
+ POOL_SETMASK(&oldmask);
}
return &mystats;
@@ -2818,9 +2835,17 @@ void pool_reset_memqcache_stats(void)
*/
long long int pool_stats_count_up_num_selects(long long int num)
{
+#ifdef HAVE_SIGPROCMASK
+ sigset_t oldmask;
+#else
+ int oldmask;
+#endif
+
+ POOL_SETMASK2(&BlockSig, &oldmask);
pool_semaphore_lock(QUERY_CACHE_STATS_SEM);
stats->num_selects += num;
pool_semaphore_unlock(QUERY_CACHE_STATS_SEM);
+ POOL_SETMASK(&oldmask);
return stats->num_selects;
}
@@ -2865,9 +2890,17 @@ void pool_tmp_stats_reset_num_selects(void)
*/
long long int pool_stats_count_up_num_cache_hits(void)
{
+#ifdef HAVE_SIGPROCMASK
+ sigset_t oldmask;
+#else
+ int oldmask;
+#endif
+
+ POOL_SETMASK2(&BlockSig, &oldmask);
pool_semaphore_lock(QUERY_CACHE_STATS_SEM);
stats->num_cache_hits++;
pool_semaphore_unlock(QUERY_CACHE_STATS_SEM);
+ POOL_SETMASK(&oldmask);
return stats->num_cache_hits;
}
[parent: 878d6619cfbd]