summaryrefslogtreecommitdiffstats
path: root/ctdb/tools
diff options
context:
space:
mode:
authorroot <root@test1n1.VSOFS1.COM>2008-12-17 14:26:01 +1100
committerroot <root@test1n1.VSOFS1.COM>2008-12-17 14:26:01 +1100
commit6c1359ab0da62967f4619ecb5fabe3daf727b79b (patch)
treecd32d5248ff37519305675b7d16c90220a3768ea /ctdb/tools
parent28bbe2f40799722a41f9ab0d603a6771cbe60d22 (diff)
downloadsamba-6c1359ab0da62967f4619ecb5fabe3daf727b79b.tar.gz
samba-6c1359ab0da62967f4619ecb5fabe3daf727b79b.tar.xz
samba-6c1359ab0da62967f4619ecb5fabe3daf727b79b.zip
add better errorchecking that nodes we try to talk to using the "ctdb" tool actually exist and that it is connected.
two new dedicated ctdb error codes 21: node does not exist 22: node is disconnected (This used to be ctdb commit 7ee6db06162ad5a554058bb6160ad37b24fe42e0)
Diffstat (limited to 'ctdb/tools')
-rw-r--r--ctdb/tools/ctdb.c71
1 files changed, 45 insertions, 26 deletions
diff --git a/ctdb/tools/ctdb.c b/ctdb/tools/ctdb.c
index 458331f6b9..4ba351c921 100644
--- a/ctdb/tools/ctdb.c
+++ b/ctdb/tools/ctdb.c
@@ -31,7 +31,10 @@
#include "../common/rb_tree.h"
#include "db_wrap.h"
-#define ERR_TIMEOUT 20
+
+#define ERR_TIMEOUT 20 /* timed out trying to reach node */
+#define ERR_NONODE 21 /* node does not exist */
+#define ERR_DISNODE 22 /* node is disconnected */
static void usage(void);
@@ -56,6 +59,43 @@ static int control_version(struct ctdb_context *ctdb, int argc, const char **arg
/*
+ verify that a node exists and is reachable
+ */
+static void verify_node(struct ctdb_context *ctdb)
+{
+ int ret;
+ struct ctdb_node_map *nodemap=NULL;
+
+ if (options.pnn == CTDB_CURRENT_NODE) {
+ return;
+ }
+ if (options.pnn == CTDB_BROADCAST_ALL) {
+ return;
+ }
+
+ /* verify the node exists */
+ if (ctdb_ctrl_getnodemap(ctdb, TIMELIMIT(), CTDB_CURRENT_NODE, ctdb, &nodemap) != 0) {
+ DEBUG(DEBUG_ERR, ("Unable to get nodemap from local node\n"));
+ exit(10);
+ }
+ if (options.pnn >= nodemap->num) {
+ DEBUG(DEBUG_ERR, ("Node %u does not exist\n", options.pnn));
+ exit(ERR_NONODE);
+ }
+ if (nodemap->nodes[options.pnn].flags & NODE_FLAGS_DISCONNECTED) {
+ DEBUG(DEBUG_ERR, ("Node %u is DISCONNECTED\n", options.pnn));
+ exit(ERR_DISNODE);
+ }
+
+ /* verify we can access the node */
+ ret = ctdb_ctrl_getpnn(ctdb, TIMELIMIT(), options.pnn);
+ if (ret == -1) {
+ DEBUG(DEBUG_ERR,("Can not ban node. Node is not operational.\n"));
+ exit(10);
+ }
+}
+
+/*
check if a database exists
*/
static int db_exists(struct ctdb_context *ctdb, const char *db_name)
@@ -262,15 +302,9 @@ static int control_statistics_reset(struct ctdb_context *ctdb, int argc, const c
static int control_uptime(struct ctdb_context *ctdb, int argc, const char **argv)
{
int ret;
- int mypnn;
struct ctdb_uptime *uptime = NULL;
int tmp, days, hours, minutes, seconds;
- mypnn = ctdb_ctrl_getpnn(ctdb, TIMELIMIT(), options.pnn);
- if (mypnn == -1) {
- return -1;
- }
-
ret = ctdb_ctrl_uptime(ctdb, ctdb, TIMELIMIT(), options.pnn, &uptime);
if (ret != 0) {
DEBUG(DEBUG_ERR, ("Unable to get uptime from node %u\n", options.pnn));
@@ -325,7 +359,7 @@ static int control_pnn(struct ctdb_context *ctdb, int argc, const char **argv)
{
int mypnn;
- mypnn = ctdb_ctrl_getpnn(ctdb, TIMELIMIT(), CTDB_CURRENT_NODE);
+ mypnn = ctdb_ctrl_getpnn(ctdb, TIMELIMIT(), options.pnn);
if (mypnn == -1) {
DEBUG(DEBUG_ERR, ("Unable to get pnn from local node."));
return -1;
@@ -1326,17 +1360,6 @@ static int control_ban(struct ctdb_context *ctdb, int argc, const char **argv)
DEBUG(DEBUG_ERR, ("Unable to get nodemap from local node\n"));
return ret;
}
- if (options.pnn >= nodemap->num) {
- DEBUG(DEBUG_ERR, ("Node %u does not exist\n", options.pnn));
- return ret;
- }
-
- /* verify we can access the node */
- ret = ctdb_ctrl_getpnn(ctdb, TIMELIMIT(), options.pnn);
- if (ret == -1) {
- DEBUG(DEBUG_ERR,("Can not ban node. Node is not operational.\n"));
- return -1;
- }
if (nodemap->nodes[options.pnn].flags & NODE_FLAGS_BANNED) {
DEBUG(DEBUG_ERR,("Node %u is already banned.\n", options.pnn));
@@ -1382,13 +1405,6 @@ static int control_unban(struct ctdb_context *ctdb, int argc, const char **argv)
/* record the current generation number */
generation = get_generation(ctdb);
- /* verify we can access the node */
- ret = ctdb_ctrl_getpnn(ctdb, TIMELIMIT(), options.pnn);
- if (ret == -1) {
- DEBUG(DEBUG_ERR,("Can not unban node. Node is not operational.\n"));
- return -1;
- }
-
data.dptr = (uint8_t *)&options.pnn;
data.dsize = sizeof(uint32_t);
@@ -2747,6 +2763,9 @@ int main(int argc, const char *argv[])
exit(1);
}
+ /* verify the node exists */
+ verify_node(ctdb);
+
for (i=0;i<ARRAY_SIZE(ctdb_commands);i++) {
if (strcmp(control, ctdb_commands[i].name) == 0) {
int j;