From 22aa4ffed29ad581c0e86d352cbfe1c429981bfe Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Wed, 6 Jun 2007 16:49:59 +1000 Subject: [PATCH] handle the case of all nodes being sick for one service (This used to be ctdb commit eca2590e60b4522b13c34e2c6cb8013aa55be323) --- ctdb/takeover/ctdb_takeover.c | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/ctdb/takeover/ctdb_takeover.c b/ctdb/takeover/ctdb_takeover.c index 2a539b1f97f..a90a1a08c9c 100644 --- a/ctdb/takeover/ctdb_takeover.c +++ b/ctdb/takeover/ctdb_takeover.c @@ -432,6 +432,28 @@ int ctdb_takeover_run(struct ctdb_context *ctdb, struct ctdb_node_map *nodemap) break; } } + + /* if no enabled node can take it, then we + might as well use any connected node. It + probably means that some subsystem (such as + NFS) is sick on all nodes. Best we can do + is to keep the other services up. */ + if (j == i) { + for (j=(i+1)%nodemap->num; + j != i; + j=(j+1)%nodemap->num) { + if ((nodemap->nodes[j].flags & NODE_FLAGS_CONNECTED) && + ctdb_same_subnet(ctdb->nodes[j]->public_address, + ctdb->nodes[i]->public_address, + ctdb->nodes[j]->public_netmask_bits)) { + ctdb->nodes[i]->takeover_vnn = nodemap->nodes[j].vnn; + DEBUG(0,("All available nodes disabled for %s - using a connected node\n", + ctdb->nodes[i]->public_address)); + break; + } + } + } + if (j == i) { DEBUG(0,(__location__ " No node available on same network to take %s\n", ctdb->nodes[i]->public_address)); -- 2.47.3