Просмотр исходного кода

Qdevice: Add expected votes notify callback API

Signed-off-by: Jan Friesse <jfriesse@redhat.com>
Jan Friesse 9 лет назад
Родитель
Сommit
e7beaad5e0

+ 47 - 3
qdevices/qdevice-model-net.c

@@ -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);
 }
 

+ 9 - 0
qdevices/qdevice-net-algo-2nodelms.c

@@ -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,

+ 3 - 0
qdevices/qdevice-net-algo-2nodelms.h

@@ -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);
 

+ 9 - 0
qdevices/qdevice-net-algo-ffsplit.c

@@ -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,

+ 3 - 0
qdevices/qdevice-net-algo-ffsplit.h

@@ -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);
 

+ 9 - 0
qdevices/qdevice-net-algo-lms.c

@@ -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,

+ 3 - 0
qdevices/qdevice-net-algo-lms.h

@@ -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);
 

+ 17 - 0
qdevices/qdevice-net-algo-test.c

@@ -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,

+ 3 - 0
qdevices/qdevice-net-algo-test.h

@@ -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);

+ 16 - 0
qdevices/qdevice-net-algorithm.c

@@ -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)

+ 5 - 0
qdevices/qdevice-net-algorithm.h

@@ -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,

+ 2 - 0
qdevices/qdevice-net-disconnect-reason.h

@@ -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,