diff --git a/src/include/pcp/libpcp_ext.h b/src/include/pcp/libpcp_ext.h index 430a752..f8d97fa 100755 --- a/src/include/pcp/libpcp_ext.h +++ b/src/include/pcp/libpcp_ext.h @@ -293,6 +293,7 @@ extern PCPResultInfo * pcp_node_info(PCPConnInfo * pcpCon, int nid); extern PCPResultInfo * pcp_process_count(PCPConnInfo * pcpConn); extern PCPResultInfo * pcp_process_info(PCPConnInfo * pcpConn, int pid); +extern PCPResultInfo * pcp_reload_config(PCPConnInfo * pcpConn); extern PCPResultInfo * pcp_detach_node(PCPConnInfo * pcpConn, int nid); extern PCPResultInfo * pcp_detach_node_gracefully(PCPConnInfo * pcpConn, int nid); diff --git a/src/libs/pcp/pcp.c b/src/libs/pcp/pcp.c index 8a982ad..b1ee0c4 100755 --- a/src/libs/pcp/pcp.c +++ b/src/libs/pcp/pcp.c @@ -460,6 +460,13 @@ static PCPResultInfo * process_pcp_response(PCPConnInfo * pcpConn, char sentMsg) else process_command_complete_response(pcpConn, buf, rsize); break; + + case 'z': + if (sentMsg != 'Z') + setResultStatus(pcpConn, PCP_RES_BAD_RESPONSE); + else + process_command_complete_response(pcpConn, buf, rsize); + break; case 'w': if (sentMsg != 'W') @@ -893,6 +900,29 @@ pcp_process_count(PCPConnInfo * pcpConn) return process_pcp_response(pcpConn, 'N'); } +PCPResultInfo * +pcp_reload_config(PCPConnInfo * pcpConn) +{ + int wsize; + + if (PCPConnectionStatus(pcpConn) != PCP_CONNECTION_OK) + { + pcp_internal_error(pcpConn, "invalid PCP connection"); + return NULL; + } + + pcp_write(pcpConn->pcpConn, "Z", 1); + wsize = htonl(sizeof(int)); + pcp_write(pcpConn->pcpConn, &wsize, sizeof(int)); + if (PCPFlush(pcpConn) < 0) + return NULL; + if (pcpConn->Pfdebug) + fprintf(pcpConn->Pfdebug, "DEBUG: send: tos=\"Z\", len=%d\n", ntohl(wsize)); + + return process_pcp_response(pcpConn, 'Z'); +} + + static void free_processInfo(struct PCPConnInfo *pcpConn, void *ptr) { diff --git a/src/pcp_con/pcp_worker.c b/src/pcp_con/pcp_worker.c index db4b360..e538dfc 100755 --- a/src/pcp_con/pcp_worker.c +++ b/src/pcp_con/pcp_worker.c @@ -74,6 +74,7 @@ static void inform_process_info(PCP_CONNECTION * frontend, char *buf); static void inform_watchdog_info(PCP_CONNECTION * frontend, char *buf); static void inform_node_info(PCP_CONNECTION * frontend, char *buf); static void inform_node_count(PCP_CONNECTION * frontend); +static void process_reload_config(PCP_CONNECTION * frontend); static void process_detach_node(PCP_CONNECTION * frontend, char *buf, char tos); static void process_attach_node(PCP_CONNECTION * frontend, char *buf); static void process_recovery_request(PCP_CONNECTION * frontend, char *buf); @@ -87,6 +88,7 @@ static void pcp_worker_will_go_down(int code, Datum arg); static void do_pcp_flush(PCP_CONNECTION * frontend); static void do_pcp_read(PCP_CONNECTION * pc, void *buf, int len); + /* * main entry pont of pcp worker child process */ @@ -306,6 +308,11 @@ pcp_process_command(char tos, char *buf, int buf_len) process_status_request(pcp_frontend); break; + case 'Z': /* status request */ + set_ps_display("PCP: processing reload config request", false); + process_reload_config(pcp_frontend); + break; + case 'J': /* promote node */ case 'j': /* promote node gracefully */ set_ps_display("PCP: processing promote node request", false); @@ -915,6 +922,33 @@ inform_node_count(PCP_CONNECTION * frontend) errdetail("%d node(s) found", node_count))); } +static void +process_reload_config(PCP_CONNECTION * frontend) +{ + ereport(DEBUG1, + (errmsg("PCP: processing reload config"), + errdetail("reload config file begin"))); + + char code[] = "CommandComplete"; + char err_code[] = "CommandError"; + int wsize; + + if(kill(mypid,SIGHUP) == -1) + { + memset(code,0x0,sizeof(code)); + memcpy(code,err_code,strlen(err_code)+1); + } + pcp_write(frontend, "z", 1); + wsize = htonl(sizeof(code) + sizeof(int)); + pcp_write(frontend, &wsize, sizeof(int)); + pcp_write(frontend, code, sizeof(code)); + do_pcp_flush(frontend); + ereport(DEBUG1, + (errmsg("PCP: processing reload config"), + errdetail("reload config file end"))); +} + + static void process_detach_node(PCP_CONNECTION * frontend, char *buf, char tos) { diff --git a/src/tools/pcp/Makefile.am b/src/tools/pcp/Makefile.am index 19fbaeb..932e837 100755 --- a/src/tools/pcp/Makefile.am +++ b/src/tools/pcp/Makefile.am @@ -11,7 +11,8 @@ bin_PROGRAMS = pcp_stop_pgpool \ pcp_recovery_node \ pcp_promote_node \ pcp_pool_status \ - pcp_watchdog_info + pcp_watchdog_info\ + pcp_reload_config client_sources = pcp_frontend_client.c ../fe_memutils.c ../../utils/sprompt.c ../../utils/pool_path.c @@ -37,4 +38,6 @@ pcp_promote_node_SOURCES = $(client_sources) pcp_promote_node_LDADD = $(libs_dir)/pcp/libpcp.la pcp_watchdog_info_SOURCES = $(client_sources) pcp_watchdog_info_LDADD = $(libs_dir)/pcp/libpcp.la +pcp_reload_config_SOURCES = $(client_sources) +pcp_reload_config_LDADD = $(libs_dir)/pcp/libpcp.la diff --git a/src/tools/pcp/pcp_frontend_client.c b/src/tools/pcp/pcp_frontend_client.c index fa81557..19ed50a 100755 --- a/src/tools/pcp/pcp_frontend_client.c +++ b/src/tools/pcp/pcp_frontend_client.c @@ -65,6 +65,7 @@ typedef enum PCP_RECOVERY_NODE, PCP_STOP_PGPOOL, PCP_WATCHDOG_INFO, + PCP_RELOAD_CONFIG, UNKNOWN, } PCP_UTILITIES; @@ -89,6 +90,7 @@ struct AppTypes AllAppTypes[] = {"pcp_recovery_node", PCP_RECOVERY_NODE, "n:h:p:U:wWvd", "recover a node"}, {"pcp_stop_pgpool", PCP_STOP_PGPOOL, "m:h:p:U:wWvd", "terminate pgpool-II"}, {"pcp_watchdog_info", PCP_WATCHDOG_INFO, "n:h:p:U:wWvd", "display a pgpool-II watchdog's information"}, + {"pcp_reload_config",PCP_RELOAD_CONFIG,"n:h:p:U:wWvd", "reload a pgpool-II config file"}, {NULL, UNKNOWN, NULL, NULL}, }; struct AppTypes *current_app_type; @@ -403,7 +405,12 @@ main(int argc, char **argv) { pcpResInfo = pcp_watchdog_info(pcpConn, nodeID); } - + + else if (current_app_type->app_type == PCP_RELOAD_CONFIG) + { + pcpResInfo = pcp_reload_config(pcpConn); + } + else { /* should never happen */