summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndrew Tridgell <tridge@samba.org>2007-04-26 19:27:07 +0200
committerAndrew Tridgell <tridge@samba.org>2007-04-26 19:27:07 +0200
commitafa08763355ba4bf79a72fb66e4a65d17d8a502e (patch)
treee1a737648f4c55220bcfb41e7a0c92e816f2f982
parentfc43701cbbc0f356dc70cba8233763e7c35d1b99 (diff)
added a ctdb_get_config call
added a ctdb ping control (This used to be ctdb commit 7d17378b6e6076a922cffe98239e20dfbbae3bf7)
-rw-r--r--ctdb/common/cmdline.c8
-rw-r--r--ctdb/common/ctdb_client.c51
-rw-r--r--ctdb/common/ctdb_control.c11
-rw-r--r--ctdb/common/ctdb_daemon.c7
-rw-r--r--ctdb/include/ctdb.h4
-rw-r--r--ctdb/include/ctdb_private.h6
-rw-r--r--ctdb/tools/ctdb_control.c21
7 files changed, 107 insertions, 1 deletions
diff --git a/ctdb/common/cmdline.c b/ctdb/common/cmdline.c
index 085a133460..2b9d5f43c6 100644
--- a/ctdb/common/cmdline.c
+++ b/ctdb/common/cmdline.c
@@ -153,5 +153,13 @@ struct ctdb_context *ctdb_cmdline_client(struct event_context *ev)
return NULL;
}
+ /* get our config */
+ ret = ctdb_get_config(ctdb);
+ if (ret != 0) {
+ DEBUG(0,(__location__ " Failed to get ctdb config\n"));
+ talloc_free(ctdb);
+ return NULL;
+ }
+
return ctdb;
}
diff --git a/ctdb/common/ctdb_client.c b/ctdb/common/ctdb_client.c
index f0589e70a4..5d4a9177a0 100644
--- a/ctdb/common/ctdb_client.c
+++ b/ctdb/common/ctdb_client.c
@@ -479,6 +479,9 @@ void ctdb_connect_wait(struct ctdb_context *ctdb)
/* now we can go into the normal wait routine, as the reply packet
will update the ctdb->num_connected variable */
ctdb_daemon_connect_wait(ctdb);
+
+ /* get other config variables */
+ ctdb_get_config(ctdb);
}
/*
@@ -859,3 +862,51 @@ int ctdb_status(struct ctdb_context *ctdb, uint32_t destnode, struct ctdb_status
return 0;
}
+
+/*
+ ping a node
+ */
+int ctdb_ping(struct ctdb_context *ctdb, uint32_t destnode)
+{
+ int ret;
+ int32_t res;
+ TDB_DATA data;
+
+ ZERO_STRUCT(data);
+ ret = ctdb_control(ctdb, destnode, 0, CTDB_CONTROL_PING, data, NULL, NULL, &res);
+ if (ret != 0 || res != 0) {
+ return -1;
+ }
+ return 0;
+}
+
+/*
+ get ctdb config
+ */
+int ctdb_get_config(struct ctdb_context *ctdb)
+{
+ int ret;
+ int32_t res;
+ TDB_DATA data;
+ struct ctdb_context c;
+
+ ZERO_STRUCT(data);
+ ret = ctdb_control(ctdb, CTDB_CURRENT_NODE, 0, CTDB_CONTROL_CONFIG, data,
+ ctdb, &data, &res);
+ if (ret != 0 || res != 0) {
+ return -1;
+ }
+ if (data.dsize != sizeof(c)) {
+ DEBUG(0,("Bad config size %u - expected %u\n", data.dsize, sizeof(c)));
+ return -1;
+ }
+
+ c = *(struct ctdb_context *)data.dptr;
+
+ ctdb->num_nodes = c.num_nodes;
+ ctdb->num_connected = c.num_connected;
+ ctdb->vnn = c.vnn;
+ ctdb->max_lacount = c.max_lacount;
+
+ return 0;
+}
diff --git a/ctdb/common/ctdb_control.c b/ctdb/common/ctdb_control.c
index 85ad371ab8..a763ab5e57 100644
--- a/ctdb/common/ctdb_control.c
+++ b/ctdb/common/ctdb_control.c
@@ -50,11 +50,22 @@ static int32_t ctdb_control_dispatch(struct ctdb_context *ctdb,
pid = *(pid_t *)indata.dptr;
return kill(pid, 0);
}
+
case CTDB_CONTROL_STATUS: {
outdata->dptr = (uint8_t *)&ctdb->status;
outdata->dsize = sizeof(ctdb->status);
return 0;
}
+
+ case CTDB_CONTROL_CONFIG: {
+ outdata->dptr = (uint8_t *)ctdb;
+ outdata->dsize = sizeof(*ctdb);
+ return 0;
+ }
+
+ case CTDB_CONTROL_PING:
+ return 0;
+
default:
DEBUG(0,(__location__ " Unknown CTDB control opcode %u\n", opcode));
return -1;
diff --git a/ctdb/common/ctdb_daemon.c b/ctdb/common/ctdb_daemon.c
index 842deb71e7..9b18dbcb0e 100644
--- a/ctdb/common/ctdb_daemon.c
+++ b/ctdb/common/ctdb_daemon.c
@@ -758,6 +758,7 @@ void ctdb_request_finished(struct ctdb_context *ctdb, struct ctdb_req_header *hd
struct daemon_control_state {
struct ctdb_client *client;
struct ctdb_req_control *c;
+ uint32_t reqid;
};
/*
@@ -784,6 +785,7 @@ static void daemon_control_callback(struct ctdb_context *ctdb,
r->hdr.ctdb_magic = CTDB_MAGIC;
r->hdr.ctdb_version = CTDB_VERSION;
r->hdr.operation = CTDB_REPLY_CONTROL;
+ r->hdr.reqid = state->reqid;
r->status = status;
r->datalen = data.dsize;
memcpy(&r->data[0], data.dptr, data.dsize);
@@ -804,11 +806,16 @@ static void daemon_request_control_from_client(struct ctdb_client *client,
int res;
struct daemon_control_state *state;
+ if (c->hdr.destnode == CTDB_CURRENT_NODE) {
+ c->hdr.destnode = client->ctdb->vnn;
+ }
+
state = talloc(client, struct daemon_control_state);
CTDB_NO_MEMORY_VOID(client->ctdb, state);
state->client = client;
state->c = talloc_steal(state, c);
+ state->reqid = c->hdr.reqid;
data.dptr = &c->data[0];
data.dsize = c->datalen;
diff --git a/ctdb/include/ctdb.h b/ctdb/include/ctdb.h
index 2a96229549..3273d4c9fe 100644
--- a/ctdb/include/ctdb.h
+++ b/ctdb/include/ctdb.h
@@ -219,4 +219,8 @@ int ctdb_getdbpath(struct ctdb_db_context *ctdb_db, TDB_DATA *path);
int ctdb_process_exists(struct ctdb_context *ctdb, uint32_t destnode, pid_t pid);
+int ctdb_ping(struct ctdb_context *ctdb, uint32_t destnode);
+
+int ctdb_get_config(struct ctdb_context *ctdb);
+
#endif
diff --git a/ctdb/include/ctdb_private.h b/ctdb/include/ctdb_private.h
index 88aa209d9a..048b5d7dc2 100644
--- a/ctdb/include/ctdb_private.h
+++ b/ctdb/include/ctdb_private.h
@@ -31,6 +31,7 @@
#define CTDB_NULL_FUNC 0xf0000001
+#define CTDB_CURRENT_NODE 0xF0000001
/*
an installed ctdb remote call
@@ -228,7 +229,10 @@ struct ctdb_ltdb_header {
uint32_t lacount;
};
-enum {CTDB_CONTROL_PROCESS_EXISTS, CTDB_CONTROL_STATUS};
+enum ctdb_controls {CTDB_CONTROL_PROCESS_EXISTS,
+ CTDB_CONTROL_STATUS,
+ CTDB_CONTROL_CONFIG,
+ CTDB_CONTROL_PING};
enum call_state {CTDB_CALL_WAIT, CTDB_CALL_DONE, CTDB_CALL_ERROR};
diff --git a/ctdb/tools/ctdb_control.c b/ctdb/tools/ctdb_control.c
index e5a2c22a9d..9cf52aa9b1 100644
--- a/ctdb/tools/ctdb_control.c
+++ b/ctdb/tools/ctdb_control.c
@@ -33,6 +33,7 @@ static void usage(void)
{
printf("Usage: ctdb_control [options] <control>\n");
printf("\nControls:\n");
+ printf(" ping\n");
printf(" process-exists <vnn:pid>\n");
printf(" status <vnn>\n");
exit(1);
@@ -115,6 +116,24 @@ static int control_status(struct ctdb_context *ctdb, int argc, const char **argv
return 0;
}
+
+static int control_ping(struct ctdb_context *ctdb, int argc, const char **argv)
+{
+ int ret, i;
+
+ for (i=0;i<ctdb->num_nodes;i++) {
+ struct timeval tv = timeval_current();
+ ret = ctdb_ping(ctdb, i);
+ if (ret != 0) {
+ printf("Unable to get ping response from node %u\n", i);
+ } else {
+ printf("response from %u time=%.6f sec\n",
+ i, timeval_elapsed(&tv));
+ }
+ }
+ return 0;
+}
+
/*
main program
*/
@@ -171,6 +190,8 @@ int main(int argc, const char *argv[])
ret = control_process_exists(ctdb, extra_argc-1, extra_argv+1);
} else if (strcmp(control, "status") == 0) {
ret = control_status(ctdb, extra_argc-1, extra_argv+1);
+ } else if (strcmp(control, "ping") == 0) {
+ ret = control_ping(ctdb, extra_argc-1, extra_argv+1);
} else {
printf("Unknown control '%s'\n", control);
exit(1);