too much.
This means we can simplify the way we add ips significantly and stop
trying to move them.
We also check if the node already hosts the ip, in which case we used to return an error. Instead just print an error string but return 0, ok.
This makes it easier to script, and works around broken scripts.
CQ1021034
{
int i, ret;
int len, retries = 0;
{
int i, ret;
int len, retries = 0;
unsigned mask;
ctdb_sock_addr addr;
struct ctdb_control_ip_iface *pub;
unsigned mask;
ctdb_sock_addr addr;
struct ctdb_control_ip_iface *pub;
- ret = control_get_all_public_ips(ctdb, tmp_ctx, &ips);
+ /* read the public ip list from the node */
+ ret = ctdb_ctrl_get_public_ips(ctdb, TIMELIMIT(), options.pnn, tmp_ctx, &ips);
- DEBUG(DEBUG_ERR, ("Unable to get public ip list from cluster\n"));
+ DEBUG(DEBUG_ERR, ("Unable to get public ip list from node %u\n", options.pnn));
-
-
- /* check if some other node is already serving this ip, if not,
- * we will claim it
- */
for (i=0;i<ips->num;i++) {
if (ctdb_same_ip(&addr, &ips->ips[i].addr)) {
for (i=0;i<ips->num;i++) {
if (ctdb_same_ip(&addr, &ips->ips[i].addr)) {
+ DEBUG(DEBUG_ERR,("Can not add ip to node. Node already hosts this ip\n"));
+ return 0;
+
+
+ /* Dont timeout. This command waits for an ip reallocation
+ which sometimes can take wuite a while if there has
+ been a recent recovery
+ */
+ alarm(0);
+
len = offsetof(struct ctdb_control_ip_iface, iface) + strlen(argv[1]) + 1;
pub = talloc_size(tmp_ctx, len);
CTDB_NO_MEMORY(ctdb, pub);
len = offsetof(struct ctdb_control_ip_iface, iface) + strlen(argv[1]) + 1;
pub = talloc_size(tmp_ctx, len);
CTDB_NO_MEMORY(ctdb, pub);
- if (i == ips->num) {
- /* no one has this ip so we claim it */
- pnn = options.pnn;
- } else {
- pnn = ips->ips[i].pnn;
- }
-
- do {
- ret = move_ip(ctdb, &addr, pnn);
- if (ret != 0) {
- DEBUG(DEBUG_ERR,("Failed to move ip to node %d. wait 3 seconds and try again.\n", pnn));
- sleep(3);
- retries++;
- }
- } while (retries < 5 && ret != 0);
- if (ret != 0) {
- DEBUG(DEBUG_ERR,("Failed to move ip to node %d. Giving up.\n", pnn));
- talloc_free(tmp_ctx);
- return ret;
- }
-
do {
ret = control_ipreallocate(ctdb, argc, argv);
if (ret != 0) {
do {
ret = control_ipreallocate(ctdb, argc, argv);
if (ret != 0) {