ctdb: send a CTDB_SRVID_START_IPREALLOCATE message after CTDB_EVENT_START_IPREALLOCATE
authorVinit Agnihotri <vagnihotri@ddn.com>
Tue, 27 Feb 2024 08:13:57 +0000 (00:13 -0800)
committerVolker Lendecke <vl@samba.org>
Wed, 6 Mar 2024 06:05:38 +0000 (06:05 +0000)
Event scripts run the "start_ipreallocate" hook in order to notice
that some ip addresses in the cluster potentially changed.

CTDB_SRVID_START_IPREALLOCATE gives C code a chance to get notified as well
once the event scripts are finished.

Signed-off-by: Vinit Agnihotri <vagnihotri@ddn.com>
Reviewed-by: Martin Schwenke <mschwenke@ddn.com>
Reviewed-by: Volker Lendecke <vl@samba.org>
ctdb/protocol/protocol.h
ctdb/protocol/protocol_debug.c
ctdb/protocol/protocol_message.c
ctdb/server/ctdb_takeover.c

index f39eb4acafe57e48fe1b37566dd8bcfe17cf1d9a..99440b39125287a3c7c6cbd34a88f240bcf5f95d 100644 (file)
@@ -143,6 +143,9 @@ struct ctdb_call {
 /* SRVID to inform clients that CTDB_EVENT_IPREALLOCATED finished */
 #define CTDB_SRVID_IPREALLOCATED 0xF302000000000000LL
 
+/* SRVID to inform clients that CTDB_EVENT_START_IPREALLOCATE finished */
+#define CTDB_SRVID_START_IPREALLOCATE 0xF303000000000000LL
+
 /* SRVID to inform recovery daemon of the node flags - OBSOLETE */
 #define CTDB_SRVID_SET_NODE_FLAGS 0xF400000000000000LL
 
index 3a4b09f6bb4d6ae4674f698dab341ed4b471667f..cfa8b47672d98e34261105408b4eb08d56febf62 100644 (file)
@@ -304,6 +304,8 @@ static void ctdb_srvid_print(uint64_t srvid, FILE *fp)
                fprintf(fp, "TAKE_IP");
        } else if (srvid == CTDB_SRVID_IPREALLOCATED) {
                fprintf(fp, "IPREALLOCATED");
+       } else if (srvid == CTDB_SRVID_START_IPREALLOCATE) {
+               fprintf(fp, "START_IPREALLOCATE");
        } else if (srvid == CTDB_SRVID_SET_NODE_FLAGS) {
                fprintf(fp, "SET_NODE_FLAGS");
        } else if (srvid == CTDB_SRVID_RECD_UPDATE_IP) {
index 8d323227914d5526ae0558a27cd423d16b76e204..627d4f8317d47175695c3cb3ecb945b2d9db211a 100644 (file)
@@ -60,6 +60,9 @@ static size_t ctdb_message_data_len(union ctdb_message_data *mdata,
        case CTDB_SRVID_IPREALLOCATED:
                break;
 
+       case CTDB_SRVID_START_IPREALLOCATE:
+               break;
+
        case CTDB_SRVID_SET_NODE_FLAGS:
                len = ctdb_node_flag_change_len(mdata->flag_change);
                break;
@@ -154,6 +157,9 @@ static void ctdb_message_data_push(union ctdb_message_data *mdata,
        case CTDB_SRVID_IPREALLOCATED:
                break;
 
+       case CTDB_SRVID_START_IPREALLOCATE:
+               break;
+
        case CTDB_SRVID_SET_NODE_FLAGS:
                ctdb_node_flag_change_push(mdata->flag_change, buf, &np);
                break;
@@ -253,6 +259,9 @@ static int ctdb_message_data_pull(uint8_t *buf, size_t buflen,
        case CTDB_SRVID_IPREALLOCATED:
                break;
 
+       case CTDB_SRVID_START_IPREALLOCATE:
+               break;
+
        case CTDB_SRVID_SET_NODE_FLAGS:
                ret = ctdb_node_flag_change_pull(buf, buflen, mem_ctx,
                                                 &mdata->flag_change, &np);
index 70d9b85b746a8ac01d91774737dd604e808b740f..79445ec489971f9577c59b409d008bb72e8d227f 100644 (file)
@@ -2458,6 +2458,7 @@ static void ctdb_start_ipreallocate_callback(struct ctdb_context *ctdb,
 {
        struct start_ipreallocate_callback_state *state = talloc_get_type_abort(
                p, struct start_ipreallocate_callback_state);
+       TDB_DATA data = { .dsize = 0, };
 
        if (status != 0) {
                D_ERR("\"startipreallocate\" event failed (status %d)\n",
@@ -2467,6 +2468,12 @@ static void ctdb_start_ipreallocate_callback(struct ctdb_context *ctdb,
                }
        }
 
+       D_INFO("Sending START_IPREALLOCATE message\n");
+       ctdb_daemon_send_message(ctdb,
+                                ctdb->pnn,
+                                CTDB_SRVID_START_IPREALLOCATE,
+                                data);
+
        ctdb_request_control_reply(ctdb, state->c, NULL, status, NULL);
        talloc_free(state);
 }