/* * Do house keeping works when pgpool child process exits */ void child_exit(int code) { if (getpid() == mypid) { pool_log("child_exit: called from pgpool main. ignored."); return; } /* count down global connection counter */ if (accepted) connection_count_down(); /* prepare to shutdown connections to system db */ if(pool_config->parallel_mode || pool_config->enable_query_cache) { if (system_db_info->pgconn) pool_close_libpq_connection(); if (pool_system_db_connection()) pool_close(pool_system_db_connection()->con); } if (pool_config->memory_cache_enabled && !pool_is_shmem_cache()) { memcached_disconnect(); } /* let backend know now we are exiting */ if (pool_connection_pool) send_frontend_exits(); exit(code); }
int wd_escalation(void) { int rtn; pool_log("wd_escalation: escalating to master pgpool"); /* clear shared memory cache */ if (pool_config->memory_cache_enabled && pool_is_shmem_cache() && pool_config->clear_memqcache_on_escalation) { pool_log("wd_escalation: clear all the query cache on shared memory"); pool_clear_memory_cache(); } /* execute escalation command */ if (strlen(pool_config->wd_escalation_command)) { system(pool_config->wd_escalation_command); } /* interface up as delegate IP */ if (strlen(pool_config->delegate_IP) != 0) wd_IP_up(); /* set master status to the wd list */ wd_set_wd_list(pool_config->wd_hostname, pool_config->port, pool_config->wd_port, pool_config->delegate_IP, NULL, WD_MASTER); /* send declare packet */ rtn = wd_declare(); if (rtn == WD_OK) { pool_log("wd_escalation: escalated to master pgpool successfully"); } return rtn; }
/* * fork escalation process */ pid_t fork_escalation_process(void) { pid_t pid; pid = fork(); if (pid != 0) { if (pid == -1) ereport(NOTICE, (errmsg("failed to fork a escalation process"))); return pid; } on_exit_reset(); processType = PT_WATCHDOG_UTILITY; POOL_SETMASK(&UnBlockSig); init_ps_display("", "", "", ""); pool_signal(SIGTERM, wd_exit); pool_signal(SIGINT, wd_exit); pool_signal(SIGQUIT, wd_exit); pool_signal(SIGCHLD, SIG_DFL); pool_signal(SIGHUP, SIG_IGN); pool_signal(SIGPIPE, SIG_IGN); MemoryContextSwitchTo(TopMemoryContext); set_ps_display("watchdog escalation", false); ereport(LOG, (errmsg("watchdog: escalation started"))); /* * STEP 1 clear shared memory cache */ if (pool_config->memory_cache_enabled && pool_is_shmem_cache() && pool_config->clear_memqcache_on_escalation) { ereport(LOG, (errmsg("watchdog escalation"), errdetail("clearing all the query cache on shared memory"))); pool_clear_memory_cache(); } /* * STEP 2 execute escalation command provided by user in pgpool conf file */ if (strlen(pool_config->wd_escalation_command)) { int r = system(pool_config->wd_escalation_command); if (WIFEXITED(r)) { if (WEXITSTATUS(r) == EXIT_SUCCESS) ereport(LOG, (errmsg("watchdog escalation successful"))); else { ereport(WARNING, (errmsg("watchdog escalation command failed with exit status: %d", WEXITSTATUS(r)))); } } else { ereport(WARNING, (errmsg("watchdog escalation command exit abnormally"))); } } /* * STEP 3 bring up the delegate IP */ if (strlen(pool_config->delegate_IP) != 0) { if (wd_IP_up() != WD_OK) ereport(WARNING, (errmsg("watchdog escalation failed to acquire delegate IP"))); } exit(0); }