Check if target directory is empty (if it already exists) on the remote node.
authorPavan Deolasee <[email protected]>
Fri, 15 Jan 2016 07:15:54 +0000 (12:45 +0530)
committerPavan Deolasee <[email protected]>
Fri, 15 Jan 2016 07:15:54 +0000 (12:45 +0530)
We were wrongly doing this check on the local node, which was clearly wrong.

contrib/pgxc_ctl/coord_cmd.c
contrib/pgxc_ctl/datanode_cmd.c
contrib/pgxc_ctl/gtm_cmd.c

index 9837e5b0d09a4dfdd4909a1886643ffa9f72d419..5d8bbbae8413b4c07e8c8037d3156b02762460eb 100644 (file)
@@ -64,6 +64,7 @@ cmd_t *prepare_initCoordinatorMaster(char *nodeName)
        char localStdin[MAXPATH+1];
        char *gtmHost, *gtmPort;
        char timestamp[MAXTOKEN+1];
+       char remoteDirCheck[MAXPATH * 2 + 128];
 
        /* Reset coordinator master directory and run initdb */
        if ((jj = coordIdx(nodeName)) < 0)
@@ -78,18 +79,24 @@ cmd_t *prepare_initCoordinatorMaster(char *nodeName)
                return(NULL);
        }
 
-       if ((pgxc_check_dir(aval(VAR_coordMasterDirs)[jj]) == 2) && !forceInit)
+       remoteDirCheck[0] = '\0';
+       if (!forceInit)
        {
-               elog(ERROR, "ERROR: target coordinator directory %s exists and is not empty. Skip initilialization.\n",
-                               aval(VAR_coordMasterDirs)[jj]); 
-               return NULL;
+               sprintf(remoteDirCheck, "if [ \"$(ls -A %s 2> /dev/null)\" ]; then echo 'ERROR: "
+                               "target directory (%s) exists and not empty. "
+                               "Skip Coordinator initilialization'; exit; fi",
+                               aval(VAR_coordMasterDirs)[jj],
+                               aval(VAR_coordMasterDirs)[jj]
+                          );
        }
 
        cmd = cmdInitdb = initCmd(aval(VAR_coordMasterServers)[jj]);
        snprintf(newCommand(cmdInitdb), MAXLINE, 
+                        "%s;"
                         "rm -rf %s;"
                         "mkdir -p %s;"
                         "initdb --nodename %s -D %s",
+                        remoteDirCheck,
                         aval(VAR_coordMasterDirs)[jj],
                         aval(VAR_coordMasterDirs)[jj],
                         nodeName,
index bcad4bf02a7d24158325284efdbae9e6269bf35e..cbc12400ad19dfff838b1877f7fceee38106c2e3 100644 (file)
@@ -64,21 +64,30 @@ cmd_t *prepare_initDatanodeMaster(char *nodeName)
        char **fileList = NULL;
        FILE *f;
        char timeStamp[MAXTOKEN+1];
+       char remoteDirCheck[MAXPATH * 2 + 128];
 
        if ((idx = datanodeIdx(nodeName)) < 0)
                return(NULL);
 
-       if ((pgxc_check_dir(aval(VAR_datanodeMasterDirs)[idx]) == 2) && !forceInit)
+       remoteDirCheck[0] = '\0';
+       if (!forceInit)
        {
-               elog(ERROR, "ERROR: target datanode directory %s exists and is not empty. Skip initilialization.\n",
-                               aval(VAR_datanodeMasterDirs)[idx]); 
-               return NULL;
+               sprintf(remoteDirCheck, "if [ \"$(ls -A %s 2> /dev/null)\" ]; then echo 'ERROR: "
+                               "target directory (%s) exists and not empty. "
+                               "Skip Datanode initilialization'; exit; fi",
+                               aval(VAR_datanodeMasterDirs)[idx],
+                               aval(VAR_datanodeMasterDirs)[idx]
+                          );
+
        }
 
        /* Build each datanode's initialize command */
        cmd = cmdInitdb = initCmd(aval(VAR_datanodeMasterServers)[idx]);
        snprintf(newCommand(cmdInitdb), MAXLINE,
-                        "rm -rf %s; mkdir -p %s; initdb --nodename %s -D %s",
+                        "%s;"
+                        "rm -rf %s;"
+                        "mkdir -p %s; initdb --nodename %s -D %s",
+                        remoteDirCheck,
                         aval(VAR_datanodeMasterDirs)[idx], aval(VAR_datanodeMasterDirs)[idx],
                         aval(VAR_datanodeNames)[idx], aval(VAR_datanodeMasterDirs)[idx]);
                
index 0737549d4756fd6eab8ce5105385124583f02ed1..69faf037a6ef845e5bf26bb1bb0ebdf2e5895b3c 100644 (file)
@@ -54,20 +54,25 @@ cmd_t *prepare_initGtmMaster(void)
        FILE *f;
        char **fileList = NULL;
        int result;
+       char remoteDirCheck[MAXPATH * 2 + 128];
 
-       result = pgxc_check_dir(sval(VAR_gtmMasterDir));
-   
-       if ((result == 2) && !forceInit)
+       remoteDirCheck[0] = '\0';
+       if (!forceInit)
        {
-               elog(ERROR, "ERROR: target GTM directory %s exists and is not empty. Skip initilialization.\n",
-                               sval(VAR_gtmMasterDir)); 
-               return NULL;
+               sprintf(remoteDirCheck, "if [ \"$(ls -A %s 2> /dev/null)\" ]; then echo 'ERROR: "
+                               "target directory (%s) exists and not empty. "
+                               "Skip GTM initilialization'; exit; fi",
+                               sval(VAR_gtmMasterDir),
+                               sval(VAR_gtmMasterDir)
+                          );
        }
 
        /* Kill current gtm, bild work directory and run initgtm */
        cmdInitGtmMaster = initCmd(sval(VAR_gtmMasterServer));
        snprintf(newCommand(cmdInitGtmMaster), MAXLINE,
+                        "%s;"
                         "gtm_ctl -D %s -m immediate -Z gtm stop; rm -rf %s; mkdir -p %s;initgtm -Z gtm -D %s",
+                        remoteDirCheck,
                         sval(VAR_gtmMasterDir),
                         sval(VAR_gtmMasterDir), sval(VAR_gtmMasterDir), sval(VAR_gtmMasterDir));