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]