Selaa lähdekoodia

qdevice-net: Allow connect to choose lists to send

Also disconnect and connect can now affect vote timer.

Signed-off-by: Jan Friesse <jfriesse@redhat.com>
Jan Friesse 10 vuotta sitten
vanhempi
commit
3179ccfdba

+ 12 - 1
qdevices/qdevice-model-net.c

@@ -135,6 +135,7 @@ qdevice_model_net_run(struct qdevice_instance *instance)
 	struct qdevice_net_instance *net_instance;
 	int try_connect;
 	int res;
+	enum tlv_vote vote;
 
 	net_instance = instance->model_data;
 
@@ -186,10 +187,20 @@ qdevice_model_net_run(struct qdevice_instance *instance)
 
 		try_connect = qdevice_net_disconnect_reason_try_reconnect(net_instance->disconnect_reason);
 
+		vote = TLV_VOTE_NO_CHANGE;
+
 		if (qdevice_net_algorithm_disconnected(net_instance,
-		    net_instance->disconnect_reason, &try_connect) != 0) {
+		    net_instance->disconnect_reason, &try_connect, &vote) != 0) {
 			qdevice_log(LOG_ERR, "Algorithm returned error, force exit");
 			return (-1);
+		} else {
+			qdevice_log(LOG_ERR, "Algorithm result vote is %s",
+			    tlv_vote_to_str(vote));
+		}
+
+		if (qdevice_net_cast_vote_timer_update(net_instance, vote) != 0) {
+			qdevice_log(LOG_ERR, "qdevice_model_net_run fatal error. "
+			    " Can't update cast vote timer vote");
 		}
 
 		if (net_instance->disconnect_reason ==

+ 3 - 2
qdevices/qdevice-net-algo-2nodelms.c

@@ -50,7 +50,8 @@ qdevice_net_algo_2nodelms_init(struct qdevice_net_instance *instance)
 }
 
 int
-qdevice_net_algo_2nodelms_connected(struct qdevice_net_instance *instance)
+qdevice_net_algo_2nodelms_connected(struct qdevice_net_instance *instance, int *send_config_node_list,
+    int *send_membership_node_list, int *send_quorum_node_list, enum tlv_vote *vote)
 {
 
 	return (0);
@@ -140,7 +141,7 @@ qdevice_net_algo_2nodelms_echo_reply_not_received(struct qdevice_net_instance *i
 
 int
 qdevice_net_algo_2nodelms_disconnected(struct qdevice_net_instance *instance,
-    enum qdevice_net_disconnect_reason disconnect_reason, int *try_reconnect)
+    enum qdevice_net_disconnect_reason disconnect_reason, int *try_reconnect, enum tlv_vote *vote)
 {
 
 	return (0);

+ 4 - 2
qdevices/qdevice-net-algo-2nodelms.h

@@ -43,7 +43,9 @@ extern "C" {
 
 extern int	qdevice_net_algo_2nodelms_init(struct qdevice_net_instance *instance);
 
-extern int	qdevice_net_algo_2nodelms_connected(struct qdevice_net_instance *instance);
+extern int	qdevice_net_algo_2nodelms_connected(struct qdevice_net_instance *instance,
+    int *send_config_node_list, int *send_membership_node_list, int *send_quorum_node_list,
+    enum tlv_vote *vote);
 
 extern int      qdevice_net_algo_2nodelms_config_node_list_changed(
     struct qdevice_net_instance *instance, const struct node_list *nlist,
@@ -82,7 +84,7 @@ extern int	qdevice_net_algo_2nodelms_echo_reply_not_received(
     struct qdevice_net_instance *instance);
 
 extern int	qdevice_net_algo_2nodelms_disconnected(struct qdevice_net_instance *instance,
-    enum qdevice_net_disconnect_reason disconnect_reason, int *try_reconnect);
+    enum qdevice_net_disconnect_reason disconnect_reason, int *try_reconnect, enum tlv_vote *vote);
 
 extern void	qdevice_net_algo_2nodelms_destroy(struct qdevice_net_instance *instance);
 

+ 3 - 2
qdevices/qdevice-net-algo-ffsplit.c

@@ -50,7 +50,8 @@ qdevice_net_algo_ffsplit_init(struct qdevice_net_instance *instance)
 }
 
 int
-qdevice_net_algo_ffsplit_connected(struct qdevice_net_instance *instance)
+qdevice_net_algo_ffsplit_connected(struct qdevice_net_instance *instance, int *send_config_node_list,
+    int *send_membership_node_list, int *send_quorum_node_list, enum tlv_vote *vote)
 {
 
 	return (0);
@@ -139,7 +140,7 @@ qdevice_net_algo_ffsplit_echo_reply_not_received(struct qdevice_net_instance *in
 
 int
 qdevice_net_algo_ffsplit_disconnected(struct qdevice_net_instance *instance,
-    enum qdevice_net_disconnect_reason disconnect_reason, int *try_reconnect)
+    enum qdevice_net_disconnect_reason disconnect_reason, int *try_reconnect, enum tlv_vote *vote)
 {
 
 	return (0);

+ 4 - 2
qdevices/qdevice-net-algo-ffsplit.h

@@ -43,7 +43,9 @@ extern "C" {
 
 extern int	qdevice_net_algo_ffsplit_init(struct qdevice_net_instance *instance);
 
-extern int	qdevice_net_algo_ffsplit_connected(struct qdevice_net_instance *instance);
+extern int	qdevice_net_algo_ffsplit_connected(struct qdevice_net_instance *instance,
+    int *send_config_node_list, int *send_membership_node_list, int *send_quorum_node_list,
+    enum tlv_vote *vote);
 
 extern int      qdevice_net_algo_ffsplit_config_node_list_changed(
     struct qdevice_net_instance *instance, const struct node_list *nlist,
@@ -82,7 +84,7 @@ extern int	qdevice_net_algo_ffsplit_echo_reply_not_received(
     struct qdevice_net_instance *instance);
 
 extern int	qdevice_net_algo_ffsplit_disconnected(struct qdevice_net_instance *instance,
-    enum qdevice_net_disconnect_reason disconnect_reason, int *try_reconnect);
+    enum qdevice_net_disconnect_reason disconnect_reason, int *try_reconnect, enum tlv_vote *vote);
 
 extern void	qdevice_net_algo_ffsplit_destroy(struct qdevice_net_instance *instance);
 

+ 3 - 2
qdevices/qdevice-net-algo-lms.c

@@ -50,7 +50,8 @@ qdevice_net_algo_lms_init(struct qdevice_net_instance *instance)
 }
 
 int
-qdevice_net_algo_lms_connected(struct qdevice_net_instance *instance)
+qdevice_net_algo_lms_connected(struct qdevice_net_instance *instance, int *send_config_node_list,
+    int *send_membership_node_list, int *send_quorum_node_list, enum tlv_vote *vote)
 {
 
 	return (0);
@@ -140,7 +141,7 @@ qdevice_net_algo_lms_echo_reply_not_received(struct qdevice_net_instance *instan
 
 int
 qdevice_net_algo_lms_disconnected(struct qdevice_net_instance *instance,
-    enum qdevice_net_disconnect_reason disconnect_reason, int *try_reconnect)
+    enum qdevice_net_disconnect_reason disconnect_reason, int *try_reconnect, enum tlv_vote *vote)
 {
 
 	return (0);

+ 4 - 2
qdevices/qdevice-net-algo-lms.h

@@ -43,7 +43,9 @@ extern "C" {
 
 extern int	qdevice_net_algo_lms_init(struct qdevice_net_instance *instance);
 
-extern int	qdevice_net_algo_lms_connected(struct qdevice_net_instance *instance);
+extern int	qdevice_net_algo_lms_connected(struct qdevice_net_instance *instance,
+    int *send_config_node_list, int *send_membership_node_list, int *send_quorum_node_list,
+    enum tlv_vote *vote);
 
 extern int      qdevice_net_algo_lms_config_node_list_changed(
     struct qdevice_net_instance *instance, const struct node_list *nlist,
@@ -82,7 +84,7 @@ extern int	qdevice_net_algo_lms_echo_reply_not_received(
     struct qdevice_net_instance *instance);
 
 extern int	qdevice_net_algo_lms_disconnected(struct qdevice_net_instance *instance,
-    enum qdevice_net_disconnect_reason disconnect_reason, int *try_reconnect);
+    enum qdevice_net_disconnect_reason disconnect_reason, int *try_reconnect, enum tlv_vote *vote);
 
 extern void	qdevice_net_algo_lms_destroy(struct qdevice_net_instance *instance);
 

+ 7 - 2
qdevices/qdevice-net-algo-test.c

@@ -59,11 +59,15 @@ qdevice_net_algo_test_init(struct qdevice_net_instance *instance)
 
 /*
  * Called after qdevice connected to qnetd.
+ * send_config_node_list, send_membership_node_list and send_quorum_node_list can be set to
+ * nonzero (default) to make qdevice-net send given lists to qnetd
+ * vote (default TLV_VOTE_WAIT_FOR_REPLY) can be set to update voting timer
  *
  * Callback should return 0 on success or -1 on failure (-> disconnect client).
  */
 int
-qdevice_net_algo_test_connected(struct qdevice_net_instance *instance)
+qdevice_net_algo_test_connected(struct qdevice_net_instance *instance, int *send_config_node_list,
+    int *send_membership_node_list, int *send_quorum_node_list, enum tlv_vote *vote)
 {
 
 	qdevice_log(LOG_INFO, "algo-test: Connected");
@@ -270,12 +274,13 @@ qdevice_net_algo_test_echo_reply_not_received(struct qdevice_net_instance *insta
  *
  * disconnect_reason contains one of QDEVICE_NET_DISCONNECT_REASON_
  * try_reconnect can be set to non zero value if reconnect to server should be tried
+ * vote (default TLV_VOTE_NO_CHANGE) can be set to update voting timer
  *
  * Callback should return 0 on success, -1 on failure (-> force exit)
  */
 int
 qdevice_net_algo_test_disconnected(struct qdevice_net_instance *instance,
-    enum qdevice_net_disconnect_reason disconnect_reason, int *try_reconnect)
+    enum qdevice_net_disconnect_reason disconnect_reason, int *try_reconnect, enum tlv_vote *vote)
 {
 
 	qdevice_log(LOG_INFO, "algo-test: Disconnected");

+ 4 - 2
qdevices/qdevice-net-algo-test.h

@@ -43,7 +43,9 @@ extern "C" {
 
 extern int	qdevice_net_algo_test_init(struct qdevice_net_instance *instance);
 
-extern int	qdevice_net_algo_test_connected(struct qdevice_net_instance *instance);
+extern int	qdevice_net_algo_test_connected(struct qdevice_net_instance *instance,
+    int *send_config_node_list, int *send_membership_node_list, int *send_quorum_node_list,
+    enum tlv_vote *vote);
 
 extern int      qdevice_net_algo_test_config_node_list_changed(
     struct qdevice_net_instance *instance, const struct node_list *nlist,
@@ -83,7 +85,7 @@ extern int	qdevice_net_algo_test_echo_reply_not_received(
     struct qdevice_net_instance *instance);
 
 extern int	qdevice_net_algo_test_disconnected(struct qdevice_net_instance *instance,
-    enum qdevice_net_disconnect_reason disconnect_reason, int *try_reconnect);
+    enum qdevice_net_disconnect_reason disconnect_reason, int *try_reconnect, enum tlv_vote *vote);
 
 extern void	qdevice_net_algo_test_destroy(struct qdevice_net_instance *instance);
 

+ 6 - 4
qdevices/qdevice-net-algorithm.c

@@ -59,7 +59,8 @@ qdevice_net_algorithm_init(struct qdevice_net_instance *instance)
 }
 
 int
-qdevice_net_algorithm_connected(struct qdevice_net_instance *instance)
+qdevice_net_algorithm_connected(struct qdevice_net_instance *instance, int *send_config_node_list,
+    int *send_membership_node_list, int *send_quorum_node_list, enum tlv_vote *vote)
 {
 
 	if (instance->decision_algorithm >= QDEVICE_NET_STATIC_SUPPORTED_DECISION_ALGORITHMS_SIZE ||
@@ -68,7 +69,8 @@ qdevice_net_algorithm_connected(struct qdevice_net_instance *instance)
 		exit(1);
 	}
 
-	return (qdevice_net_algorithm_array[instance->decision_algorithm]->connected(instance));
+	return (qdevice_net_algorithm_array[instance->decision_algorithm]->connected(instance,
+	    send_config_node_list, send_membership_node_list, send_quorum_node_list, vote));
 }
 
 int
@@ -236,7 +238,7 @@ qdevice_net_algorithm_echo_reply_not_received(struct qdevice_net_instance *insta
 
 int
 qdevice_net_algorithm_disconnected(struct qdevice_net_instance *instance,
-    enum qdevice_net_disconnect_reason disconnect_reason, int *try_reconnect)
+    enum qdevice_net_disconnect_reason disconnect_reason, int *try_reconnect, enum tlv_vote *vote)
 {
 
 	if (instance->decision_algorithm >= QDEVICE_NET_STATIC_SUPPORTED_DECISION_ALGORITHMS_SIZE ||
@@ -247,7 +249,7 @@ qdevice_net_algorithm_disconnected(struct qdevice_net_instance *instance,
 	}
 
 	return (qdevice_net_algorithm_array[instance->decision_algorithm]->
-	    disconnected(instance, disconnect_reason, try_reconnect));
+	    disconnected(instance, disconnect_reason, try_reconnect, vote));
 }
 
 void

+ 9 - 4
qdevices/qdevice-net-algorithm.h

@@ -47,7 +47,9 @@ extern "C" {
 
 extern int	qdevice_net_algorithm_init(struct qdevice_net_instance *instance);
 
-extern int	qdevice_net_algorithm_connected(struct qdevice_net_instance *instance);
+extern int	qdevice_net_algorithm_connected(struct qdevice_net_instance *instance,
+    int *send_config_node_list, int *send_membership_node_list, int *send_quorum_node_list,
+    enum tlv_vote *vote);
 
 extern int	qdevice_net_algorithm_config_node_list_changed(struct qdevice_net_instance *instance,
     const struct node_list *nlist, int config_version_set, uint64_t config_version,
@@ -82,13 +84,15 @@ extern int	qdevice_net_algorithm_echo_reply_received(struct qdevice_net_instance
 extern int	qdevice_net_algorithm_echo_reply_not_received(struct qdevice_net_instance *instance);
 
 extern int	qdevice_net_algorithm_disconnected(struct qdevice_net_instance *instance,
-    enum qdevice_net_disconnect_reason disconnect_reason, int *try_reconnect);
+    enum qdevice_net_disconnect_reason disconnect_reason, int *try_reconnect, enum tlv_vote *vote);
 
 extern void	qdevice_net_algorithm_destroy(struct qdevice_net_instance *instance);
 
 struct qdevice_net_algorithm {
 	int (*init)(struct qdevice_net_instance *instance);
-	int (*connected)(struct qdevice_net_instance *instance);
+	int (*connected)(struct qdevice_net_instance *instance,
+	    int *send_config_node_list, int *send_membership_node_list, int *send_quorum_node_list,
+	    enum tlv_vote *vote);
 	int (*config_node_list_changed)(struct qdevice_net_instance *instance,
 	    const struct node_list *nlist, int config_version_set, uint64_t config_version,
 	    int *send_node_list, enum tlv_vote *vote);
@@ -112,7 +116,8 @@ struct qdevice_net_algorithm {
 	    uint32_t seq_number, int is_expected_seq_number);
 	int (*echo_reply_not_received)(struct qdevice_net_instance *instance);
 	int (*disconnected)(struct qdevice_net_instance *instance,
-	    enum qdevice_net_disconnect_reason disconnect_reason, int *try_reconnect);
+	    enum qdevice_net_disconnect_reason disconnect_reason, int *try_reconnect,
+	    enum tlv_vote *vote);
 	void (*destroy)(struct qdevice_net_instance *instance);
 };
 

+ 46 - 23
qdevices/qdevice-net-msg-received.c

@@ -449,6 +449,10 @@ qdevice_net_msg_received_set_option_reply(struct qdevice_net_instance *instance,
 {
 	struct tlv_ring_id tlv_rid;
 	enum tlv_quorate quorate;
+	int send_config_node_list;
+	int send_membership_node_list;
+	int send_quorum_node_list;
+	enum tlv_vote vote;
 
 	if (instance->state != QDEVICE_NET_INSTANCE_STATE_WAITING_SET_OPTION_REPLY) {
 		qdevice_log(LOG_ERR, "Received unexpected set option reply message. "
@@ -512,45 +516,64 @@ qdevice_net_msg_received_set_option_reply(struct qdevice_net_instance *instance,
 		}
 	}
 
-	if (qdevice_net_algorithm_connected(instance) != 0) {
+	send_config_node_list = 1;
+	send_membership_node_list = 1;
+	send_quorum_node_list = 1;
+	vote = TLV_VOTE_WAIT_FOR_REPLY;
+
+	if (qdevice_net_algorithm_connected(instance, &send_config_node_list, &send_membership_node_list,
+	    &send_quorum_node_list, &vote) != 0) {
 		qdevice_log(LOG_DEBUG, "Algorithm returned error. Disconnecting.");
 		instance->disconnect_reason = QDEVICE_NET_DISCONNECT_REASON_ALGO_CONNECTED_ERR;
 		return (-1);
+	} else {
+		qdevice_log(LOG_DEBUG, "Algorithm decided to %s config node list, %s membership "
+		    "node list, %s quorum node list and result vote is %s",
+		    (send_config_node_list ? "send" : "not send"),
+		    (send_membership_node_list ? "send" : "not send"),
+		    (send_quorum_node_list ? "send" : "not send"),
+		    tlv_vote_to_str(vote));
 	}
 
 	/*
 	 * Now we can finally really send node list, votequorum node list and update timer
 	 */
-	if (qdevice_net_send_config_node_list(instance,
-	    &instance->qdevice_instance_ptr->config_node_list,
-	    instance->qdevice_instance_ptr->config_node_list_version_set,
-	    instance->qdevice_instance_ptr->config_node_list_version, 1) != 0) {
-		instance->disconnect_reason = QDEVICE_NET_DISCONNECT_REASON_CANT_ALLOCATE_MSG_BUFFER;
-		return (-1);
+	if (send_config_node_list) {
+		if (qdevice_net_send_config_node_list(instance,
+		    &instance->qdevice_instance_ptr->config_node_list,
+		    instance->qdevice_instance_ptr->config_node_list_version_set,
+		    instance->qdevice_instance_ptr->config_node_list_version, 1) != 0) {
+			instance->disconnect_reason = QDEVICE_NET_DISCONNECT_REASON_CANT_ALLOCATE_MSG_BUFFER;
+			return (-1);
+		}
 	}
 
-	qdevice_net_votequorum_ring_id_to_tlv(&tlv_rid,
-	    &instance->qdevice_instance_ptr->vq_node_list_ring_id);
+	if (send_membership_node_list) {
+		qdevice_net_votequorum_ring_id_to_tlv(&tlv_rid,
+		    &instance->qdevice_instance_ptr->vq_node_list_ring_id);
 
-	if (qdevice_net_send_membership_node_list(instance, &tlv_rid,
-	    instance->qdevice_instance_ptr->vq_node_list_entries,
-	    instance->qdevice_instance_ptr->vq_node_list) != 0) {
-		instance->disconnect_reason = QDEVICE_NET_DISCONNECT_REASON_CANT_ALLOCATE_MSG_BUFFER;
-		return (-1);
+		if (qdevice_net_send_membership_node_list(instance, &tlv_rid,
+		    instance->qdevice_instance_ptr->vq_node_list_entries,
+		    instance->qdevice_instance_ptr->vq_node_list) != 0) {
+			instance->disconnect_reason = QDEVICE_NET_DISCONNECT_REASON_CANT_ALLOCATE_MSG_BUFFER;
+			return (-1);
+		}
 	}
 
-	quorate = (instance->qdevice_instance_ptr->vq_quorum_quorate ?
-	    TLV_QUORATE_QUORATE : TLV_QUORATE_INQUORATE);
+	if (send_quorum_node_list) {
+		quorate = (instance->qdevice_instance_ptr->vq_quorum_quorate ?
+		    TLV_QUORATE_QUORATE : TLV_QUORATE_INQUORATE);
 
-	if (qdevice_net_send_quorum_node_list(instance,
-	    quorate,
-	    instance->qdevice_instance_ptr->vq_quorum_node_list_entries,
-	    instance->qdevice_instance_ptr->vq_quorum_node_list) != 0) {
-		instance->disconnect_reason = QDEVICE_NET_DISCONNECT_REASON_CANT_ALLOCATE_MSG_BUFFER;
-		return (-1);
+		if (qdevice_net_send_quorum_node_list(instance,
+		    quorate,
+		    instance->qdevice_instance_ptr->vq_quorum_node_list_entries,
+		    instance->qdevice_instance_ptr->vq_quorum_node_list) != 0) {
+			instance->disconnect_reason = QDEVICE_NET_DISCONNECT_REASON_CANT_ALLOCATE_MSG_BUFFER;
+			return (-1);
+		}
 	}
 
-	if (qdevice_net_cast_vote_timer_update(instance, TLV_VOTE_WAIT_FOR_REPLY) != 0) {
+	if (qdevice_net_cast_vote_timer_update(instance, vote) != 0) {
 		qdevice_log(LOG_CRIT, "qdevice_net_msg_received_set_option_reply fatal error. "
 		    " Can't update cast vote timer vote");
 		instance->disconnect_reason = QDEVICE_NET_DISCONNECT_REASON_CANT_SCHEDULE_VOTING_TIMER;