server/banning: also release all ips if we're banning ourself
authorStefan Metzmacher <metze@samba.org>
Tue, 31 Aug 2010 07:28:34 +0000 (09:28 +0200)
committerRonnie Sahlberg <ronniesahlberg@gmail.com>
Tue, 14 Sep 2010 05:50:31 +0000 (15:50 +1000)
metze

include/ctdb_private.h
server/ctdb_banning.c
server/ctdb_monitor.c

index b707afda7b64c83fb277e5ae6c7e6217bf760c88..89b8f08b6f74941bf2d050078885cd191adf814e 100644 (file)
@@ -1291,6 +1291,7 @@ int ctdb_vacuum_init(struct ctdb_db_context *ctdb_db);
 int32_t ctdb_control_enable_script(struct ctdb_context *ctdb, TDB_DATA indata);
 int32_t ctdb_control_disable_script(struct ctdb_context *ctdb, TDB_DATA indata);
 
+int32_t ctdb_local_node_got_banned(struct ctdb_context *ctdb);
 int32_t ctdb_control_set_ban_state(struct ctdb_context *ctdb, TDB_DATA indata);
 int32_t ctdb_control_get_ban_state(struct ctdb_context *ctdb, TDB_DATA *outdata);
 int32_t ctdb_control_set_db_priority(struct ctdb_context *ctdb, TDB_DATA indata);
index 3d5f2165d5c7dbec15a1bd7bd4dbcfaf2dfb9e86..56849072d72f62c5a5b004aabeaf1ece7a03c049 100644 (file)
@@ -42,6 +42,31 @@ ctdb_ban_node_event(struct event_context *ev, struct timed_event *te,
        }
 }
 
+int32_t ctdb_local_node_got_banned(struct ctdb_context *ctdb)
+{
+       uint32_t i;
+
+       /* make sure we are frozen */
+       DEBUG(DEBUG_NOTICE,("This node has been banned - forcing freeze and recovery\n"));
+
+       /* Reset the generation id to 1 to make us ignore any
+          REQ/REPLY CALL/DMASTER someone sends to us.
+          We are now banned so we shouldnt service database calls
+          anymore.
+       */
+       ctdb->vnn_map->generation = INVALID_GENERATION;
+
+       for (i=1; i<=NUM_DB_PRIORITIES; i++) {
+               if (ctdb_start_freeze(ctdb, i) != 0) {
+                       DEBUG(DEBUG_ERR,(__location__ " Failed to freeze db priority %u\n", i));
+               }
+       }
+       ctdb_release_all_ips(ctdb);
+       ctdb->recovery_mode = CTDB_RECOVERY_ACTIVE;
+
+       return 0;
+}
+
 int32_t ctdb_control_set_ban_state(struct ctdb_context *ctdb, TDB_DATA indata)
 {
        struct ctdb_ban_time *bantime = (struct ctdb_ban_time *)indata.dptr;
@@ -96,7 +121,10 @@ int32_t ctdb_control_set_ban_state(struct ctdb_context *ctdb, TDB_DATA indata)
        ctdb->nodes[bantime->pnn]->flags |= NODE_FLAGS_BANNED;
 
        event_add_timed(ctdb->ev, ctdb->banning_ctx, timeval_current_ofs(bantime->time,0), ctdb_ban_node_event, ctdb);
-       
+       if (bantime->pnn == ctdb->pnn) {
+               return ctdb_local_node_got_banned(ctdb);
+       }
+
        return 0;
 }
 
index 15cc5ee5142bd63eae3761e53c7eaa85c91c1879..dff6f42f86c55d3c3b6173ccb4a0d0ae2b772f7b 100644 (file)
@@ -431,7 +431,6 @@ int32_t ctdb_control_modflags(struct ctdb_context *ctdb, TDB_DATA indata)
        struct ctdb_node_flag_change *c = (struct ctdb_node_flag_change *)indata.dptr;
        struct ctdb_node *node;
        uint32_t old_flags;
-       int i;
 
        if (c->pnn >= ctdb->num_nodes) {
                DEBUG(DEBUG_ERR,(__location__ " Node %d is invalid, num_nodes :%d\n", c->pnn, ctdb->num_nodes));
@@ -481,22 +480,7 @@ int32_t ctdb_control_modflags(struct ctdb_context *ctdb, TDB_DATA indata)
 
        /* if we have become banned, we should go into recovery mode */
        if ((node->flags & NODE_FLAGS_BANNED) && !(c->old_flags & NODE_FLAGS_BANNED) && (node->pnn == ctdb->pnn)) {
-               /* make sure we are frozen */
-               DEBUG(DEBUG_NOTICE,("This node has been banned - forcing freeze and recovery\n"));
-               /* Reset the generation id to 1 to make us ignore any
-                  REQ/REPLY CALL/DMASTER someone sends to us.
-                  We are now banned so we shouldnt service database calls
-                  anymore.
-               */
-               ctdb->vnn_map->generation = INVALID_GENERATION;
-
-               for (i=1; i<=NUM_DB_PRIORITIES; i++) {
-                       if (ctdb_start_freeze(ctdb, i) != 0) {
-                               DEBUG(DEBUG_ERR,(__location__ " Failed to freeze db priority %u\n", i));
-                       }
-               }
-               ctdb_release_all_ips(ctdb);
-               ctdb->recovery_mode = CTDB_RECOVERY_ACTIVE;
+               return ctdb_local_node_got_banned(ctdb);
        }
        
        return 0;