Use whichever coordinator available for running cluster commands
authorPavan Deolasee <[email protected]>
Wed, 18 Nov 2015 08:15:03 +0000 (13:45 +0530)
committerPavan Deolasee <[email protected]>
Wed, 18 Nov 2015 08:15:03 +0000 (13:45 +0530)
The utility had assumed that the first coordinator at index 0 will always be
available. But that may not be the case when we have actually removed the first
coordinator using "pgxc_ctl remove coordinator master <name>"

contrib/pgxc_ctl/config.c
contrib/pgxc_ctl/coord_cmd.c
contrib/pgxc_ctl/datanode_cmd.c
contrib/pgxc_ctl/do_command.c
contrib/pgxc_ctl/do_command.h

index 414046e21d1dafebef8c45900f7fd4322c99cb29..a3f9a4abb6819fe4a1e6cae6d0b43a7f72f98032 100644 (file)
@@ -336,6 +336,8 @@ static void emptyCoordSlaves()
                add_val(find_var(VAR_coordSlaveServers), "none");
                add_val(find_var(VAR_coordSlaveDirs), "none");
                add_val(find_var(VAR_coordArchLogDirs), "none");
+               add_val(find_var(VAR_coordSlavePorts), "none");
+               add_val(find_var(VAR_coordSlavePoolerPorts), "none");
        }
 }
 
@@ -355,8 +357,10 @@ static void emptyDatanodeSlaves()
        for (ii = 0; ii < arraySizeName(VAR_datanodeSlaveServers); ii++)
        {
                add_val(find_var(VAR_datanodeSlaveServers), "none");
-               add_val(find_var(VAR_coordSlaveDirs), "none");
-               add_val(find_var(VAR_coordArchLogDirs), "none");
+               add_val(find_var(VAR_datanodeSlaveDirs), "none");
+               add_val(find_var(VAR_datanodeArchLogDirs), "none");
+               add_val(find_var(VAR_datanodeSlavePorts), "-1");
+               add_val(find_var(VAR_datanodeSlavePoolerPorts), "-1");
        }
 }
 
index f34f6e476887579f668ae78d456f17b44bb48960..dc1c74edd7a4a0ca3be7719ce2a678370d868215 100644 (file)
@@ -104,9 +104,11 @@ cmd_t *prepare_initCoordinatorMaster(char *nodeName)
        appendCmdEl(cmdInitdb, (cmdPgConf = initCmd(aval(VAR_coordMasterServers)[jj])));
        snprintf(newCommand(cmdPgConf), MAXLINE,
                         "cat >> %s/postgresql.conf", aval(VAR_coordMasterDirs)[jj]);
-       if (!is_none(sval(VAR_coordExtraConfig)))
+       if (doesExist(VAR_coordExtraConfig, 0) &&
+               !is_none(sval(VAR_coordExtraConfig)))
                AddMember(confFiles, sval(VAR_coordExtraConfig));
-       if (!is_none(aval(VAR_coordSpecificExtraConfig)[jj]))
+       if (doesExist(VAR_coordSpecificExtraConfig, jj) &&
+               !is_none(aval(VAR_coordSpecificExtraConfig)[jj]))
                AddMember(confFiles, aval(VAR_coordSpecificExtraConfig)[jj]);
        if ((f = prepareLocalStdin((cmdPgConf->localStdin = Malloc(MAXPATH+1)), MAXPATH, confFiles)) == NULL)
        {
@@ -534,6 +536,7 @@ static cmd_t *prepare_configureDataNode(char *nodeName)
        int ii;
        int jj;
        int idx;
+       int connCordIndx;
        FILE *f;
        bool is_preferred;
 
@@ -545,11 +548,16 @@ static cmd_t *prepare_configureDataNode(char *nodeName)
        if (is_none(aval(VAR_datanodeMasterServers)[idx]))
                return NULL;
        cmd = initCmd(NULL);
+
        /* We use one of the coordinators to send queries to datanodes */
+       connCordIndx = get_any_available_coord(-1);
+       if (connCordIndx == -1)
+               return NULL;
+
        snprintf(newCommand(cmd), MAXLINE,
                         "psql -p %d -h %s -a %s %s",
-                        atoi(aval(VAR_coordPorts)[0]),
-                        aval(VAR_coordMasterServers)[0],
+                        atoi(aval(VAR_coordPorts)[connCordIndx]),
+                        aval(VAR_coordMasterServers)[connCordIndx],
                         sval(VAR_defaultDatabase),
                         sval(VAR_pgxcOwner));
        if ((f = prepareLocalStdin(newFilename(cmd->localStdin), MAXPATH, NULL)) == NULL)
@@ -937,6 +945,7 @@ int add_coordinatorMaster(char *name, char *host, int port, int pooler,
        char port_s[MAXTOKEN+1];
        char pooler_s[MAXTOKEN+1];
        int gtmPxyIdx;
+       int connCordIndx;
        char *gtmHost;
        char *gtmPort;
        char pgdumpall_out[MAXPATH+1];
@@ -1119,8 +1128,16 @@ int add_coordinatorMaster(char *name, char *host, int port, int pooler,
                pclose(f);
        }
 
+       /* find any available coordinator */
+       connCordIndx = get_any_available_coord(-1);
+       if (connCordIndx == -1)
+               return 1;
+
        /* Lock ddl */
-       if ((lockf = pgxc_popen_wRaw("psql -h %s -p %s %s", aval(VAR_coordMasterServers)[0], aval(VAR_coordPorts)[0], sval(VAR_defaultDatabase))) == NULL)
+       if ((lockf = pgxc_popen_wRaw("psql -h %s -p %s %s",
+                                       aval(VAR_coordMasterServers)[connCordIndx],
+                                       aval(VAR_coordPorts)[connCordIndx],
+                                       sval(VAR_defaultDatabase))) == NULL)
        {
                elog(ERROR, "ERROR: could not open psql command, %s\n", strerror(errno));
                return 1;
@@ -1131,7 +1148,8 @@ int add_coordinatorMaster(char *name, char *host, int port, int pooler,
        /* pg_dumpall */
        createLocalFileName(GENERAL, pgdumpall_out, MAXPATH);
        doImmediateRaw("pg_dumpall -p %s -h %s -s --include-nodes --dump-nodes --file=%s",
-                                  aval(VAR_coordPorts)[0], aval(VAR_coordMasterServers)[0], pgdumpall_out);
+                                  aval(VAR_coordPorts)[connCordIndx],
+                                  aval(VAR_coordMasterServers)[connCordIndx], pgdumpall_out);
 
        /* Start the new coordinator */
        doImmediate(host, NULL, "pg_ctl start -Z restoremode -D %s -o -i", dir);
@@ -1172,7 +1190,10 @@ int add_coordinatorMaster(char *name, char *host, int port, int pooler,
        {
                if (!is_none(aval(VAR_datanodeNames)[ii]))
                {
-                       if ((f = pgxc_popen_wRaw("psql -h %s -p %d %s", aval(VAR_coordMasterServers)[0], atoi(aval(VAR_coordPorts)[0]), sval(VAR_defaultDatabase))) == NULL)
+                       if ((f = pgxc_popen_wRaw("psql -h %s -p %d %s",
+                                                       aval(VAR_coordMasterServers)[connCordIndx],
+                                                       atoi(aval(VAR_coordPorts)[connCordIndx]),
+                                                       sval(VAR_defaultDatabase))) == NULL)
                        {
                                elog(ERROR, "ERROR: cannot connect to the coordinator master %s.\n", aval(VAR_coordNames)[ii]);
                                continue;
@@ -1499,12 +1520,9 @@ int remove_coordinatorMaster(char *name, int clean_opt)
        {
                if (doesExist(VAR_datanodeNames, ii) && !is_none(aval(VAR_datanodeNames)[ii]))
                {
-                       int coord_idx;
-
-                       if (idx == 0)
-                               coord_idx = 1;
-                       else
-                               coord_idx  = 0;
+                       int coord_idx = get_any_available_coord(idx);
+                       if (coord_idx == -1)
+                               return 1;
 
                        f = pgxc_popen_wRaw("psql -p %d -h %s %s", atoi(aval(VAR_coordPorts)[coord_idx]), aval(VAR_coordMasterServers)[coord_idx], sval(VAR_defaultDatabase));
                        if (f == NULL)
index 96baab8bfd029cd0075f15e0ffc5fb5c3c8085e9..48b01206cab2ab2c8af37faeedef187df17983e7 100644 (file)
@@ -101,9 +101,11 @@ cmd_t *prepare_initDatanodeMaster(char *nodeName)
                        "listen_addresses = '*'\n"
                        "max_connections = 100\n",
                        timeStampString(timeStamp, MAXTOKEN));
-       if (!is_none(sval(VAR_datanodeExtraConfig)))
+       if (doesExist(VAR_datanodeExtraConfig, 0) &&
+               !is_none(sval(VAR_datanodeExtraConfig)))
                AddMember(fileList, sval(VAR_datanodeExtraConfig));
-       if (!is_none(aval(VAR_datanodeSpecificExtraConfig)[idx]))
+       if (doesExist(VAR_datanodeSpecificExtraConfig, idx) &&
+               !is_none(aval(VAR_datanodeSpecificExtraConfig)[idx]))
                AddMember(fileList, aval(VAR_datanodeSpecificExtraConfig)[idx]);
        appendFiles(f, fileList);
        CleanArray(fileList);
@@ -915,6 +917,7 @@ int add_datanodeMaster(char *name, char *host, int port, int pooler, char *dir,
        char port_s[MAXTOKEN+1];
     char pooler_s[MAXTOKEN+1];
        int gtmPxyIdx;
+       int connCordIdx;
        char *gtmHost;
        char *gtmPort;
        char pgdumpall_out[MAXPATH+1];
@@ -1173,12 +1176,20 @@ int add_datanodeMaster(char *name, char *host, int port, int pooler, char *dir,
                }
        }
 
+       /* find any available coordinator */
+       connCordIdx = get_any_available_coord(-1);
+       if (connCordIdx == -1)
+               return 1;
+
        /* Issue CREATE NODE  on datanodes */
        for (ii = 0; aval(VAR_datanodeNames)[ii]; ii++)
        {
                if (!is_none(aval(VAR_datanodeNames)[ii]))
                {
-                       if ((f = pgxc_popen_wRaw("psql -h %s -p %s %s", aval(VAR_coordMasterServers)[0], aval(VAR_coordPorts)[0], sval(VAR_defaultDatabase))) == NULL)
+                       if ((f = pgxc_popen_wRaw("psql -h %s -p %s %s",
+                                                       aval(VAR_coordMasterServers)[connCordIdx],
+                                                       aval(VAR_coordPorts)[connCordIdx],
+                                                       sval(VAR_defaultDatabase))) == NULL)
                        {
                                elog(ERROR, "ERROR: cannot connect to the coordinator %s.\n", aval(VAR_coordNames)[0]);
                                continue;
@@ -1453,6 +1464,7 @@ int remove_datanodeMaster(char *name, int clean_opt)
         */
 
        int idx;
+       int connCordIdx;
        int ii;
        FILE *f;
        char **namelist = NULL;
@@ -1505,13 +1517,22 @@ int remove_datanodeMaster(char *name, int clean_opt)
                        pclose(f);
                }
        }
+
+       /* find any available coordinator */
+       connCordIdx = get_any_available_coord(-1);
+       if (connCordIdx == -1)
+               return 1;
+
        /* Issue DROP NODE  on datanodes */
        for (ii = 0; aval(VAR_datanodeNames)[ii]; ii++)
        {
                if (!is_none(aval(VAR_datanodeNames)[ii]) &&
                        strcmp(aval(VAR_datanodeNames)[ii], name) != 0)
                {
-                       if ((f = pgxc_popen_wRaw("psql -h %s -p %s %s", aval(VAR_coordMasterServers)[0], aval(VAR_coordPorts)[0], sval(VAR_defaultDatabase))) == NULL)
+                       if ((f = pgxc_popen_wRaw("psql -h %s -p %s %s",
+                                                       aval(VAR_coordMasterServers)[connCordIdx],
+                                                       aval(VAR_coordPorts)[connCordIdx],
+                                                       sval(VAR_defaultDatabase))) == NULL)
                        {
                                elog(ERROR, "ERROR: cannot connect to the coordinator %s.\n", aval(VAR_coordNames)[0]);
                                continue;
index d2d8333baff746a0b44b8436c1165203804351fe..9ff5f1034473af6f3c63e32fc4923ad729ba13a3 100644 (file)
@@ -2955,3 +2955,24 @@ do_show_help(char *line)
                          );
        }
 }
+
+int
+get_any_available_coord(int except)
+{
+       int ii;
+       for (ii = 0; aval(VAR_coordMasterServers)[ii]; ii++)
+       {
+               if (ii == except)
+                       continue;
+
+               if (!is_none(aval(VAR_coordMasterServers)[ii]))
+               {
+                       if (pingNode(aval(VAR_coordMasterServers)[ii],
+                                               aval(VAR_coordPorts)[ii]) == 0)
+                               return ii;
+               }
+       }
+
+       elog(ERROR, "ERROR: failed to find any running coordinator");
+       return -1;
+}
index 5c9c685991ee3ea1d7661d50f4d994ce31bb13a4..b24d64a8ef5a567745438736a6999af2c54366e1 100644 (file)
@@ -14,4 +14,5 @@
 extern int forceInit;
 extern void do_command(FILE *inf, FILE *outf);
 extern int  do_singleLine(char *buf, char *wkline);
+extern int get_any_available_coord(int except);
 #endif /* DO_COMMAND_H */