]> git.proxmox.com Git - mirror_corosync.git/commitdiff
Qdevice: Add expected votes notify callback API
authorJan Friesse <jfriesse@redhat.com>
Wed, 1 Jun 2016 09:24:32 +0000 (11:24 +0200)
committerJan Friesse <jfriesse@redhat.com>
Tue, 28 Jun 2016 11:58:42 +0000 (13:58 +0200)
Signed-off-by: Jan Friesse <jfriesse@redhat.com>
12 files changed:
qdevices/qdevice-model-net.c
qdevices/qdevice-net-algo-2nodelms.c
qdevices/qdevice-net-algo-2nodelms.h
qdevices/qdevice-net-algo-ffsplit.c
qdevices/qdevice-net-algo-ffsplit.h
qdevices/qdevice-net-algo-lms.c
qdevices/qdevice-net-algo-lms.h
qdevices/qdevice-net-algo-test.c
qdevices/qdevice-net-algo-test.h
qdevices/qdevice-net-algorithm.c
qdevices/qdevice-net-algorithm.h
qdevices/qdevice-net-disconnect-reason.h

index 900cac7ed5c69ad3f710723a1ca941ec0097d793..036ac21efd3b2c88fe2099064506bd0c22d93c69 100644 (file)
@@ -214,7 +214,7 @@ qdevice_model_net_run(struct qdevice_instance *instance)
                        qdevice_log(LOG_ERR, "Algorithm returned error, force exit");
                        return (-1);
                } else {
-                       qdevice_log(LOG_ERR, "Algorithm result vote is %s",
+                       qdevice_log(LOG_DEBUG, "Algorithm result vote is %s",
                            tlv_vote_to_str(vote));
                }
 
@@ -295,8 +295,12 @@ qdevice_model_net_config_node_list_changed(struct qdevice_instance *instance,
 
        if (qdevice_net_algorithm_config_node_list_changed(net_instance, nlist, config_version_set,
            config_version, &send_node_list, &vote) != 0) {
-               qdevice_log(LOG_ERR, "Algorithm returned error, force exit");
-               return (-1);
+               qdevice_log(LOG_ERR, "Algorithm returned error, Disconnecting");
+
+               net_instance->disconnect_reason = QDEVICE_NET_DISCONNECT_REASON_ALGO_CONFIG_NODE_LIST_CHANGED_ERR;
+               net_instance->schedule_disconnect = 1;
+
+               return (0);
        } else {
                qdevice_log(LOG_DEBUG, "Algorithm decided to %s node list and result vote is %s",
                    (send_node_list ? "send" : "not send"), tlv_vote_to_str(vote));
@@ -307,6 +311,8 @@ qdevice_model_net_config_node_list_changed(struct qdevice_instance *instance,
                                " Can't update cast vote timer vote");
                net_instance->disconnect_reason = QDEVICE_NET_DISCONNECT_REASON_CANT_SCHEDULE_VOTING_TIMER;
                net_instance->schedule_disconnect = 1;
+
+               return (0);
        }
 
        if (send_node_list) {
@@ -314,6 +320,8 @@ qdevice_model_net_config_node_list_changed(struct qdevice_instance *instance,
                    config_version, 0) != 0) {
                        net_instance->schedule_disconnect = 1;
                        net_instance->disconnect_reason = QDEVICE_NET_DISCONNECT_REASON_CANT_ALLOCATE_MSG_BUFFER;
+
+                       return (0);
                }
        }
 
@@ -371,6 +379,8 @@ qdevice_model_net_votequorum_quorum_notify(struct qdevice_instance *instance,
 
                net_instance->disconnect_reason = QDEVICE_NET_DISCONNECT_REASON_ALGO_VOTEQUORUM_QUORUM_NOTIFY_ERR;
                net_instance->schedule_disconnect = 1;
+
+               return (0);
        } else {
                qdevice_log(LOG_DEBUG, "Algorithm decided to %s list and result vote is %s",
                    (send_node_list ? "send" : "not send"), tlv_vote_to_str(vote));
@@ -381,6 +391,8 @@ qdevice_model_net_votequorum_quorum_notify(struct qdevice_instance *instance,
                                " Can't update cast vote timer vote");
                net_instance->disconnect_reason = QDEVICE_NET_DISCONNECT_REASON_CANT_SCHEDULE_VOTING_TIMER;
                net_instance->schedule_disconnect = 1;
+
+               return (0);
        }
 
        if (send_node_list) {
@@ -392,6 +404,8 @@ qdevice_model_net_votequorum_quorum_notify(struct qdevice_instance *instance,
                         */
                        net_instance->disconnect_reason = QDEVICE_NET_DISCONNECT_REASON_CANT_ALLOCATE_MSG_BUFFER;
                        net_instance->schedule_disconnect = 1;
+
+                       return (0);
                }
        }
 
@@ -433,6 +447,8 @@ qdevice_model_net_votequorum_node_list_notify(struct qdevice_instance *instance,
 
                net_instance->disconnect_reason = QDEVICE_NET_DISCONNECT_REASON_ALGO_VOTEQUORUM_NODE_LIST_NOTIFY_ERR;
                net_instance->schedule_disconnect = 1;
+
+               return (0);
        } else {
                qdevice_log(LOG_DEBUG, "Algorithm decided to %s list and result vote is %s",
                    (send_node_list ? "send" : "not send"), tlv_vote_to_str(vote));
@@ -446,6 +462,8 @@ qdevice_model_net_votequorum_node_list_notify(struct qdevice_instance *instance,
                         */
                        net_instance->disconnect_reason = QDEVICE_NET_DISCONNECT_REASON_CANT_ALLOCATE_MSG_BUFFER;
                        net_instance->schedule_disconnect = 1;
+
+                       return (0);
                }
        }
 
@@ -454,6 +472,8 @@ qdevice_model_net_votequorum_node_list_notify(struct qdevice_instance *instance,
                    "Can't update cast vote timer");
                net_instance->disconnect_reason = QDEVICE_NET_DISCONNECT_REASON_CANT_SCHEDULE_VOTING_TIMER;
                net_instance->schedule_disconnect = 1;
+
+               return (0);
        }
 
        return (0);
@@ -464,6 +484,7 @@ qdevice_model_net_votequorum_expected_votes_notify(struct qdevice_instance *inst
     uint32_t expected_votes)
 {
        struct qdevice_net_instance *net_instance;
+       enum tlv_vote vote;
 
        net_instance = instance->model_data;
 
@@ -471,6 +492,29 @@ qdevice_model_net_votequorum_expected_votes_notify(struct qdevice_instance *inst
            " (expected votes old=%"PRIu32" / new=%"PRIu32")",
            net_instance->qdevice_instance_ptr->vq_expected_votes, expected_votes);
 
+       vote = TLV_VOTE_NO_CHANGE;
+
+       if (qdevice_net_algorithm_votequorum_expected_votes_notify(net_instance, expected_votes,
+           &vote) != 0) {
+               qdevice_log(LOG_DEBUG, "Algorithm returned error. Disconnecting.");
+
+               net_instance->disconnect_reason = QDEVICE_NET_DISCONNECT_REASON_ALGO_VOTEQUORUM_EXPECTED_VOTES_NOTIFY_ERR;
+               net_instance->schedule_disconnect = 1;
+
+               return (0);
+       } else {
+               qdevice_log(LOG_DEBUG, "Algorithm result vote is %s", tlv_vote_to_str(vote));
+       }
+
+       if (qdevice_net_cast_vote_timer_update(net_instance, vote) != 0) {
+               qdevice_log(LOG_CRIT, "qdevice_model_net_votequorum_expected_votes_notify fatal error. "
+                               " Can't update cast vote timer vote");
+               net_instance->disconnect_reason = QDEVICE_NET_DISCONNECT_REASON_CANT_SCHEDULE_VOTING_TIMER;
+               net_instance->schedule_disconnect = 1;
+
+               return (0);
+       }
+
        return (0);
 }
 
index 44548875ca925e38492ab5681909c6adee4e319c..590e9be623dcbde652ac6d2c596a2d996dcb77fb 100644 (file)
@@ -84,6 +84,14 @@ qdevice_net_algo_2nodelms_votequorum_quorum_notify(struct qdevice_net_instance *
        return (0);
 }
 
+int
+qdevice_net_algo_2nodelms_votequorum_expected_votes_notify(struct qdevice_net_instance *instance,
+    uint32_t expected_votes, enum tlv_vote *vote)
+{
+
+       return (0);
+}
+
 int
 qdevice_net_algo_2nodelms_config_node_list_reply_received(struct qdevice_net_instance *instance,
     uint32_t seq_number, int initial, enum tlv_vote *vote)
@@ -159,6 +167,7 @@ static struct qdevice_net_algorithm qdevice_net_algo_2nodelms = {
        .config_node_list_changed               = qdevice_net_algo_2nodelms_config_node_list_changed,
        .votequorum_node_list_notify            = qdevice_net_algo_2nodelms_votequorum_node_list_notify,
        .votequorum_quorum_notify               = qdevice_net_algo_2nodelms_votequorum_quorum_notify,
+       .votequorum_expected_votes_notify       = qdevice_net_algo_2nodelms_votequorum_expected_votes_notify,
        .config_node_list_reply_received        = qdevice_net_algo_2nodelms_config_node_list_reply_received,
        .membership_node_list_reply_received    = qdevice_net_algo_2nodelms_membership_node_list_reply_received,
        .quorum_node_list_reply_received        = qdevice_net_algo_2nodelms_quorum_node_list_reply_received,
index 36229cc2d3f0e6ef302893e662dfa5116073066c..e52cca68f939e5ed31437dcb95a1a6e3f93195eb 100644 (file)
@@ -59,6 +59,9 @@ extern int    qdevice_net_algo_2nodelms_votequorum_quorum_notify(
     struct qdevice_net_instance *instance, uint32_t quorate, uint32_t node_list_entries,
     votequorum_node_t node_list[], int *send_node_list, enum tlv_vote *vote);
 
+extern int     qdevice_net_algo_2nodelms_votequorum_expected_votes_notify(
+    struct qdevice_net_instance *instance, uint32_t expected_votes, enum tlv_vote *vote);
+
 extern int     qdevice_net_algo_2nodelms_config_node_list_reply_received(
     struct qdevice_net_instance *instance, uint32_t seq_number, int initial, enum tlv_vote *vote);
 
index 4e7daf80fb0148caf508bea875349193b5721af6..c4126020689472edfce984d87710cf98b73adf4f 100644 (file)
@@ -83,6 +83,14 @@ qdevice_net_algo_ffsplit_votequorum_quorum_notify(struct qdevice_net_instance *i
        return (0);
 }
 
+int
+qdevice_net_algo_ffsplit_votequorum_expected_votes_notify(struct qdevice_net_instance *instance,
+    uint32_t expected_votes, enum tlv_vote *vote)
+{
+
+       return (0);
+}
+
 int
 qdevice_net_algo_ffsplit_config_node_list_reply_received(struct qdevice_net_instance *instance,
     uint32_t seq_number, int initial, enum tlv_vote *vote)
@@ -158,6 +166,7 @@ static struct qdevice_net_algorithm qdevice_net_algo_ffsplit = {
        .config_node_list_changed               = qdevice_net_algo_ffsplit_config_node_list_changed,
        .votequorum_node_list_notify            = qdevice_net_algo_ffsplit_votequorum_node_list_notify,
        .votequorum_quorum_notify               = qdevice_net_algo_ffsplit_votequorum_quorum_notify,
+       .votequorum_expected_votes_notify       = qdevice_net_algo_ffsplit_votequorum_expected_votes_notify,
        .config_node_list_reply_received        = qdevice_net_algo_ffsplit_config_node_list_reply_received,
        .membership_node_list_reply_received    = qdevice_net_algo_ffsplit_membership_node_list_reply_received,
        .quorum_node_list_reply_received        = qdevice_net_algo_ffsplit_quorum_node_list_reply_received,
index a33874def047bc73b3979b2b3ea4da23407cd1e2..2100c2e0b0ba7559e219451792fa7559b3988039 100644 (file)
@@ -59,6 +59,9 @@ extern int    qdevice_net_algo_ffsplit_votequorum_quorum_notify(
     struct qdevice_net_instance *instance, uint32_t quorate, uint32_t node_list_entries,
     votequorum_node_t node_list[], int *send_node_list, enum tlv_vote *vote);
 
+extern int     qdevice_net_algo_ffsplit_votequorum_expected_votes_notify(
+    struct qdevice_net_instance *instance, uint32_t expected_votes, enum tlv_vote *vote);
+
 extern int     qdevice_net_algo_ffsplit_config_node_list_reply_received(
     struct qdevice_net_instance *instance, uint32_t seq_number, int initial, enum tlv_vote *vote);
 
index 0ac36fc2444533d1808510bd2815f5aa32124e44..71375b2e31627fb08886a250d9e54f266f66ca92 100644 (file)
@@ -132,6 +132,14 @@ qdevice_net_algo_lms_quorum_node_list_reply_received(struct qdevice_net_instance
        return (0);
 }
 
+int
+qdevice_net_algo_lms_votequorum_expected_votes_notify(struct qdevice_net_instance *instance,
+    uint32_t expected_votes, enum tlv_vote *vote)
+{
+
+       return (0);
+}
+
 int
 qdevice_net_algo_lms_ask_for_vote_reply_received(struct qdevice_net_instance *instance,
     uint32_t seq_number, enum tlv_vote *vote)
@@ -201,6 +209,7 @@ static struct qdevice_net_algorithm qdevice_net_algo_lms = {
        .config_node_list_changed               = qdevice_net_algo_lms_config_node_list_changed,
        .votequorum_node_list_notify            = qdevice_net_algo_lms_votequorum_node_list_notify,
        .votequorum_quorum_notify               = qdevice_net_algo_lms_votequorum_quorum_notify,
+       .votequorum_expected_votes_notify       = qdevice_net_algo_lms_votequorum_expected_votes_notify,
        .config_node_list_reply_received        = qdevice_net_algo_lms_config_node_list_reply_received,
        .membership_node_list_reply_received    = qdevice_net_algo_lms_membership_node_list_reply_received,
        .quorum_node_list_reply_received        = qdevice_net_algo_lms_quorum_node_list_reply_received,
index b39d35996ef14a0ebd350e2908db9c0d2f6aef52..fea9c69c0cc733faea124fb128721e49ca446890 100644 (file)
@@ -59,6 +59,9 @@ extern int    qdevice_net_algo_lms_votequorum_quorum_notify(
     struct qdevice_net_instance *instance, uint32_t quorate, uint32_t node_list_entries,
     votequorum_node_t node_list[], int *send_node_list, enum tlv_vote *vote);
 
+extern int     qdevice_net_algo_lms_votequorum_expected_votes_notify(
+    struct qdevice_net_instance *instance, uint32_t expected_votes, enum tlv_vote *vote);
+
 extern int     qdevice_net_algo_lms_config_node_list_reply_received(
     struct qdevice_net_instance *instance, uint32_t seq_number, int initial, enum tlv_vote *vote);
 
index 18dd8652cd3fdc9fd3c0381dff884232d5e8c9ed..ae4262401a6c98e3804663ded7a82e882802695b 100644 (file)
@@ -152,6 +152,22 @@ qdevice_net_algo_test_votequorum_quorum_notify(struct qdevice_net_instance *inst
 
        return (0);
 }
+/*
+ * Called after votequorum expected_votes notify is dispatched.
+ *
+ * Callback should return 0 on success or -1 on failure (-> disconnect client).
+ *
+ * Vote is set to TLV_VOTE_NO_CHANGE
+ */
+int
+qdevice_net_algo_test_votequorum_expected_votes_notify(struct qdevice_net_instance *instance,
+    uint32_t expected_votes, enum tlv_vote *vote)
+{
+
+       qdevice_log(LOG_INFO, "algo-test: Votequorum expected votes notify");
+
+       return (0);
+}
 
 /*
  * Called when config node list reply is received. Vote is set to value returned by server (and can
@@ -304,6 +320,7 @@ static struct qdevice_net_algorithm qdevice_net_algo_test = {
        .config_node_list_changed               = qdevice_net_algo_test_config_node_list_changed,
        .votequorum_node_list_notify            = qdevice_net_algo_test_votequorum_node_list_notify,
        .votequorum_quorum_notify               = qdevice_net_algo_test_votequorum_quorum_notify,
+       .votequorum_expected_votes_notify       = qdevice_net_algo_test_votequorum_expected_votes_notify,
        .config_node_list_reply_received        = qdevice_net_algo_test_config_node_list_reply_received,
        .membership_node_list_reply_received    = qdevice_net_algo_test_membership_node_list_reply_received,
        .quorum_node_list_reply_received        = qdevice_net_algo_test_quorum_node_list_reply_received,
index cd150b1d91df0fdbbfa54086531bd1229ec37ebc..619cae4690db4d402cb34f0078fa68f3adee412c 100644 (file)
@@ -59,6 +59,9 @@ extern int    qdevice_net_algo_test_votequorum_quorum_notify(
     struct qdevice_net_instance *instance, uint32_t quorate, uint32_t node_list_entries,
     votequorum_node_t node_list[], int *send_node_list, enum tlv_vote *vote);
 
+extern int     qdevice_net_algo_test_votequorum_expected_votes_notify(
+    struct qdevice_net_instance *instance, uint32_t expected_votes, enum tlv_vote *vote);
+
 extern int     qdevice_net_algo_test_config_node_list_reply_received(
     struct qdevice_net_instance *instance, uint32_t seq_number, int initial,
     enum tlv_vote *vote);
index ee7be1604cf034a33f72655081cd37f26cfa056a..079771ffb9cefc305e0be7e151859b7c1b496924 100644 (file)
@@ -125,6 +125,22 @@ qdevice_net_algorithm_votequorum_quorum_notify(struct qdevice_net_instance *inst
            send_node_list, vote));
 }
 
+int
+qdevice_net_algorithm_votequorum_expected_votes_notify(struct qdevice_net_instance *instance,
+    uint32_t expected_votes, enum tlv_vote *vote)
+{
+
+       if (instance->decision_algorithm >= QDEVICE_NET_STATIC_SUPPORTED_DECISION_ALGORITHMS_SIZE ||
+           qdevice_net_algorithm_array[instance->decision_algorithm] == NULL) {
+               qdevice_log(LOG_CRIT, "qdevice_net_algorithm_votequorum_expected_votes_notify "
+                   "unhandled decision algorithm");
+               exit(1);
+       }
+
+       return (qdevice_net_algorithm_array[instance->decision_algorithm]->
+           votequorum_expected_votes_notify(instance, expected_votes, vote));
+}
+
 int
 qdevice_net_algorithm_config_node_list_reply_received(struct qdevice_net_instance *instance,
     uint32_t seq_number, int initial, enum tlv_vote *vote)
index e105fd43e0f153e0e1fd4fabefe0e2bfaecf2d24..61e8a8b6f54cd52ea1c7636f9b749838cad45473 100644 (file)
@@ -63,6 +63,9 @@ extern int    qdevice_net_algorithm_votequorum_quorum_notify(struct qdevice_net_ins
     uint32_t quorate, uint32_t node_list_entries, votequorum_node_t node_list[], int *send_node_list,
     enum tlv_vote *vote);
 
+extern int     qdevice_net_algorithm_votequorum_expected_votes_notify(struct qdevice_net_instance *instance,
+    uint32_t expected_votes, enum tlv_vote *vote);
+
 extern int     qdevice_net_algorithm_config_node_list_reply_received(struct qdevice_net_instance *instance,
     uint32_t seq_number, int initial, enum tlv_vote *vote);
 
@@ -102,6 +105,8 @@ struct qdevice_net_algorithm {
        int (*votequorum_quorum_notify)(struct qdevice_net_instance *instance, uint32_t quorate,
            uint32_t node_list_entries, votequorum_node_t node_list[], int *send_node_list,
            enum tlv_vote *vote);
+       int (*votequorum_expected_votes_notify)(struct qdevice_net_instance *instance,
+           uint32_t expected_votes, enum tlv_vote *vote);
        int (*config_node_list_reply_received)(struct qdevice_net_instance *instance,
            uint32_t seq_number, int initial, enum tlv_vote *vote);
        int (*membership_node_list_reply_received)(struct qdevice_net_instance *instance,
index 5444c5f94e12a049548a9d358cf1f28e5b0a2da0..e8420bd568a5e7b6ac85c14c28fa04998d7641ad 100644 (file)
@@ -92,8 +92,10 @@ enum qdevice_net_disconnect_reason {
        QDEVICE_NET_DISCONNECT_REASON_CANT_CONNECT_TO_THE_SERVER,
 
        QDEVICE_NET_DISCONNECT_REASON_ALGO_CONNECTED_ERR,
+       QDEVICE_NET_DISCONNECT_REASON_ALGO_CONFIG_NODE_LIST_CHANGED_ERR,
        QDEVICE_NET_DISCONNECT_REASON_ALGO_VOTEQUORUM_QUORUM_NOTIFY_ERR,
        QDEVICE_NET_DISCONNECT_REASON_ALGO_VOTEQUORUM_NODE_LIST_NOTIFY_ERR,
+       QDEVICE_NET_DISCONNECT_REASON_ALGO_VOTEQUORUM_EXPECTED_VOTES_NOTIFY_ERR,
        QDEVICE_NET_DISCONNECT_REASON_ALGO_NODE_LIST_REPLY_ERR,
        QDEVICE_NET_DISCONNECT_REASON_ALGO_ASK_FOR_VOTE_REPLY_ERR,
        QDEVICE_NET_DISCONNECT_REASON_ALGO_VOTE_INFO_ERR,