Rev 90: fixed sending messages to ourselves in non-daemon mode in
http://samba.org/~tridge/ctdb
tridge at samba.org
tridge at samba.org
Wed Apr 11 04:26:14 GMT 2007
------------------------------------------------------------
revno: 90
revision-id: tridge at samba.org-20070411042614-eada54e55ac13cf8
parent: tridge at samba.org-20070411040501-043570f3088576d6
committer: Andrew Tridgell <tridge at samba.org>
branch nick: tridge
timestamp: Wed 2007-04-11 14:26:14 +1000
message:
fixed sending messages to ourselves in non-daemon mode
modified:
common/ctdb_message.c ctdb_message.c-20070208224107-9dnio7x7z33prrmt-1
include/ctdb_private.h ctdb_private.h-20061117234101-o3qt14umlg9en8z0-13
=== modified file 'common/ctdb_message.c'
--- a/common/ctdb_message.c 2007-04-11 04:05:01 +0000
+++ b/common/ctdb_message.c 2007-04-11 04:26:14 +0000
@@ -30,42 +30,101 @@
/*
- called when a CTDB_REQ_MESSAGE packet comes in
-
this dispatches the messages to the registered ctdb message handler
*/
-void ctdb_request_message(struct ctdb_context *ctdb, struct ctdb_req_header *hdr)
+static int ctdb_dispatch_message(struct ctdb_context *ctdb, uint32_t srvid, TDB_DATA data)
{
- struct ctdb_req_message *c = (struct ctdb_req_message *)hdr;
struct ctdb_message_list *ml;
- TDB_DATA data;
/* XXX we need a must faster way of finding the matching srvid
- maybe a tree? */
for (ml=ctdb->message_list;ml;ml=ml->next) {
- if (ml->srvid == c->srvid) break;
+ if (ml->srvid == srvid) break;
}
if (ml == NULL) {
- printf("no msg handler\n");
+ printf("no msg handler for srvid=%u\n", srvid);
/* no registered message handler */
- return;
+ return -1;
}
+ ml->message_handler(ctdb, srvid, data, ml->message_private);
+ return 0;
+}
+
+
+/*
+ called when a CTDB_REQ_MESSAGE packet comes in
+*/
+void ctdb_request_message(struct ctdb_context *ctdb, struct ctdb_req_header *hdr)
+{
+ struct ctdb_req_message *c = (struct ctdb_req_message *)hdr;
+ TDB_DATA data;
+
data.dptr = &c->data[0];
data.dsize = c->datalen;
- ml->message_handler(ctdb, c->srvid, data, ml->message_private);
-}
-
+
+ ctdb_dispatch_message(ctdb, c->srvid, data);
+}
+
+/*
+ this local messaging handler is ugly, but is needed to prevent
+ recursion in ctdb_send_message() when the destination node is the
+ same as the source node
+ */
+struct ctdb_local_message {
+ struct ctdb_context *ctdb;
+ uint32_t srvid;
+ TDB_DATA data;
+};
+
+static void ctdb_local_message_trigger(struct event_context *ev, struct timed_event *te,
+ struct timeval t, void *private)
+{
+ struct ctdb_local_message *m = talloc_get_type(private,
+ struct ctdb_local_message);
+ int res;
+
+ res = ctdb_dispatch_message(m->ctdb, m->srvid, m->data);
+ if (res != 0) {
+ printf("Failed to dispatch message for srvid=%u\n", m->srvid);
+ }
+ talloc_free(m);
+}
+
+static int ctdb_local_message(struct ctdb_context *ctdb, uint32_t srvid, TDB_DATA data)
+{
+ struct ctdb_local_message *m;
+ m = talloc(ctdb, struct ctdb_local_message);
+ CTDB_NO_MEMORY(ctdb, m);
+
+ m->ctdb = ctdb;
+ m->srvid = srvid;
+ m->data = data;
+ m->data.dptr = talloc_memdup(m, m->data.dptr, m->data.dsize);
+ if (m->data.dptr == NULL) {
+ talloc_free(m);
+ return -1;
+ }
+
+ /* this needs to be done as an event to prevent recursion */
+ event_add_timed(ctdb->ev, m, timeval_zero(), ctdb_local_message_trigger, m);
+ return 0;
+}
/*
send a ctdb message
*/
int ctdb_daemon_send_message(struct ctdb_context *ctdb, uint32_t vnn,
- uint32_t srvid, TDB_DATA data)
+ uint32_t srvid, TDB_DATA data)
{
struct ctdb_req_message *r;
int len;
+ /* see if this is a message to ourselves */
+ if (vnn == ctdb->vnn && !(ctdb->flags & CTDB_FLAG_SELF_CONNECT)) {
+ return ctdb_local_message(ctdb, srvid, data);
+ }
+
len = offsetof(struct ctdb_req_message, data) + data.dsize;
r = ctdb->methods->allocate_pkt(ctdb, len);
CTDB_NO_MEMORY(ctdb, r);
=== modified file 'include/ctdb_private.h'
--- a/include/ctdb_private.h 2007-04-11 04:05:01 +0000
+++ b/include/ctdb_private.h 2007-04-11 04:26:14 +0000
@@ -381,4 +381,5 @@
int ctdb_daemon_send_message(struct ctdb_context *ctdb, uint32_t vnn,
uint32_t srvid, TDB_DATA data);
+
#endif
More information about the samba-cvs
mailing list