From: Andrew Tridgell Date: Sat, 9 Jun 2007 22:46:33 +0000 (+1000) Subject: - send tcp info to all connected nodes, not just vnnmap nodes X-Git-Tag: tevent-0.9.20~348^2~2506 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=044a2e04c43a05e559500010560ea8a4d533fb97;p=thirdparty%2Fsamba.git - send tcp info to all connected nodes, not just vnnmap nodes - use a non-blocking freeze when banned - release all IPs when banned (This used to be ctdb commit 070e85e532b33b792f85c3e72eee205d906aaf85) --- diff --git a/ctdb/include/ctdb_private.h b/ctdb/include/ctdb_private.h index 989d837568c..d1402725131 100644 --- a/ctdb/include/ctdb_private.h +++ b/ctdb/include/ctdb_private.h @@ -1022,4 +1022,6 @@ int ctdb_ctrl_get_all_tunables(struct ctdb_context *ctdb, uint32_t destnode, struct ctdb_tunable *tunables); +void ctdb_start_freeze(struct ctdb_context *ctdb); + #endif diff --git a/ctdb/server/ctdb_daemon.c b/ctdb/server/ctdb_daemon.c index f138b9d8bc0..a483a3a116e 100644 --- a/ctdb/server/ctdb_daemon.c +++ b/ctdb/server/ctdb_daemon.c @@ -54,6 +54,12 @@ static void flag_change_handler(struct ctdb_context *ctdb, uint64_t srvid, (ctdb->nodes[c->vnn]->flags&NODE_FLAGS_DISCONNECTED) | (c->flags & ~NODE_FLAGS_DISCONNECTED); DEBUG(2,("Node flags for node %u are now 0x%x\n", c->vnn, ctdb->nodes[c->vnn]->flags)); + + /* make sure we don't hold any IPs when we shouldn't */ + if (c->vnn == ctdb->vnn && + (ctdb->nodes[c->vnn]->flags & (NODE_FLAGS_INACTIVE|NODE_FLAGS_BANNED))) { + ctdb_release_all_ips(ctdb); + } } /* called when the "startup" event script has finished */ diff --git a/ctdb/server/ctdb_freeze.c b/ctdb/server/ctdb_freeze.c index 73e98d3333d..dbc9725130e 100644 --- a/ctdb/server/ctdb_freeze.c +++ b/ctdb/server/ctdb_freeze.c @@ -182,23 +182,36 @@ static int ctdb_freeze_waiter_destructor(struct ctdb_freeze_waiter *w) } /* - freeze the databases + start the freeze process */ -int32_t ctdb_control_freeze(struct ctdb_context *ctdb, struct ctdb_req_control *c, bool *async_reply) +void ctdb_start_freeze(struct ctdb_context *ctdb) { - struct ctdb_freeze_waiter *w; - if (ctdb->freeze_mode == CTDB_FREEZE_FROZEN) { /* we're already frozen */ - return 0; + return; } /* if there isn't a freeze lock child then create one */ if (!ctdb->freeze_handle) { ctdb->freeze_handle = ctdb_freeze_lock(ctdb); - CTDB_NO_MEMORY(ctdb, ctdb->freeze_handle); + CTDB_NO_MEMORY_VOID(ctdb, ctdb->freeze_handle); ctdb->freeze_mode = CTDB_FREEZE_PENDING; } +} + +/* + freeze the databases + */ +int32_t ctdb_control_freeze(struct ctdb_context *ctdb, struct ctdb_req_control *c, bool *async_reply) +{ + struct ctdb_freeze_waiter *w; + + if (ctdb->freeze_mode == CTDB_FREEZE_FROZEN) { + /* we're already frozen */ + return 0; + } + + ctdb_start_freeze(ctdb); /* add ourselves to list of waiters */ w = talloc(ctdb->freeze_handle, struct ctdb_freeze_waiter); @@ -220,17 +233,7 @@ int32_t ctdb_control_freeze(struct ctdb_context *ctdb, struct ctdb_req_control * */ bool ctdb_blocking_freeze(struct ctdb_context *ctdb) { - if (ctdb->freeze_mode == CTDB_FREEZE_FROZEN) { - /* we're already frozen */ - return true; - } - - /* if there isn't a freeze lock child then create one */ - if (!ctdb->freeze_handle) { - ctdb->freeze_handle = ctdb_freeze_lock(ctdb); - CTDB_NO_MEMORY(ctdb, ctdb->freeze_handle); - ctdb->freeze_mode = CTDB_FREEZE_PENDING; - } + ctdb_start_freeze(ctdb); /* block until frozen */ while (ctdb->freeze_mode == CTDB_FREEZE_PENDING) { diff --git a/ctdb/server/ctdb_monitor.c b/ctdb/server/ctdb_monitor.c index 73938a32b18..a7a61af1d7a 100644 --- a/ctdb/server/ctdb_monitor.c +++ b/ctdb/server/ctdb_monitor.c @@ -219,9 +219,8 @@ int32_t ctdb_control_modflags(struct ctdb_context *ctdb, TDB_DATA indata) if ((node->flags & NODE_FLAGS_BANNED) && !(old_flags & NODE_FLAGS_BANNED)) { /* make sure we are frozen */ DEBUG(0,("This node has been banned - forcing freeze and recovery\n")); - if (!ctdb_blocking_freeze(ctdb)) { - ctdb_fatal(ctdb, "Unable to freeze when banned"); - } + ctdb_start_freeze(ctdb); + ctdb_release_all_ips(ctdb); ctdb->recovery_mode = CTDB_RECOVERY_ACTIVE; } diff --git a/ctdb/takeover/ctdb_takeover.c b/ctdb/takeover/ctdb_takeover.c index b9fefe610fe..a439b855ba2 100644 --- a/ctdb/takeover/ctdb_takeover.c +++ b/ctdb/takeover/ctdb_takeover.c @@ -247,7 +247,7 @@ static void release_ip_callback(struct ctdb_context *ctdb, int status, data.dptr = (uint8_t *)&t; data.dsize = sizeof(t); - ctdb_daemon_send_control(ctdb, CTDB_BROADCAST_VNNMAP, 0, + ctdb_daemon_send_control(ctdb, CTDB_BROADCAST_CONNECTED, 0, CTDB_CONTROL_TCP_ADD, 0, CTDB_CTRL_FLAG_NOREPLY, data, NULL, NULL); } @@ -469,7 +469,6 @@ int ctdb_takeover_run(struct ctdb_context *ctdb, struct ctdb_node_map *nodemap) /* at this point ctdb->nodes[i]->takeover_vnn is the vnn which will own each IP */ - /* now tell all nodes to delete any alias that they should not have. This will be a NOOP on nodes that don't currently hold the given alias */ @@ -557,7 +556,7 @@ int32_t ctdb_control_tcp_client(struct ctdb_context *ctdb, uint32_t client_id, u data.dsize = sizeof(t); /* tell all nodes about this tcp connection */ - ret = ctdb_daemon_send_control(ctdb, CTDB_BROADCAST_VNNMAP, 0, + ret = ctdb_daemon_send_control(ctdb, CTDB_BROADCAST_CONNECTED, 0, CTDB_CONTROL_TCP_ADD, 0, CTDB_CTRL_FLAG_NOREPLY, data, NULL, NULL); if (ret != 0) { @@ -703,7 +702,7 @@ void ctdb_takeover_client_destructor_hook(struct ctdb_client *client) p.dest = tcp->daddr; data.dptr = (uint8_t *)&p; data.dsize = sizeof(p); - ctdb_daemon_send_control(client->ctdb, CTDB_BROADCAST_VNNMAP, 0, + ctdb_daemon_send_control(client->ctdb, CTDB_BROADCAST_CONNECTED, 0, CTDB_CONTROL_TCP_REMOVE, 0, CTDB_CTRL_FLAG_NOREPLY, data, NULL, NULL); talloc_free(tcp);