From: Andrew Tridgell Date: Wed, 6 Jun 2007 06:49:59 +0000 (+1000) Subject: handle the case of all nodes being sick for one service X-Git-Tag: tevent-0.9.20~348^2~2550 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=22aa4ffed29ad581c0e86d352cbfe1c429981bfe;p=thirdparty%2Fsamba.git handle the case of all nodes being sick for one service (This used to be ctdb commit eca2590e60b4522b13c34e2c6cb8013aa55be323) --- 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));