Avoid removing directories for some pgxc_ctl calls, just as an added protection
authorPavan Deolasee <[email protected]>
Tue, 12 Apr 2016 15:43:22 +0000 (21:13 +0530)
committerPavan Deolasee <[email protected]>
Tue, 12 Apr 2016 15:43:22 +0000 (21:13 +0530)
if user makes a mistake

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

index b612a0238548aad100c8f42faa63c7f6aebe81b7..eb45f77227efd1ce9c3b50984b5bff14f09033d1 100644 (file)
@@ -253,6 +253,7 @@ cmd_t *prepare_initCoordinatorSlave(char *nodeName)
        FILE *f;
        char localStdin[MAXPATH+1];
        char timestamp[MAXTOKEN+1];
+       char remoteDirCheck[MAXPATH * 2 + 128];
 
        if ((idx = coordIdx(nodeName)) < 0)
        {
@@ -265,10 +266,25 @@ cmd_t *prepare_initCoordinatorSlave(char *nodeName)
                return(NULL);
        }
 
+       remoteDirCheck[0] = '\0';
+       if (!forceInit)
+       {
+               sprintf(remoteDirCheck, "if [ \"$(ls -A %s 2> /dev/null)\" ]; then echo 'ERROR: "
+                               "target directory (%s) exists and not empty. "
+                               "Skip Coordinator slave initilialization'; exit; fi;",
+                               aval(VAR_coordSlaveDirs)[idx],
+                               aval(VAR_coordSlaveDirs)[idx]
+                          );
+       }
+
        /* Build work directory */
        cmd = cmdBuildDir = initCmd(aval(VAR_coordSlaveServers)[idx]);
        snprintf(newCommand(cmdBuildDir), MAXLINE,
-                        "rm -rf %s;mkdir -p %s;chmod 0700 %s",
+                        "%s"
+                        "rm -rf %s;"
+                        "mkdir -p %s;"
+                        "chmod 0700 %s",
+                        remoteDirCheck,
                         aval(VAR_coordSlaveDirs)[idx], aval(VAR_coordSlaveDirs)[idx], aval(VAR_coordSlaveDirs)[idx]);
        /* 
         * Check if the master is running --> May not need change if we have watchdog.   This case, we need
@@ -1293,7 +1309,7 @@ int add_coordinatorSlave(char *name, char *host, int port, int pooler_port, char
        snprintf(pooler_s, MAXTOKEN, "%d", pooler_port);
        
        /* Prepare the resources (directories) */
-       doImmediate(host, NULL, "rm -rf %s; mkdir -p %s;chmod 0700 %s", dir, dir, dir);
+       doImmediate(host, NULL, "mkdir -p %s;chmod 0700 %s", dir, dir);
        doImmediate(host, NULL, "rm -rf %s; mkdir -p %s;chmod 0700 %s", archDir, archDir, archDir);
        /* Reconfigure the master with WAL archive */
        /* Update the configuration and backup the configuration file */
index 838f060c9b70eecd113b36480e09dcd35386644b..d97b577754678ee5d37405642bc5891bebdcbcac 100644 (file)
@@ -274,6 +274,7 @@ cmd_t *prepare_initDatanodeSlave(char *nodeName)
        int idx;
        int startMaster;
        char timestamp[MAXTOKEN+1];
+       char remoteDirCheck[MAXPATH * 2 + 128];
        
        if ((idx = datanodeIdx(nodeName)) < 0)
        {
@@ -292,10 +293,25 @@ cmd_t *prepare_initDatanodeSlave(char *nodeName)
                return NULL;
        }
 
+       remoteDirCheck[0] = '\0';
+       if (!forceInit)
+       {
+               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_datanodeSlaveDirs)[idx],
+                               aval(VAR_datanodeSlaveDirs)[idx]
+                          );
+       }
+
        /* Build slave's directory -1- */
        cmd = cmdBuildDir = initCmd(aval(VAR_datanodeSlaveServers)[idx]);
        snprintf(newCommand(cmdBuildDir), MAXLINE,
-                        "rm -rf %s;mkdir -p %s; chmod 0700 %s",
+                        "%s"
+                        "rm -rf %s;"
+                        "mkdir -p %s;"
+                        "chmod 0700 %s",
+                        remoteDirCheck,
                         aval(VAR_datanodeSlaveDirs)[idx], aval(VAR_datanodeSlaveDirs)[idx],
                         aval(VAR_datanodeSlaveDirs)[idx]);
 
@@ -1347,7 +1363,7 @@ int add_datanodeSlave(char *name, char *host, int port, int pooler, char *dir,
                return 1;
        }
        /* Prepare the resources (directories) */
-       doImmediate(host, NULL, "rm -rf %s; mkdir -p %s;chmod 0700 %s", dir, dir, dir);
+       doImmediate(host, NULL, "mkdir -p %s;chmod 0700 %s", dir, dir);
        doImmediate(host, NULL, "rm -rf %s; mkdir -p %s;chmod 0700 %s", archDir, archDir, archDir);
        doImmediate(host, NULL, "rm -rf %s; mkdir -p %s;chmod 0700 %s", walDir,
                        walDir, walDir);