------------------------------------------------------------
revno: 762
revision-id:[EMAIL PROTECTED]
parent: [EMAIL PROTECTED]
committer: Andrew Tridgell <[EMAIL PROTECTED]>
branch nick: tridge.stable
timestamp: Wed 2008-01-16 09:44:48 +1100
message:
- catch a case where the client disconnects during a call
- track all talloc memory, using NULL context
modified:
server/ctdb_control.c
ctdb_control.c-20070426122724-j6gkpiofhbwdin63-1
server/ctdb_daemon.c ctdb_daemon.c-20070409200331-3el1kqgdb9m4ib0g-1
server/ctdbd.c ctdbd.c-20070411085044-dqmhr6mfeexnyt4m-1
=== modified file 'server/ctdb_control.c'
--- a/server/ctdb_control.c 2008-01-14 21:42:12 +0000
+++ b/server/ctdb_control.c 2008-01-15 22:44:48 +0000
@@ -71,7 +71,7 @@
case CTDB_CONTROL_STATISTICS: {
CHECK_CONTROL_DATA_SIZE(0);
- ctdb->statistics.memory_used = talloc_total_size(ctdb);
+ ctdb->statistics.memory_used = talloc_total_size(NULL);
ctdb->statistics.frozen = (ctdb->freeze_mode ==
CTDB_FREEZE_FROZEN);
ctdb->statistics.recovering = (ctdb->recovery_mode ==
CTDB_RECOVERY_ACTIVE);
outdata->dptr = (uint8_t *)&ctdb->statistics;
=== modified file 'server/ctdb_daemon.c'
--- a/server/ctdb_daemon.c 2008-01-14 21:42:12 +0000
+++ b/server/ctdb_daemon.c 2008-01-15 22:44:48 +0000
@@ -288,9 +288,37 @@
client->ctdb->statistics.pending_calls--;
}
-
-static void daemon_request_call_from_client(struct ctdb_client *client,
- struct ctdb_req_call *c);
+struct ctdb_daemon_packet_wrap {
+ struct ctdb_context *ctdb;
+ uint32_t client_id;
+};
+
+/*
+ a wrapper to catch disconnected clients
+ */
+static void daemon_incoming_packet_wrap(void *p, struct ctdb_req_header *hdr)
+{
+ struct ctdb_client *client;
+ struct ctdb_daemon_packet_wrap *w = talloc_get_type(p,
+ struct
ctdb_daemon_packet_wrap);
+ if (w == NULL) {
+ DEBUG(0,(__location__ " Bad packet type '%s'\n",
talloc_get_name(p)));
+ return;
+ }
+
+ client = ctdb_reqid_find(w->ctdb, w->client_id, struct ctdb_client);
+ if (client == NULL) {
+ DEBUG(0,(__location__ " Packet for disconnected client %u\n",
+ w->client_id));
+ talloc_free(w);
+ return;
+ }
+ talloc_free(w);
+
+ /* process it */
+ daemon_incoming_packet(client, hdr);
+}
+
/*
this is called when the ctdb daemon received a ctdb request call
@@ -307,6 +335,7 @@
TDB_DATA key, data;
int ret;
struct ctdb_context *ctdb = client->ctdb;
+ struct ctdb_daemon_packet_wrap *w;
ctdb->statistics.total_calls++;
ctdb->statistics.pending_calls++;
@@ -322,15 +351,23 @@
key.dptr = c->data;
key.dsize = c->keylen;
+ w = talloc(ctdb, struct ctdb_daemon_packet_wrap);
+ CTDB_NO_MEMORY_VOID(ctdb, w);
+
+ w->ctdb = ctdb;
+ w->client_id = client->client_id;
+
ret = ctdb_ltdb_lock_fetch_requeue(ctdb_db, key, &header,
(struct ctdb_req_header *)c, &data,
- daemon_incoming_packet, client,
True);
+ daemon_incoming_packet_wrap, w,
True);
if (ret == -2) {
/* will retry later */
ctdb->statistics.pending_calls--;
return;
}
+ talloc_free(w);
+
if (ret != 0) {
DEBUG(0,(__location__ " Unable to fetch record\n"));
ctdb->statistics.pending_calls--;
=== modified file 'server/ctdbd.c'
--- a/server/ctdbd.c 2008-01-10 03:40:56 +0000
+++ b/server/ctdbd.c 2008-01-15 22:44:48 +0000
@@ -137,6 +137,8 @@
exit(1);
}
+ talloc_enable_null_tracking();
+
ctdb_block_signal(SIGPIPE);
ev = event_context_init(NULL);