diff options
author | Pavan Deolasee | 2015-11-18 05:08:42 +0000 |
---|---|---|
committer | Pavan Deolasee | 2015-11-18 05:08:42 +0000 |
commit | abb3c5a71e91b333a090249462ca9b24a337ac52 (patch) | |
tree | b14f6b67ff8cda37a9347c52d474f8dc1a4fbcce | |
parent | fae306518110ecbe7bbe81fc81fdd0b97398b498 (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.c | 34 | ||||
-rw-r--r-- | contrib/pgxc_ctl/datanode_cmd.c | 26 | ||||
-rw-r--r-- | contrib/pgxc_ctl/variables.c | 15 | ||||
-rw-r--r-- | contrib/pgxc_ctl/variables.h | 1 |
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); |