pgpool2.git / summary / log / commit / refs

commit    1e26fa7903d668fd48a59e0af3bb40025bb466b0
Author:   Tatsuo Ishii <ishii@postgresql.org>
Date:     Wed Oct 04 08:51:58 2017 +0000

    Add "role" field to pcp_node_info command.
    
    Role is the server role: one of "primary", "standby", "master" and
    "slave".


doc.ja/src/sgml/ref/pcp_node_info.sgml | 7 ++++++- doc/src/sgml/ref/pcp_node_info.sgml | 14 +++++++++----- src/include/pcp/libpcp_ext.h | 12 +++++++++++- src/libs/pcp/pcp.c | 7 +++++++ src/pcp_con/pcp_worker.c | 25 ++++++++++++++++++++++--- src/tools/pcp/pcp_frontend_client.c | 19 +++++++++++++++---- 6 files changed, 70 insertions(+), 14 deletions(-) diff --git a/doc.ja/src/sgml/ref/pcp_node_info.sgml b/doc.ja/src/sgml/ref/pcp_node_info.sgml index 0d67eec96..17fc38601 100644 --- a/doc.ja/src/sgml/ref/pcp_node_info.sgml +++ b/doc.ja/src/sgml/ref/pcp_node_info.sgml @@ -93,7 +93,7 @@ Pgpool-II documentation ここでは例を示します。 <programlisting> $ pcp_node_info -h localhost -U postgres 0 -host1 5432 1 1073741823.500000 waiting +host1 5432 1 1073741823.500000 waiting primary </programlisting> </para> <para> @@ -107,11 +107,15 @@ host1 5432 1 1073741823.500000 waiting 2. port number 3. status 4. load balance weight +5. status name +6. backend role --> 1. ノードのホスト名 2. ノードのポート番号 3. ステータス 4. ロードバランスウェイト +5. バックエンド状態名 +6. バックエンドの役割 </literallayout> </para> <para> @@ -151,6 +155,7 @@ Port : 5432 Status : 1 Weight : 0.5 Status Name: waiting +Role : primary </programlisting> </refsect1> diff --git a/doc/src/sgml/ref/pcp_node_info.sgml b/doc/src/sgml/ref/pcp_node_info.sgml index fedd3ce24..0c022a27f 100644 --- a/doc/src/sgml/ref/pcp_node_info.sgml +++ b/doc/src/sgml/ref/pcp_node_info.sgml @@ -69,7 +69,7 @@ Pgpool-II documentation Here is an example output: <programlisting> $ pcp_node_info -h localhost -U postgres 0 -host1 5432 1 1073741823.500000 +host1 5432 1 1073741823.500000 waiting primary </programlisting> </para> <para> @@ -79,6 +79,8 @@ host1 5432 1 1073741823.500000 2. port number 3. status 4. load balance weight +5. status name +6. backend role </literallayout> </para> <para> @@ -98,10 +100,12 @@ host1 5432 1 1073741823.500000 </para> <programlisting> $ pcp_node_info --verbose -h localhost -U postgres 0 -Hostname: host1 -Port : 5432 -Status : 1 -Weight : 0.5 +Hostname : host1 +Port : 5432 +Status : 1 +Weight : 0.5 +Status Name: waiting +Role : primary </programlisting> </refsect1> diff --git a/src/include/pcp/libpcp_ext.h b/src/include/pcp/libpcp_ext.h index 5a552ee2a..4c9610770 100644 --- a/src/include/pcp/libpcp_ext.h +++ b/src/include/pcp/libpcp_ext.h @@ -4,7 +4,7 @@ * pgpool: a language independent connection pool server for PostgreSQL * written by Tatsuo Ishii * - * Copyright (c) 2003-2016 PgPool Global Development Group + * Copyright (c) 2003-2017 PgPool Global Development Group * * Permission to use, copy, modify, and distribute this software and * its documentation for any purpose and without fee is hereby @@ -64,6 +64,13 @@ typedef struct { BACKEND_STATUS status[MAX_NUM_BACKENDS]; } BackendStatusRecord; +typedef enum { + ROLE_MASTER, + ROLE_SLAVE, + ROLE_PRIMARY, + ROLE_STANDBY +} SERVER_ROLE; + /* * PostgreSQL backend descriptor. Placed on shared memory area. */ @@ -77,6 +84,7 @@ typedef struct { unsigned short flag; /* various flags */ bool quarantine; /* true if node is CON_DOWN because of quarantine */ uint64 standby_delay; /* The replication delay against the primary */ + SERVER_ROLE role; /* Role of server. Only used by pcp_node_info */ } BackendInfo; typedef struct { @@ -281,6 +289,8 @@ extern int pcp_result_slot_count(PCPResultInfo* res); extern char *pcp_get_last_error(PCPConnInfo* pcpConn); extern int pcp_result_is_empty(PCPResultInfo* res); + +extern char *role_to_str(SERVER_ROLE role); /* ------------------------------ * pcp_error.c * ------------------------------ diff --git a/src/libs/pcp/pcp.c b/src/libs/pcp/pcp.c index 753ccb898..eb78bbb0a 100644 --- a/src/libs/pcp/pcp.c +++ b/src/libs/pcp/pcp.c @@ -700,6 +700,13 @@ process_node_info_response(PCPConnInfo* pcpConn, char* buf, int len) index +=1; backend_info->backend_weight = atof(index); + index = (char *) memchr(index, '\0', len); + if(index == NULL) + goto INVALID_RESPONSE; + + index++; + backend_info->role = atoi(index); + if (setNextResultBinaryData(pcpConn->pcpResInfo, (void *)backend_info, sizeof(BackendInfo) , NULL) < 0) goto INVALID_RESPONSE; diff --git a/src/pcp_con/pcp_worker.c b/src/pcp_con/pcp_worker.c index 658b461e5..952904a1e 100644 --- a/src/pcp_con/pcp_worker.c +++ b/src/pcp_con/pcp_worker.c @@ -4,7 +4,7 @@ * pgpool: a language independent connection pool server for PostgreSQL * written by Tatsuo Ishii * - * Copyright (c) 2003-2016 PgPool Global Development Group + * Copyright (c) 2003-2017 PgPool Global Development Group * * Permission to use, copy, modify, and distribute this software and * its documentation for any purpose and without fee is hereby @@ -86,7 +86,6 @@ 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 */ @@ -811,8 +810,10 @@ inform_node_info(PCP_CONNECTION *frontend,char *buf) char port_str[6]; char status[2]; char weight_str[20]; + char role_str[10]; char code[] = "CommandComplete"; BackendInfo *bi = NULL; + SERVER_ROLE role; node_id = atoi(buf); @@ -830,6 +831,22 @@ inform_node_info(PCP_CONNECTION *frontend,char *buf) snprintf(port_str, sizeof(port_str), "%d", bi->backend_port); snprintf(status, sizeof(status), "%d", bi->backend_status); snprintf(weight_str, sizeof(weight_str), "%f", bi->backend_weight); + + if (STREAM) + { + if (Req_info->primary_node_id == node_id) + role = ROLE_PRIMARY; + else + role = ROLE_STANDBY; + } + else + { + if (Req_info->master_node_id == node_id) + role = ROLE_MASTER; + else + role = ROLE_SLAVE; + } + snprintf(role_str, sizeof(role_str), "%d", role); pcp_write(frontend, "i", 1); wsize = htonl(sizeof(code) + @@ -837,6 +854,7 @@ inform_node_info(PCP_CONNECTION *frontend,char *buf) strlen(port_str)+1 + strlen(status)+1 + strlen(weight_str)+1 + + strlen(role_str)+1 + sizeof(int)); pcp_write(frontend, &wsize, sizeof(int)); pcp_write(frontend, code, sizeof(code)); @@ -844,6 +862,8 @@ inform_node_info(PCP_CONNECTION *frontend,char *buf) pcp_write(frontend, port_str, strlen(port_str)+1); pcp_write(frontend, status, strlen(status)+1); pcp_write(frontend, weight_str, strlen(weight_str)+1); + + pcp_write(frontend, role_str, strlen(role_str)+1); do_pcp_flush(frontend); } @@ -1289,4 +1309,3 @@ static void pcp_worker_will_go_down(int code, Datum arg) POOL_SETMASK(&UnBlockSig); } - diff --git a/src/tools/pcp/pcp_frontend_client.c b/src/tools/pcp/pcp_frontend_client.c index 8f388ea95..2fbe85e8d 100644 --- a/src/tools/pcp/pcp_frontend_client.c +++ b/src/tools/pcp/pcp_frontend_client.c @@ -466,19 +466,21 @@ output_nodeinfo_result(PCPResultInfo* pcpResInfo, bool verbose) if (verbose) { - printf("Hostname : %s\nPort : %d\nStatus : %d\nWeight : %f\nStatus Name: %s\n", + printf("Hostname : %s\nPort : %d\nStatus : %d\nWeight : %f\nStatus Name: %s\nRole : %s\n", backend_info->backend_hostname, backend_info->backend_port, backend_info->backend_status, backend_info->backend_weight/RAND_MAX, - backend_status_to_string(backend_info)); + backend_status_to_string(backend_info), + role_to_str(backend_info->role)); } else { - printf("%s %d %d %f %s\n", + printf("%s %d %d %f %s %s\n", backend_info->backend_hostname, backend_info->backend_port, backend_info->backend_status, backend_info->backend_weight/RAND_MAX, - backend_status_to_string(backend_info)); + backend_status_to_string(backend_info), + role_to_str(backend_info->role)); } } @@ -809,3 +811,12 @@ static char* backend_status_to_string(BackendInfo *bi) } return statusName; } + +/* Convert enum role to string */ +char *role_to_str(SERVER_ROLE role) +{ + static char *role_str[] = {"master", "slave", "primary", "standby"}; + if (role < ROLE_MASTER || role > ROLE_STANDBY) + return "unknown"; + return role_str[role]; +} [parent: 12bd99bdc274]