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]