]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
ctdb-daemon: Factor out new function ctdb_node_become_inactive()
authorMartin Schwenke <martin@meltin.net>
Mon, 19 Aug 2019 11:47:03 +0000 (21:47 +1000)
committerKarolin Seeger <kseeger@samba.org>
Wed, 28 Aug 2019 07:36:30 +0000 (07:36 +0000)
This is a superset of ctdb_local_node_got_banned() so will replace
that function, and will also be used in the NODE_STOP control.

BUG: https://bugzilla.samba.org/show_bug.cgi?id=14087

Signed-off-by: Martin Schwenke <martin@meltin.net>
Reviewed-by: Amitay Isaacs <amitay@gmail.com>
(cherry picked from commit a42bcaabb63722411bee52b80cbfc795593defbc)

ctdb/include/ctdb_private.h
ctdb/server/ctdb_recover.c

index af7756f4522c57cf9e88e63d89e8c3e8097e6e6b..7b8121a2e138227ca1401f9c9cac9f92c1a5661f 100644 (file)
@@ -829,6 +829,8 @@ int32_t ctdb_control_recd_ping(struct ctdb_context *ctdb);
 int32_t ctdb_control_set_recmaster(struct ctdb_context *ctdb,
                                   uint32_t opcode, TDB_DATA indata);
 
+void ctdb_node_become_inactive(struct ctdb_context *ctdb);
+
 int32_t ctdb_control_stop_node(struct ctdb_context *ctdb);
 int32_t ctdb_control_continue_node(struct ctdb_context *ctdb);
 
index f05052e8466866acbab2b25a79d62d5d18b23971..800efa2b17d4e462e49e5f8bd27262707063613e 100644 (file)
@@ -1415,6 +1415,49 @@ int32_t ctdb_control_set_recmaster(struct ctdb_context *ctdb, uint32_t opcode, T
        return 0;
 }
 
+void ctdb_node_become_inactive(struct ctdb_context *ctdb)
+{
+       struct ctdb_db_context *ctdb_db;
+
+       D_WARNING("Making node INACTIVE\n");
+
+       /*
+        * Do not service database calls - reset generation to invalid
+        * so this node ignores any REQ/REPLY CALL/DMASTER
+        */
+       ctdb->vnn_map->generation = INVALID_GENERATION;
+       for (ctdb_db = ctdb->db_list; ctdb_db != NULL; ctdb_db = ctdb_db->next) {
+               ctdb_db->generation = INVALID_GENERATION;
+       }
+
+       /*
+        * Although this bypasses the control, the only thing missing
+        * is the deferred drop of all public IPs, which isn't
+        * necessary because they are dropped below
+        */
+       if (ctdb->recovery_mode != CTDB_RECOVERY_ACTIVE) {
+               D_NOTICE("Recovery mode set to ACTIVE\n");
+               ctdb->recovery_mode = CTDB_RECOVERY_ACTIVE;
+       }
+
+       /*
+        * Initiate database freeze - this will be scheduled for
+        * immediate execution and will be in progress long before the
+        * calling control returns
+        */
+       ctdb_daemon_send_control(ctdb,
+                                ctdb->pnn,
+                                0,
+                                CTDB_CONTROL_FREEZE,
+                                0,
+                                CTDB_CTRL_FLAG_NOREPLY,
+                                tdb_null,
+                                NULL,
+                                NULL);
+
+       D_NOTICE("Dropping all public IP addresses\n");
+       ctdb_release_all_ips(ctdb);
+}
 
 int32_t ctdb_control_stop_node(struct ctdb_context *ctdb)
 {