summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPavan Deolasee2015-11-18 05:08:42 +0000
committerPavan Deolasee2015-11-18 05:08:42 +0000
commitabb3c5a71e91b333a090249462ca9b24a337ac52 (patch)
treeb14f6b67ff8cda37a9347c52d474f8dc1a4fbcce
parentfae306518110ecbe7bbe81fc81fdd0b97398b498 (diff)
Ensure that the array in extended only when adding new entries and not while
replacing existing ones This should handle the problem of coord and datanode arrays going haywire when first or in-between coordinators/datanodes are removed using pgxc_ctl
-rw-r--r--contrib/pgxc_ctl/coord_cmd.c34
-rw-r--r--contrib/pgxc_ctl/datanode_cmd.c26
-rw-r--r--contrib/pgxc_ctl/variables.c15
-rw-r--r--contrib/pgxc_ctl/variables.h1
4 files changed, 44 insertions, 32 deletions
diff --git a/contrib/pgxc_ctl/coord_cmd.c b/contrib/pgxc_ctl/coord_cmd.c
index 480f7f15b5..f34f6e4768 100644
--- a/contrib/pgxc_ctl/coord_cmd.c
+++ b/contrib/pgxc_ctl/coord_cmd.c
@@ -1533,18 +1533,18 @@ int remove_coordinatorMaster(char *name, int clean_opt)
doImmediate(aval(VAR_coordMasterServers)[idx], NULL, "rm -rf %s", aval(VAR_coordMasterDirs)[idx]);
#endif
/* Update configuration and backup --> should cleanup "none" entries here */
- assign_arrayEl(VAR_coordNames, idx, "none", NULL);
- assign_arrayEl(VAR_coordMasterDirs, idx, "none", NULL);
- assign_arrayEl(VAR_coordPorts, idx, "-1", "-1");
- assign_arrayEl(VAR_poolerPorts, idx, "-1", "-1");
- assign_arrayEl(VAR_coordMasterServers, idx, "none", NULL);
- assign_arrayEl(VAR_coordMaxWALSenders, idx, "0", "0");
- assign_arrayEl(VAR_coordSlaveServers, idx, "none", NULL);
- assign_arrayEl(VAR_coordSlavePorts, idx, "none", NULL);
- assign_arrayEl(VAR_coordSlavePoolerPorts, idx, "none", NULL);
- assign_arrayEl(VAR_coordSlaveDirs, idx, "none", NULL);
- assign_arrayEl(VAR_coordArchLogDirs, idx, "none", NULL);
- assign_arrayEl(VAR_coordSpecificExtraConfig, idx, "none", NULL);
+ replace_arrayEl(VAR_coordNames, idx, "none", NULL);
+ replace_arrayEl(VAR_coordMasterDirs, idx, "none", NULL);
+ replace_arrayEl(VAR_coordPorts, idx, "-1", "-1");
+ replace_arrayEl(VAR_poolerPorts, idx, "-1", "-1");
+ replace_arrayEl(VAR_coordMasterServers, idx, "none", NULL);
+ replace_arrayEl(VAR_coordMaxWALSenders, idx, "0", "0");
+ replace_arrayEl(VAR_coordSlaveServers, idx, "none", NULL);
+ replace_arrayEl(VAR_coordSlavePorts, idx, "none", NULL);
+ replace_arrayEl(VAR_coordSlavePoolerPorts, idx, "none", NULL);
+ replace_arrayEl(VAR_coordSlaveDirs, idx, "none", NULL);
+ replace_arrayEl(VAR_coordArchLogDirs, idx, "none", NULL);
+ replace_arrayEl(VAR_coordSpecificExtraConfig, idx, "none", NULL);
handle_no_slaves();
/*
* Write config files
@@ -1628,11 +1628,11 @@ int remove_coordinatorSlave(char *name, int clean_opt)
/*
* Maintain variables
*/
- assign_arrayEl(VAR_coordSlaveServers, idx, "none", NULL);
- assign_arrayEl(VAR_coordSlavePorts, idx, "none", NULL);
- assign_arrayEl(VAR_coordSlavePoolerPorts, idx, "none", NULL);
- assign_arrayEl(VAR_coordSlaveDirs, idx, "none", NULL);
- assign_arrayEl(VAR_coordArchLogDirs, idx, "none", NULL);
+ replace_arrayEl(VAR_coordSlaveServers, idx, "none", NULL);
+ replace_arrayEl(VAR_coordSlavePorts, idx, "none", NULL);
+ replace_arrayEl(VAR_coordSlavePoolerPorts, idx, "none", NULL);
+ replace_arrayEl(VAR_coordSlaveDirs, idx, "none", NULL);
+ replace_arrayEl(VAR_coordArchLogDirs, idx, "none", NULL);
handle_no_slaves();
/*
* Maintain configuration file
diff --git a/contrib/pgxc_ctl/datanode_cmd.c b/contrib/pgxc_ctl/datanode_cmd.c
index 304181edca..96baab8bfd 100644
--- a/contrib/pgxc_ctl/datanode_cmd.c
+++ b/contrib/pgxc_ctl/datanode_cmd.c
@@ -1533,16 +1533,16 @@ int remove_datanodeMaster(char *name, int clean_opt)
if (clean_opt)
doImmediate(aval(VAR_datanodeMasterServers)[idx], NULL, "rm -rf %s", aval(VAR_datanodeMasterDirs)[idx]);
/* Update configuration and backup --> should cleanup "none" entries here */
- assign_arrayEl(VAR_datanodeNames, idx, "none", NULL);
- assign_arrayEl(VAR_datanodeMasterDirs, idx, "none", NULL);
- assign_arrayEl(VAR_datanodePorts, idx, "-1", "-1");
- assign_arrayEl(VAR_datanodePoolerPorts, idx, "-1", "-1");
- assign_arrayEl(VAR_datanodeMasterServers, idx, "none", NULL);
- assign_arrayEl(VAR_datanodeMaxWALSenders, idx, "0", "0");
- assign_arrayEl(VAR_datanodeSlaveServers, idx, "none", NULL);
- assign_arrayEl(VAR_datanodeSlaveDirs, idx, "none", NULL);
- assign_arrayEl(VAR_datanodeArchLogDirs, idx, "none", NULL);
- assign_arrayEl(VAR_datanodeSpecificExtraConfig, idx, "none", NULL);
+ replace_arrayEl(VAR_datanodeNames, idx, "none", NULL);
+ replace_arrayEl(VAR_datanodeMasterDirs, idx, "none", NULL);
+ replace_arrayEl(VAR_datanodePorts, idx, "-1", "-1");
+ replace_arrayEl(VAR_datanodePoolerPorts, idx, "-1", "-1");
+ replace_arrayEl(VAR_datanodeMasterServers, idx, "none", NULL);
+ replace_arrayEl(VAR_datanodeMaxWALSenders, idx, "0", "0");
+ replace_arrayEl(VAR_datanodeSlaveServers, idx, "none", NULL);
+ replace_arrayEl(VAR_datanodeSlaveDirs, idx, "none", NULL);
+ replace_arrayEl(VAR_datanodeArchLogDirs, idx, "none", NULL);
+ replace_arrayEl(VAR_datanodeSpecificExtraConfig, idx, "none", NULL);
handle_no_slaves();
/*
* Write config files
@@ -1626,9 +1626,9 @@ int remove_datanodeSlave(char *name, int clean_opt)
/*
* Maintain variables
*/
- assign_arrayEl(VAR_datanodeSlaveServers, idx, "none", NULL);
- assign_arrayEl(VAR_datanodeSlaveDirs, idx, "none", NULL);
- assign_arrayEl(VAR_datanodeArchLogDirs, idx, "none", NULL);
+ replace_arrayEl(VAR_datanodeSlaveServers, idx, "none", NULL);
+ replace_arrayEl(VAR_datanodeSlaveDirs, idx, "none", NULL);
+ replace_arrayEl(VAR_datanodeArchLogDirs, idx, "none", NULL);
handle_no_slaves();
/*
* Maintain configuration file
diff --git a/contrib/pgxc_ctl/variables.c b/contrib/pgxc_ctl/variables.c
index 59771202ff..6d9be10230 100644
--- a/contrib/pgxc_ctl/variables.c
+++ b/contrib/pgxc_ctl/variables.c
@@ -432,7 +432,8 @@ int extendVar(char *name, int newSize, char *def_value)
* If pad is NULL, then "none" will be padded.
* Returns *val if success, NULL if failed
*/
-void assign_arrayEl(char *name, int idx, char *val, char *pad)
+void assign_arrayEl_internal(char *name, int idx, char *val, char *pad,
+ int extend)
{
pgxc_ctl_var *var = confirm_var(name);
@@ -441,11 +442,21 @@ void assign_arrayEl(char *name, int idx, char *val, char *pad)
/*
* Pad if needed
*/
- extendVar(name, idx+1, pad);
+ if (extend)
+ extendVar(name, idx+1, pad);
Free(var->val[idx]);
var->val[idx] = Strdup(val);
}
+void assign_arrayEl(char *name, int idx, char *val, char *pad)
+{
+ return assign_arrayEl_internal(name, idx, val, pad, TRUE);
+}
+
+void replace_arrayEl(char *name, int idx, char *val, char *pad)
+{
+ return assign_arrayEl_internal(name, idx, val, pad, FALSE);
+}
int doesExist(char *name, int idx)
{
diff --git a/contrib/pgxc_ctl/variables.h b/contrib/pgxc_ctl/variables.h
index 3821066864..002336c6a3 100644
--- a/contrib/pgxc_ctl/variables.h
+++ b/contrib/pgxc_ctl/variables.h
@@ -62,6 +62,7 @@ void reset_value(pgxc_ctl_var *var);
void assign_val(char *dest, char *src);
void assign_sval(char *name, char *val);
void assign_arrayEl(char *name, int idx, char *val, char *pad);
+void replace_arrayEl(char *name, int idx, char *val, char *pad);
pgxc_ctl_var *confirm_var(char *name);
void reset_var_val(char *name, char *val);
void reset_var(char *name);