summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--contrib/pgxc_monitor/pgxc_monitor.c142
-rw-r--r--doc-xc/src/sgml/pgxcmonitor.sgmlin20
2 files changed, 95 insertions, 67 deletions
diff --git a/contrib/pgxc_monitor/pgxc_monitor.c b/contrib/pgxc_monitor/pgxc_monitor.c
index bb341f5315..01f046e90a 100644
--- a/contrib/pgxc_monitor/pgxc_monitor.c
+++ b/contrib/pgxc_monitor/pgxc_monitor.c
@@ -12,24 +12,24 @@
* Options are:
* -Z nodetype What node type to monitor, gtm or node.
* gtm tests gtm, gtm_standby or gtm_proxy.
- * node tests coordinator or datanode.
+ * node tests Coordinator or Datanode.
* -p port Port number of the monitored node.
* -h host Host name or IP address of the monitored node.
- * -n nodename Specifies pgxc_monitor node name. Default is "pgxc_monitor"
- * -q Run in quiet mode. Default is quiet mode.
- * -v Run in verbose mdoe.
- * --help Prints the help message and exit with 0.
+ * -n nodename Specifies pgxc_monitor node name. Default is "pgxc_monitor"
+ * -q Run in quiet mode. Default is quiet mode.
+ * -v Run in verbose mode.
+ * --help Prints the help message and exits with 0.
*
- * When monitoring coordinator or datanode, -p and -h options can be
- * supplied via .pgpass file. If you use non-default target database name
+ * When monitoring Coordinator or Datanode, -p and -h options can be
+ * supplied via .pgpass file. If you use non-default target database name
* and username, they must also be supplied by .pgpass file.
* If password is needed, it must also be supplied by .pgpass file.
*
- * Monitoring coordinaor and datanode uses system(3) function. Therefore,
- * you should not use set-userid bit or set-groupid bit. Also, because
+ * Monitoring Coordinator and Datanode uses system(3) function. Therefore,
+ * you should not use set-userid bit or set-groupid bit. Also, because
* this uses psql command, psql must be in your PATH.
*
- * When testing coordinator/datanode, you must setup .pgpass file if you
+ * When testing Coordinator/Datanode, you must setup .pgpass file if you
* need to supply password, as well as non-default database name and username.
*
* If invalid parameters are given, error message will be printed even if
@@ -45,38 +45,45 @@
#include <stdlib.h>
#include <getopt.h>
-/*
- * GTM_Proxy and Datanode are for future extension.
- */
+/* Define all the node types */
typedef enum
{
- None = 0,
- GTM,
- GTM_Proxy,
- Coordinator,
- Datanode
+ NONE = 0,
+ GTM, /* GTM or GTM-proxy */
+ NODE /* Coordinator or Datanode */
} nodetype_t;
static char *progname;
-static nodetype_t nodetype = None;
-static char *port = NULL;
-static char *host = NULL;
-static char *nodename = NULL;
-static int verbose = 0;
#define Free(x) do{if((x)) free((x)); x = NULL;} while(0)
static void usage(void);
-static int do_gtm_ping(char *host, char *node, nodetype_t nodetype);
-static int do_node_ping(char *host, char *node);
-
+static int do_gtm_ping(char *host, char *node, nodetype_t nodetype, char *nodename, bool verbose);
+static int do_node_ping(char *host, char *node, bool verbose);
-int main (int ac, char *av[])
+int
+main(int ac, char *av[])
{
int opt;
+ nodetype_t nodetype = NONE;
+ char *port = NULL;
+ char *host = NULL;
+ char *nodename = NULL;
+ bool verbose = false;
progname = strdup(av[0]);
+ /* Print help if necessary */
+ if (ac > 1)
+ {
+ if (strcmp(av[1], "--help") == 0 || strcmp(av[1], "-?") == 0)
+ {
+ usage();
+ exit(0);
+ }
+ }
+
+ /* Scan options */
while ((opt = getopt(ac, av, "Z:h:n:p:qv")) != -1)
{
switch(opt)
@@ -85,7 +92,7 @@ int main (int ac, char *av[])
if (strcmp(optarg, "gtm") == 0)
nodetype = GTM;
else if (strcmp(optarg, "node") == 0)
- nodetype = Coordinator;
+ nodetype = NODE;
else
{
fprintf(stderr, "%s: invalid -Z option value.\n", progname);
@@ -105,43 +112,49 @@ int main (int ac, char *av[])
port = strdup(optarg);
break;
case 'q':
- verbose = 0;
+ verbose = false;
break;
case 'v':
- verbose = 1;
+ verbose = true;
break;
default:
fprintf(stderr, "%s: unknow option %c.\n", progname, opt);
exit(3);
}
}
- if (nodetype == None)
+
+ /* If no types are defined, well there is nothing to be done */
+ if (nodetype == NONE)
{
fprintf(stderr, "%s: -Z option is missing, it is mandatory.\n", progname);
usage();
exit(3);
}
+
switch(nodetype)
{
case GTM:
- case GTM_Proxy:
- exit(do_gtm_ping(host, port, nodetype));
- case Coordinator:
- case Datanode:
- exit(do_node_ping(host, port));
- case None:
+ exit(do_gtm_ping(host, port, nodetype, nodename, verbose));
+ case NODE:
+ exit(do_node_ping(host, port, verbose));
+ case NONE:
default:
break;
}
- fprintf(stderr, "%s: inernal error.\n", progname);
+
+ /* Should not happen */
+ fprintf(stderr, "%s: internal error.\n", progname);
exit(3);
}
-static int do_gtm_ping(char *host, char* port, nodetype_t nodetype)
+/*
+ * Ping a given GTM or GTM-proxy
+ */
+static int do_gtm_ping(char *host, char* port, nodetype_t nodetype, char *nodename, bool verbose)
{
char connect_str[256];
GTM_Conn *conn;
-
+
if (host == NULL)
{
fprintf(stderr, "%s: -h is mandatory for -Z gtm or -Z gtm_proxy\n", progname);
@@ -152,7 +165,7 @@ static int do_gtm_ping(char *host, char* port, nodetype_t nodetype)
fprintf(stderr, "%s: -p is mandatory for -Z gtm or -Z gtm_proxy\n", progname);
exit(3);
}
- sprintf(connect_str, "host=%s port=%s node_name=%s remote_type=%d postmaster=0",
+ sprintf(connect_str, "host=%s port=%s node_name=%s remote_type=%d postmaster=0",
host, port, nodename ? nodename : "pgxc_monitor", GTM_NODE_COORDINATOR);
if ((conn = PQconnectGTM(connect_str)) == NULL)
{
@@ -163,10 +176,13 @@ static int do_gtm_ping(char *host, char* port, nodetype_t nodetype)
GTMPQfinish(conn);
if (verbose)
printf("Running\n");
- return(0);
+ return 0;
}
-static int do_node_ping(char *host, char *node)
+/*
+ * Ping a given node
+ */
+static int do_node_ping(char *host, char *port, bool verbose)
{
int rc;
int exitStatus;
@@ -175,14 +191,20 @@ static int do_node_ping(char *host, char *node)
char *verbose_out = "";
char *out = verbose ? verbose_out : quiet_out;
- if (host && node)
- sprintf(command_line, "psql -h %s -p %s -w -q -c \"select 1 a\" %s", host, node, out);
- else if (host)
- sprintf(command_line, "psql -h %s -w -q -c \"select 1 a\" %s", host, out);
- else if (node)
- sprintf(command_line, "psql -p %p -w -q -c \"select 1 a\" %s", port, out);
- else
- sprintf(command_line, "psql -w -q -c \"select 1 a\" %s", out);
+ /* Build psql command launched to node */
+ sprintf(command_line, "psql -w -q -c \"select 1 a\"");
+
+ /* Then add options if necessary */
+ if (host)
+ sprintf(command_line, "%s -h %s", command_line, host);
+ if (port)
+ sprintf(command_line, "%s -p %s", command_line, port);
+
+ /* Add database name, here default database, postgres, is used */
+ sprintf(command_line, "%s postgres", command_line);
+ sprintf(command_line, "%s %s", command_line, out);
+
+ /* Launch the command and output result if necessary */
rc = system(command_line);
exitStatus = WEXITSTATUS(rc);
if (verbose)
@@ -192,20 +214,26 @@ static int do_node_ping(char *host, char *node)
else
printf("Not running\n");
}
-
- return(exitStatus);
+
+ return exitStatus;
}
+/*
+ * Show help information
+ */
static void usage(void)
{
printf("pgxc_monitor -Z nodetype -p port -h host\n\n");
printf("Options are:\n");
printf(" -Z nodetype What node type to monitor, gtm, gtm_proxy,\n");
printf(" coordinator, or datanode.\n");
- printf(" -h host Host name or IP address of the monitored node. Mandatory for -Z gtm or -Z gtm_proxy\n");
- printf(" -n nodename Nodename of this pgxc_monitor. Only for -Z gtm or -Z gtm_proxy. Default is pgxc_monitor\n");
- printf(" -p port Port number of the monitored node. Mandatory for -Z gtm or -Z gtm_proxy\n");
+ printf(" -h host Host name or IP address of the monitored node.\n");
+ printf(" Mandatory for -Z gtm or -Z gtm_proxy\n");
+ printf(" -n nodename Nodename of this pgxc_monitor.\n");
+ printf(" Only for -Z gtm or -Z gtm_proxy. Default is pgxc_monitor\n");
+ printf(" This identifies what is the name of component connecting to GTM.");
+ printf(" -p port Port number of the monitored node. Mandatory for -Z gtm or -Z gtm_proxy\n");
printf(" -q Quiet mode.\n");
printf(" -v Verbose mode.\n");
- printf(" --help Prints the help message and exit with 0.\n");
+ printf(" --help Prints the help message and exits with 0.\n");
}
diff --git a/doc-xc/src/sgml/pgxcmonitor.sgmlin b/doc-xc/src/sgml/pgxcmonitor.sgmlin
index a9dc64612e..eac36d4d8e 100644
--- a/doc-xc/src/sgml/pgxcmonitor.sgmlin
+++ b/doc-xc/src/sgml/pgxcmonitor.sgmlin
@@ -4,8 +4,8 @@
<title>pgxc_monitor</title>
- <indexterm zone="pgxcclean">
- <primary>pgxc_monitorn</primary>
+ <indexterm zone="pgxcmonitor">
+ <primary>pgxc_monitor</primary>
</indexterm>
<sect2>
@@ -20,7 +20,7 @@ pgxc_monitor <optional> <replaceable>option</> </optional>
</para>
<para>
- <application>pgxc_clean</application> is Postgres-XC utility to test if
+ <application>pgxc_monitor</application> is a <productname>Postgres-XC</> utility to test if
the target node is running.
</para>
@@ -47,8 +47,8 @@ pgxc_monitor <optional> <replaceable>option</> </optional>
<term><option>-Z <replaceable class="parameter">nodetype</replaceable></option></term>
<listitem>
<para>
- Type of node to test. Specify gtm for gtm and gtm_proxy.
- Specify node for coordinator and datanode.
+ Type of node type to test. Specify gtm as <replaceable>nodetype</replaceable> for gtm and gtm_proxy.
+ Specify node as <replaceable>nodeopt</replaceable> for a Coordinator or a Datanode.
</para>
</listitem>
</varlistentry>
@@ -66,7 +66,7 @@ pgxc_monitor <optional> <replaceable>option</> </optional>
<term><option>-n <replaceable class="parameter">nodename</replaceable></></term>
<listitem>
<para>
- Nodename to use when testing gtm or gtm_proxy.
+ Node name to use when testing gtm or gtm_proxy.
Default value is <literal>pgxc_monitor</literal>.
</para>
</listitem>
@@ -85,7 +85,7 @@ pgxc_monitor <optional> <replaceable>option</> </optional>
<term><option>-q</></term>
<listitem>
<para>
- Surpress messages as much as possible.
+ Quiet mode. Supress messages as much as possible.
</para>
</listitem>
</varlistentry>
@@ -94,7 +94,7 @@ pgxc_monitor <optional> <replaceable>option</> </optional>
<term><option>-v</></term>
<listitem>
<para>
- Prints as many messages as possible.
+ Verbose mode. Prints as many messages as possible.
</para>
</listitem>
</varlistentry>
@@ -116,7 +116,7 @@ pgxc_monitor <optional> <replaceable>option</> </optional>
<title>Options</title>
<para>
- When monitoring coordinator or datanode, <option>-p</option> and
+ When monitoring Coordinator or Datanode, <option>-p</option> and
<option>-h</option> options can be supplied using
<literal>.pgpass</literal> file.
If you use non-default target database name, and username, as well as
@@ -128,7 +128,7 @@ pgxc_monitor <optional> <replaceable>option</> </optional>
<option>.pgpass</option> file too.
</para>
<para>
- Monitoring coordinaor and datanode uses system(3) function.
+ Monitoring Coordinator and Datanode uses system(3) function.
Therefore,you should not use set-userid bit or set-groupid bit.
Also, because this uses psql command, psql must be in your PATH.
</para>