Преглед изворни кода

qnet: Add TLV_VOTE_NO_CHANGE

State used for informative only callbacks (quorum node list) and
possibly informative only callbacks (configuration node list). Client
doesn't change cast vote timer state.

Signed-off-by: Jan Friesse <jfriesse@redhat.com>
Jan Friesse пре 10 година
родитељ
комит
8c0a45de41

+ 9 - 6
qdevices/corosync-qdevice-net.c

@@ -578,7 +578,7 @@ qdevice_net_msg_received_node_list_reply(struct qdevice_net_instance *instance,
 		return (-1);
 	}
 
-	if (!msg->seq_number_set) {
+	if (!msg->vote_set || !msg->seq_number_set) {
 		qdevice_net_log(LOG_ERR, "Received node list reply message without "
 		    "required options. Disconnecting from server");
 
@@ -588,11 +588,13 @@ qdevice_net_msg_received_node_list_reply(struct qdevice_net_instance *instance,
 	/*
 	 * TODO API
 	 */
-	qdevice_net_log(LOG_INFO, "Received node list reply seq=%"PRIu32", vote_set=%u, vote=%u",
-	    msg->seq_number, msg->vote_set, (msg->vote_set ? msg->vote : 0));
+	qdevice_net_log(LOG_INFO, "Received node list reply seq=%"PRIu32", vote=%u",
+	    msg->seq_number, msg->vote);
 
-	if (msg->vote_set && qdevice_net_cast_vote_timer_update(instance, msg->vote) != 0) {
-		return (-1);
+	if (msg->vote != TLV_VOTE_NO_CHANGE) {
+		if (qdevice_net_cast_vote_timer_update(instance, msg->vote) != 0) {
+			return (-1);
+		}
 	}
 
 	return (0);
@@ -1148,7 +1150,8 @@ qdevice_net_instance_init_from_cmap(struct qdevice_net_instance *instance,
 	 */
 	if (qdevice_net_instance_init(instance,
 	    QDEVICE_NET_INITIAL_MSG_RECEIVE_SIZE, QDEVICE_NET_INITIAL_MSG_SEND_SIZE,
-	    QDEVICE_NET_MIN_MSG_SEND_SIZE, QDEVICE_NET_MAX_SEND_BUFFERS, QDEVICE_NET_MAX_MSG_RECEIVE_SIZE,
+	    QDEVICE_NET_MIN_MSG_SEND_SIZE, QDEVICE_NET_MAX_SEND_BUFFERS,
+	    QDEVICE_NET_MAX_MSG_RECEIVE_SIZE,
 	    tls_supported, node_id, decision_algorithm,
 	    heartbeat_interval, sync_heartbeat_interval, cast_vote_timer_interval,
 	    host_addr, host_port, cluster_name) == -1) {

+ 2 - 7
qdevices/corosync-qnetd.c

@@ -631,7 +631,6 @@ qnetd_client_msg_received_node_list(struct qnetd_instance *instance, struct qnet
 	struct send_buffer_list_entry *send_buffer;
 	enum tlv_reply_error_code reply_error_code;
 	enum tlv_vote result_vote;
-	int add_result_vote;
 
 	reply_error_code = TLV_REPLY_ERROR_CODE_NO_ERROR;
 
@@ -675,8 +674,6 @@ qnetd_client_msg_received_node_list(struct qnetd_instance *instance, struct qnet
 		return (0);
 	}
 
-	add_result_vote = 1;
-
 	switch (msg->node_list_type) {
 	case TLV_NODE_LIST_TYPE_INITIAL_CONFIG:
 	case TLV_NODE_LIST_TYPE_CHANGED_CONFIG:
@@ -715,8 +712,7 @@ qnetd_client_msg_received_node_list(struct qnetd_instance *instance, struct qnet
 			return (0);
 		}
 		reply_error_code = qnetd_algorithm_quorum_node_list_received(client,
-		    msg->seq_number,msg->quorate, &msg->nodes);
-		add_result_vote = 0;
+		    msg->seq_number,msg->quorate, &msg->nodes, &result_vote);
 		break;
 	default:
 		errx(1, "qnetd_client_msg_received_node_list fatal error. "
@@ -782,8 +778,7 @@ qnetd_client_msg_received_node_list(struct qnetd_instance *instance, struct qnet
 		return (-1);
 	}
 
-	if (msg_create_node_list_reply(&send_buffer->buffer, msg->seq_number, add_result_vote,
-	    result_vote) == -1) {
+	if (msg_create_node_list_reply(&send_buffer->buffer, msg->seq_number, result_vote) == -1) {
 		qnetd_log(LOG_ERR, "Can't alloc node list reply msg. "
 		    "Disconnecting client connection.");
 

+ 3 - 5
qdevices/msg.c

@@ -565,7 +565,7 @@ small_buf_err:
 
 size_t
 msg_create_node_list_reply(struct dynar *msg, uint32_t msg_seq_number,
-    int add_result_vote, enum tlv_vote vote)
+    enum tlv_vote vote)
 {
 
 	dynar_clean(msg);
@@ -577,10 +577,8 @@ msg_create_node_list_reply(struct dynar *msg, uint32_t msg_seq_number,
 		goto small_buf_err;
 	}
 
-	if (add_result_vote) {
-		if (tlv_add_vote(msg, vote) == -1) {
-			goto small_buf_err;
-		}
+	if (tlv_add_vote(msg, vote) == -1) {
+		goto small_buf_err;
 	}
 
 	msg_set_len(msg, dynar_size(msg) - (MSG_TYPE_LENGTH + MSG_LENGTH_LENGTH));

+ 1 - 1
qdevices/msg.h

@@ -159,7 +159,7 @@ extern size_t		msg_create_node_list(struct dynar *msg,
     const struct node_list *nodes);
 
 extern size_t		msg_create_node_list_reply(struct dynar *msg, uint32_t msg_seq_number,
-    int add_result_vote, enum tlv_vote vote);
+    enum tlv_vote vote);
 
 extern size_t		msg_create_ask_for_vote(struct dynar *msg, uint32_t msg_seq_number);
 

+ 17 - 3
qdevices/qdevice-net-cast-vote-timer.c

@@ -56,6 +56,7 @@ qdevice_net_cast_vote_timer_callback(void *data1, void *data2)
 		break;
 	case TLV_VOTE_ASK_LATER:
 	case TLV_VOTE_WAIT_FOR_REPLY:
+	case TLV_VOTE_NO_CHANGE:
 	default:
 		errx(1, "qdevice_net_timer_cast_vote: Unhandled cast_vote_timer_vote %u\n",
 		    instance->cast_vote_timer_vote);
@@ -68,9 +69,11 @@ qdevice_net_cast_vote_timer_callback(void *data1, void *data2)
 
 	if (res != CS_OK && res != CS_ERR_TRY_AGAIN) {
 		if (res == CS_ERR_MESSAGE_ERROR) {
-			qdevice_net_log(LOG_INFO, "votequorum_qdevice_poll called with old ring id, rescheduling timer");
+			qdevice_net_log(LOG_INFO, "votequorum_qdevice_poll called with old ring id,"
+			    " rescheduling timer");
 		} else {
-			qdevice_net_log(LOG_CRIT, "Can't call votequorum_qdevice_poll. Error %u", res);
+			qdevice_net_log(LOG_CRIT, "Can't call votequorum_qdevice_poll. Error %u",
+			    res);
 
 			instance->schedule_disconnect = 1;
 			return (0);
@@ -97,6 +100,10 @@ qdevice_net_cast_vote_timer_update(struct qdevice_net_instance *instance, enum t
 	case TLV_VOTE_ASK_LATER:
 		timer_needs_running = 0;
 		break;
+	case TLV_VOTE_NO_CHANGE:
+		errx(1, "qdevice_net_cast_vote_timer_update_vote: Incorrect vote parameter %u\n",
+		    vote);
+		break;
 	default:
 		errx(1, "qdevice_net_cast_vote_timer_update_vote: Unhandled vote parameter %u\n",
 		    vote);
@@ -112,9 +119,13 @@ qdevice_net_cast_vote_timer_update(struct qdevice_net_instance *instance, enum t
 			    qdevice_net_cast_vote_timer_callback, (void *)instance, NULL);
 
 			if (instance->cast_vote_timer == NULL) {
-				qdevice_net_log(LOG_ERR, "Can't schedule sending of votequorum poll");
+				qdevice_net_log(LOG_ERR, "Can't schedule sending of "
+				    "votequorum poll");
 
 				return (-1);
+			} else {
+				qdevice_net_log(LOG_DEBUG, "Cast vote timer is now scheduled every "
+				    "%"PRIu32"ms.", instance->cast_vote_timer_interval);
 			}
 		}
 
@@ -125,6 +136,9 @@ qdevice_net_cast_vote_timer_update(struct qdevice_net_instance *instance, enum t
 		if (instance->cast_vote_timer != NULL) {
 			timer_list_delete(&instance->main_timer_list, instance->cast_vote_timer);
 			instance->cast_vote_timer = NULL;
+			qdevice_net_log(LOG_DEBUG, "Cast vote timer is now stopped.");
+		} else {
+			qdevice_net_log(LOG_DEBUG, "Cast vote timer remains stopped.");
 		}
 	}
 

+ 2 - 1
qdevices/qdevice-net-cmap.c

@@ -138,7 +138,8 @@ qdevice_net_cmap_get_nodelist(cmap_handle_t cmap_handle, struct node_list *list)
 				return (-1);
 			}
 
-			node_id = qdevice_net_cmap_autogenerate_node_id(addr0_str, clear_node_high_byte);
+			node_id = qdevice_net_cmap_autogenerate_node_id(addr0_str,
+			    clear_node_high_byte);
 
 			free(addr0_str);
 		} else if (cs_err != CS_OK) {

+ 21 - 0
qdevices/qdevice-net-send.c

@@ -138,6 +138,8 @@ qdevice_net_send_config_node_list(struct qdevice_net_instance *instance, int ini
 	struct send_buffer_list_entry *send_buffer;
 	uint64_t config_version;
 	int send_config_version;
+	struct node_list_entry *node_info;
+	size_t zi;
 
 	/*
 	 * Send initial node list
@@ -163,6 +165,19 @@ qdevice_net_send_config_node_list(struct qdevice_net_instance *instance, int ini
 
 	instance->last_msg_seq_num++;
 
+	qdevice_net_log(LOG_DEBUG, "Sending config node list seq=%"PRIu32".",
+	    instance->last_msg_seq_num);
+
+	qdevice_net_log(LOG_DEBUG, "  Node list:");
+
+	zi = 0;
+
+	TAILQ_FOREACH(node_info, &nlist, entries) {
+		qdevice_net_log(LOG_DEBUG, "    %zu node_id = %"PRIx32", "
+		    "data_center_id = %"PRIx32, zi, node_info->node_id, node_info->data_center_id);
+		zi++;
+        }
+
 	if (msg_create_node_list(&send_buffer->buffer, instance->last_msg_seq_num,
 	    (initial ? TLV_NODE_LIST_TYPE_INITIAL_CONFIG : TLV_NODE_LIST_TYPE_CHANGED_CONFIG),
 	    0, NULL, send_config_version, config_version, 0, TLV_QUORATE_INQUORATE, &nlist) == 0) {
@@ -213,6 +228,9 @@ qdevice_net_send_membership_node_list(struct qdevice_net_instance *instance,
 
 	instance->last_msg_seq_num++;
 
+	qdevice_net_log(LOG_DEBUG, "Sending membership node list seq=%"PRIu32".",
+	    instance->last_msg_seq_num);
+
 	if (msg_create_node_list(&send_buffer->buffer, instance->last_msg_seq_num,
 	    TLV_NODE_LIST_TYPE_MEMBERSHIP,
 	    1, ring_id, 0, 0, 0, 0, &nlist) == 0) {
@@ -268,6 +286,9 @@ qdevice_net_send_quorum_node_list(struct qdevice_net_instance *instance,
 
 	instance->last_msg_seq_num++;
 
+	qdevice_net_log(LOG_DEBUG, "Sending quorum node list seq=%"PRIu32".",
+	    instance->last_msg_seq_num);
+
 	if (msg_create_node_list(&send_buffer->buffer, instance->last_msg_seq_num,
 	    TLV_NODE_LIST_TYPE_QUORUM,
 	    0, NULL, 0, 0, 1, quorate, &nlist) == 0) {

+ 23 - 64
qdevices/qdevice-net-votequorum.c

@@ -86,15 +86,6 @@ qdevice_net_votequorum_quorum_notify_callback(votequorum_handle_t votequorum_han
 		errx(1, "Fatal error. Can't get votequorum context");
 	}
 
-	if (qdevice_net_send_quorum_node_list(instance,
-	    (quorate ? TLV_QUORATE_QUORATE : TLV_QUORATE_INQUORATE),
-	    node_list_entries, node_list) != 0) {
-		/*
-		 * Fatal error -> schedule disconnect
-		 */
-		instance->schedule_disconnect = 1;
-	}
-
 	qdevice_net_log(LOG_DEBUG, "Votequorum quorum notify callback:");
 	qdevice_net_log(LOG_DEBUG, "  Quorate = %u", quorate);
 
@@ -103,6 +94,15 @@ qdevice_net_votequorum_quorum_notify_callback(votequorum_handle_t votequorum_han
 		qdevice_net_log(LOG_DEBUG, "    %"PRIu32" nodeid = %"PRIu32", state = %"PRIu32,
 		    u32, node_list[u32].nodeid, node_list[u32].state);
 	}
+
+	if (qdevice_net_send_quorum_node_list(instance,
+	    (quorate ? TLV_QUORATE_QUORATE : TLV_QUORATE_INQUORATE),
+	    node_list_entries, node_list) != 0) {
+		/*
+		 * Fatal error -> schedule disconnect
+		 */
+		instance->schedule_disconnect = 1;
+	}
 }
 
 static void
@@ -118,6 +118,16 @@ qdevice_net_votequorum_node_list_notify_callback(votequorum_handle_t votequorum_
 		errx(1, "Fatal error. Can't get votequorum context");
 	}
 
+	qdevice_net_log(LOG_DEBUG, "Votequorum nodelist notify callback:");
+	qdevice_net_log(LOG_DEBUG, "  Ring_id = (%"PRIx32".%"PRIx64")",
+	    votequorum_ring_id.nodeid, votequorum_ring_id.seq);
+
+	qdevice_net_log(LOG_DEBUG, "  Node list (size = %"PRIu32"):", node_list_entries);
+	for (u32 = 0; u32 < node_list_entries; u32++) {
+		qdevice_net_log(LOG_DEBUG, "    %"PRIu32" nodeid = %"PRIu32,
+		    u32, node_list[u32]);
+	}
+
 	qdevice_net_votequorum_ring_id_to_tlv(&tlv_rid, &votequorum_ring_id);
 
 	if (qdevice_net_send_membership_node_list(instance,
@@ -128,67 +138,15 @@ qdevice_net_votequorum_node_list_notify_callback(votequorum_handle_t votequorum_
 		instance->schedule_disconnect = 1;
 	}
 
-	memcpy(&instance->last_received_votequorum_ring_id, &votequorum_ring_id, sizeof(votequorum_ring_id));
+	memcpy(&instance->last_received_votequorum_ring_id, &votequorum_ring_id,
+	    sizeof(votequorum_ring_id));
 
 	if (qdevice_net_cast_vote_timer_update(instance, TLV_VOTE_WAIT_FOR_REPLY) != 0) {
 		errx(1, "qdevice_net_votequorum_notify_callback fatal error. "
 		    "Can't update cast vote timer vote");
 	}
-
-	qdevice_net_log(LOG_DEBUG, "Votequorum nodelist notify callback:");
-	qdevice_net_log(LOG_DEBUG, "  Ring_id = (%"PRIx32".%"PRIx64")",
-	    votequorum_ring_id.nodeid, votequorum_ring_id.seq);
-
-	qdevice_net_log(LOG_DEBUG, "  Node list (size = %"PRIu32"):", node_list_entries);
-	for (u32 = 0; u32 < node_list_entries; u32++) {
-		qdevice_net_log(LOG_DEBUG, "    %"PRIu32" nodeid = %"PRIu32,
-		    u32, node_list[u32]);
-	}
 }
 
-//static void
-//qdevice_net_votequorum_notify_callback(votequorum_handle_t votequorum_handle,
-//    uint64_t context, uint32_t quorate,
-//    votequorum_ring_id_t votequorum_ring_id,
-//    uint32_t node_list_entries, votequorum_node_t node_list[])
-//{
-//	struct qdevice_net_instance *instance;
-//	struct tlv_ring_id tlv_rid;
-//	uint32_t u32;
-//
-//	if (votequorum_context_get(votequorum_handle, (void **)&instance) != CS_OK) {
-//		errx(1, "Fatal error. Can't get votequorum context");
-//	}
-//
-//	qdevice_net_votequorum_ring_id_to_tlv(&tlv_rid, &votequorum_ring_id);
-//
-//	if (qdevice_net_send_membership_node_list(instance,
-//	    (quorate ? TLV_QUORATE_QUORATE : TLV_QUORATE_INQUORATE),
-//	    &tlv_rid, node_list_entries, node_list) != 0) {
-//		/*
-//		 * Fatal error -> schedule disconnect
-//		 */
-//		instance->schedule_disconnect = 1;
-//	}
-//
-//	memcpy(&instance->last_received_votequorum_ring_id, &votequorum_ring_id, sizeof(votequorum_ring_id));
-//
-//	if (qdevice_net_cast_vote_timer_update(instance, TLV_VOTE_WAIT_FOR_REPLY) != 0) {
-//		errx(1, "qdevice_net_votequorum_notify_callback fatal error. "
-//		    "Can't update cast vote timer vote");
-//	}
-//
-//	qdevice_net_log(LOG_DEBUG, "Votequorum notify callback:");
-//	qdevice_net_log(LOG_DEBUG, "  Quorate = %u, ring_id = (%"PRIx32".%"PRIx64")",
-//	    quorate, votequorum_ring_id.nodeid, votequorum_ring_id.seq);
-//
-//	qdevice_net_log(LOG_DEBUG, "  Node list (size = %"PRIu32"):", node_list_entries);
-//	for (u32 = 0; u32 < node_list_entries; u32++) {
-//		qdevice_net_log(LOG_DEBUG, "    %"PRIu32" nodeid = %"PRIu32", state = %"PRIu32,
-//		    u32, node_list[u32].nodeid, node_list[u32].state);
-//	}
-//}
-
 void
 qdevice_net_votequorum_init(struct qdevice_net_instance *instance)
 {
@@ -209,7 +167,8 @@ qdevice_net_votequorum_init(struct qdevice_net_instance *instance)
 	no_retries = 0;
 
 	while ((res = votequorum_initialize(&votequorum_handle,
-	    &votequorum_callbacks)) == CS_ERR_TRY_AGAIN && no_retries++ < QDEVICE_NET_MAX_CS_TRY_AGAIN) {
+	    &votequorum_callbacks)) == CS_ERR_TRY_AGAIN &&
+	    no_retries++ < QDEVICE_NET_MAX_CS_TRY_AGAIN) {
 		poll(NULL, 0, 1000);
 	}
 

+ 6 - 2
qdevices/qnetd-algo-2nodelms.c

@@ -122,7 +122,8 @@ qnetd_algo_2nodelms_config_node_list_received(struct qnetd_client *client,
 		return (TLV_REPLY_ERROR_CODE_UNSUPPORTED_DECISION_ALGORITHM);
 	}
 
-	*result_vote = TLV_VOTE_ASK_LATER;
+	*result_vote = TLV_VOTE_NO_CHANGE;
+
 	return (TLV_REPLY_ERROR_CODE_NO_ERROR);
 }
 
@@ -226,9 +227,12 @@ qnetd_algo_2nodelms_membership_node_list_received(struct qnetd_client *client,
 
 enum tlv_reply_error_code
 qnetd_algo_2nodelms_quorum_node_list_received(struct qnetd_client *client,
-    uint32_t msg_seq_num, enum tlv_quorate quorate, const struct node_list *nodes)
+    uint32_t msg_seq_num, enum tlv_quorate quorate, const struct node_list *nodes,
+    enum tlv_vote *result_vote)
 {
 
+	*result_vote = TLV_VOTE_NO_CHANGE;
+
 	return (TLV_REPLY_ERROR_CODE_NO_ERROR);
 }
 

+ 1 - 1
qdevices/qnetd-algo-2nodelms.h

@@ -55,7 +55,7 @@ extern enum tlv_reply_error_code	qnetd_algo_2nodelms_membership_node_list_receiv
 
 extern enum tlv_reply_error_code	qnetd_algo_2nodelms_quorum_node_list_received(
     struct qnetd_client *client, uint32_t msg_seq_num,
-    enum tlv_quorate quorate, const struct node_list *nodes);
+    enum tlv_quorate quorate, const struct node_list *nodes, enum tlv_vote *result_vote);
 
 extern void				qnetd_algo_2nodelms_client_disconnect(
     struct qnetd_client *client, int server_going_down);

+ 7 - 3
qdevices/qnetd-algo-ffsplit.c

@@ -52,7 +52,7 @@ qnetd_algo_ffsplit_config_node_list_received(struct qnetd_client *client,
     const struct node_list *nodes, int initial, enum tlv_vote *result_vote)
 {
 
-	*result_vote = TLV_VOTE_ASK_LATER;
+	*result_vote = TLV_VOTE_NO_CHANGE;
 
 	return (TLV_REPLY_ERROR_CODE_NO_ERROR);
 }
@@ -84,9 +84,12 @@ qnetd_algo_ffsplit_membership_node_list_received(struct qnetd_client *client,
 
 enum tlv_reply_error_code
 qnetd_algo_ffsplit_quorum_node_list_received(struct qnetd_client *client,
-    uint32_t msg_seq_num, enum tlv_quorate quorate, const struct node_list *nodes)
+    uint32_t msg_seq_num, enum tlv_quorate quorate, const struct node_list *nodes,
+    enum tlv_vote *result_vote)
 {
 
+	*result_vote = TLV_VOTE_NO_CHANGE;
+
 	return (TLV_REPLY_ERROR_CODE_NO_ERROR);
 }
 
@@ -125,5 +128,6 @@ static struct qnetd_algorithm qnetd_algo_ffsplit = {
 
 enum tlv_reply_error_code qnetd_algo_ffsplit_register()
 {
-	return qnetd_algorithm_register(TLV_DECISION_ALGORITHM_TYPE_FFSPLIT, &qnetd_algo_ffsplit);
+
+	return (qnetd_algorithm_register(TLV_DECISION_ALGORITHM_TYPE_FFSPLIT, &qnetd_algo_ffsplit));
 }

+ 1 - 1
qdevices/qnetd-algo-ffsplit.h

@@ -55,7 +55,7 @@ extern enum tlv_reply_error_code	qnetd_algo_ffsplit_membership_node_list_receive
 
 extern enum tlv_reply_error_code	qnetd_algo_ffsplit_quorum_node_list_received(
     struct qnetd_client *client, uint32_t msg_seq_num,
-    enum tlv_quorate quorate, const struct node_list *nodes);
+    enum tlv_quorate quorate, const struct node_list *nodes, enum tlv_vote *result_vote);
 
 extern void				qnetd_algo_ffsplit_client_disconnect(
     struct qnetd_client *client, int server_going_down);

+ 5 - 2
qdevices/qnetd-algo-lms.c

@@ -337,7 +337,8 @@ qnetd_algo_lms_config_node_list_received(struct qnetd_client *client,
 	info->num_config_nodes = node_count;
 	qnetd_log(LOG_DEBUG, "algo-lms: cluster %s config_list has %d nodes", client->cluster_name, node_count);
 
-	*result_vote = TLV_VOTE_ASK_LATER;
+	*result_vote = TLV_VOTE_NO_CHANGE;
+
 	return (TLV_REPLY_ERROR_CODE_NO_ERROR);
 }
 
@@ -371,9 +372,11 @@ qnetd_algo_lms_membership_node_list_received(struct qnetd_client *client,
 
 enum tlv_reply_error_code
 qnetd_algo_lms_quorum_node_list_received(struct qnetd_client *client,
-    uint32_t msg_seq_num, enum tlv_quorate quorate, const struct node_list *nodes)
+    uint32_t msg_seq_num, enum tlv_quorate quorate, const struct node_list *nodes, enum tlv_vote *result_vote)
 {
 
+	*result_vote = TLV_VOTE_NO_CHANGE;
+
 	return (TLV_REPLY_ERROR_CODE_NO_ERROR);
 }
 

+ 1 - 1
qdevices/qnetd-algo-lms.h

@@ -55,7 +55,7 @@ extern enum tlv_reply_error_code	qnetd_algo_lms_membership_node_list_received(
 
 extern enum tlv_reply_error_code	qnetd_algo_lms_quorum_node_list_received(
     struct qnetd_client *client, uint32_t msg_seq_num,
-    enum tlv_quorate quorate, const struct node_list *nodes);
+    enum tlv_quorate quorate, const struct node_list *nodes, enum tlv_vote *result_vote);
 
 extern void				qnetd_algo_lms_client_disconnect(
     struct qnetd_client *client, int server_going_down);

+ 7 - 3
qdevices/qnetd-algo-test.c

@@ -159,7 +159,7 @@ qnetd_algo_test_config_node_list_received(struct qnetd_client *client,
 
 	qnetd_algo_dump_node_list(client, nodes);
 
-	*result_vote = TLV_VOTE_ACK;
+	*result_vote = TLV_VOTE_NO_CHANGE;
 
 	return (TLV_REPLY_ERROR_CODE_NO_ERROR);
 }
@@ -211,7 +211,8 @@ qnetd_algo_test_membership_node_list_received(struct qnetd_client *client,
  */
 enum tlv_reply_error_code
 qnetd_algo_test_quorum_node_list_received(struct qnetd_client *client,
-    uint32_t msg_seq_num, enum tlv_quorate quorate, const struct node_list *nodes)
+    uint32_t msg_seq_num, enum tlv_quorate quorate, const struct node_list *nodes,
+    enum tlv_vote *result_vote)
 {
 	qnetd_log(LOG_INFO, "algo-test: Client %p (cluster %s, node_id %"PRIx32") "
 	    "sent quorum node list.", client, client->cluster_name, client->node_id);
@@ -221,6 +222,8 @@ qnetd_algo_test_quorum_node_list_received(struct qnetd_client *client,
 
 	qnetd_algo_dump_node_list(client, nodes);
 
+	*result_vote = TLV_VOTE_NO_CHANGE;
+
 	return (TLV_REPLY_ERROR_CODE_NO_ERROR);
 }
 
@@ -281,5 +284,6 @@ static struct qnetd_algorithm qnetd_algo_test = {
 
 enum tlv_reply_error_code qnetd_algo_test_register()
 {
-	return qnetd_algorithm_register(TLV_DECISION_ALGORITHM_TYPE_TEST, &qnetd_algo_test);
+
+	return (qnetd_algorithm_register(TLV_DECISION_ALGORITHM_TYPE_TEST, &qnetd_algo_test));
 }

+ 1 - 1
qdevices/qnetd-algo-test.h

@@ -55,7 +55,7 @@ extern enum tlv_reply_error_code	qnetd_algo_test_membership_node_list_received(
 
 extern enum tlv_reply_error_code	qnetd_algo_test_quorum_node_list_received(
     struct qnetd_client *client, uint32_t msg_seq_num,
-    enum tlv_quorate quorate, const struct node_list *nodes);
+    enum tlv_quorate quorate, const struct node_list *nodes, enum tlv_vote *result_vote);
 
 extern void				qnetd_algo_test_client_disconnect(
     struct qnetd_client *client, int server_going_down);

+ 17 - 16
qdevices/qnetd-algorithm.c

@@ -54,7 +54,7 @@ qnetd_algorithm_client_init(struct qnetd_client *client)
 		return (TLV_REPLY_ERROR_CODE_INTERNAL_ERROR);
 	}
 
-	return qnetd_algorithm[client->decision_algorithm]->init(client);
+	return (qnetd_algorithm[client->decision_algorithm]->init(client));
 }
 
 enum tlv_reply_error_code
@@ -70,9 +70,9 @@ qnetd_algorithm_config_node_list_received(struct qnetd_client *client,
 		return (TLV_REPLY_ERROR_CODE_INTERNAL_ERROR);
 	}
 
-	return qnetd_algorithm[client->decision_algorithm]->config_node_list_received(
+	return (qnetd_algorithm[client->decision_algorithm]->config_node_list_received(
 		client, msg_seq_num,
-		config_version_set, config_version, nodes, initial, result_vote);
+		config_version_set, config_version, nodes, initial, result_vote));
 }
 
 enum tlv_reply_error_code
@@ -89,15 +89,15 @@ qnetd_algorithm_membership_node_list_received(struct qnetd_client *client,
 		return (TLV_REPLY_ERROR_CODE_INTERNAL_ERROR);
 	}
 
-	return qnetd_algorithm[client->decision_algorithm]->membership_node_list_received(
+	return (qnetd_algorithm[client->decision_algorithm]->membership_node_list_received(
 		client, msg_seq_num,
-		ring_id, nodes, result_vote);
+		ring_id, nodes, result_vote));
 }
 
 enum tlv_reply_error_code
 qnetd_algorithm_quorum_node_list_received(struct qnetd_client *client,
     uint32_t msg_seq_num, enum tlv_quorate quorate,
-    const struct node_list *nodes)
+    const struct node_list *nodes, enum tlv_vote *result_vote)
 {
 
 	if (client->decision_algorithm >= MAX_QNETD_ALGORITHMS ||
@@ -108,8 +108,8 @@ qnetd_algorithm_quorum_node_list_received(struct qnetd_client *client,
 		return (TLV_REPLY_ERROR_CODE_INTERNAL_ERROR);
 	}
 
-	return qnetd_algorithm[client->decision_algorithm]->quorum_node_list_received(
-		client, msg_seq_num, quorate, nodes);
+	return (qnetd_algorithm[client->decision_algorithm]->quorum_node_list_received(
+		client, msg_seq_num, quorate, nodes, result_vote));
 }
 
 void
@@ -136,8 +136,8 @@ qnetd_algorithm_ask_for_vote_received(struct qnetd_client *client, uint32_t msg_
 		return (TLV_REPLY_ERROR_CODE_INTERNAL_ERROR);
 	}
 
-	return qnetd_algorithm[client->decision_algorithm]->ask_for_vote_received(
-		client, msg_seq_num, result_vote);
+	return (qnetd_algorithm[client->decision_algorithm]->ask_for_vote_received(
+		client, msg_seq_num, result_vote));
 }
 
 enum tlv_reply_error_code
@@ -149,24 +149,25 @@ qnetd_algorithm_vote_info_reply_received(struct qnetd_client *client, uint32_t m
 		return (TLV_REPLY_ERROR_CODE_INTERNAL_ERROR);
 	}
 
-	return qnetd_algorithm[client->decision_algorithm]->vote_info_reply_received(
-		client, msg_seq_num);
+	return (qnetd_algorithm[client->decision_algorithm]->vote_info_reply_received(
+		client, msg_seq_num));
 
 }
 
 
 enum tlv_reply_error_code
-qnetd_algorithm_register(enum tlv_decision_algorithm_type algorithm_number, struct qnetd_algorithm *algorithm)
+qnetd_algorithm_register(enum tlv_decision_algorithm_type algorithm_number,
+    struct qnetd_algorithm *algorithm)
 {
 	if (algorithm_number >= MAX_QNETD_ALGORITHMS) {
-		return TLV_REPLY_ERROR_CODE_UNSUPPORTED_DECISION_ALGORITHM;
+		return (TLV_REPLY_ERROR_CODE_UNSUPPORTED_DECISION_ALGORITHM);
 	}
 
 	if (qnetd_algorithm[algorithm_number] != NULL) {
-		return TLV_REPLY_ERROR_CODE_DECISION_ALGORITHM_ALREADY_REGISTERED;
+		return (TLV_REPLY_ERROR_CODE_DECISION_ALGORITHM_ALREADY_REGISTERED);
 	}
 	qnetd_algorithm[algorithm_number] = algorithm;
-	return TLV_REPLY_ERROR_CODE_NO_ERROR;
+	return (TLV_REPLY_ERROR_CODE_NO_ERROR);
 }
 
 void algorithms_register(void)

+ 12 - 11
qdevices/qnetd-algorithm.h

@@ -58,7 +58,7 @@ extern enum tlv_reply_error_code	qnetd_algorithm_membership_node_list_received(
 
 extern enum tlv_reply_error_code	qnetd_algorithm_quorum_node_list_received(
     struct qnetd_client *client, uint32_t msg_seq_num, enum tlv_quorate quorate,
-    const struct node_list *nodes);
+    const struct node_list *nodes, enum tlv_vote *result_vote);
 
 extern void				qnetd_algorithm_client_disconnect(
     struct qnetd_client *client, int server_going_down);
@@ -75,23 +75,24 @@ struct qnetd_algorithm {
 	void (*client_disconnect)(struct qnetd_client *client, int server_going_down);
 
 	enum tlv_reply_error_code (*membership_node_list_received)(
-		struct qnetd_client *client, uint32_t msg_seq_num,
-		const struct tlv_ring_id *ring_id,
-		const struct node_list *nodes, enum tlv_vote *result_vote);
+	    struct qnetd_client *client, uint32_t msg_seq_num,
+	    const struct tlv_ring_id *ring_id,
+	    const struct node_list *nodes, enum tlv_vote *result_vote);
 
 	enum tlv_reply_error_code (*quorum_node_list_received)(
-		struct qnetd_client *client, uint32_t msg_seq_num, enum tlv_quorate quorate,
-		const struct node_list *nodes);
+	    struct qnetd_client *client, uint32_t msg_seq_num, enum tlv_quorate quorate,
+	    const struct node_list *nodes, enum tlv_vote *result_vote);
 
 	enum tlv_reply_error_code (*config_node_list_received)(
-		struct qnetd_client *client,
-		uint32_t msg_seq_num, int config_version_set, uint64_t config_version,
-		const struct node_list *nodes, int initial, enum tlv_vote *result_vote);
+	    struct qnetd_client *client,
+	    uint32_t msg_seq_num, int config_version_set, uint64_t config_version,
+	    const struct node_list *nodes, int initial, enum tlv_vote *result_vote);
 
 	enum tlv_reply_error_code (*ask_for_vote_received)(
-		struct qnetd_client *client, uint32_t msg_seq_num, enum tlv_vote *result_vote);
+	    struct qnetd_client *client, uint32_t msg_seq_num, enum tlv_vote *result_vote);
 
-	enum tlv_reply_error_code (*vote_info_reply_received)(struct qnetd_client *client, uint32_t msg_seq_num);
+	enum tlv_reply_error_code (*vote_info_reply_received)(struct qnetd_client *client,
+	    uint32_t msg_seq_num);
 
 };
 

+ 2 - 1
qdevices/qnetd-client-list.h

@@ -57,7 +57,8 @@ extern void			 qnetd_client_list_free(struct qnetd_client_list *client_list);
 extern void			 qnetd_client_list_del(struct qnetd_client_list *client_list,
     struct qnetd_client *client);
 
-extern size_t			 qnetd_client_list_no_clients(struct qnetd_client_list *client_list);
+extern size_t			 qnetd_client_list_no_clients(
+    struct qnetd_client_list *client_list);
 
 #ifdef __cplusplus
 }

+ 2 - 1
qdevices/tlv.c

@@ -869,7 +869,8 @@ tlv_iter_decode_vote(struct tlv_iterator *tlv_iter, enum tlv_vote *vote)
 	if (tmp_vote != TLV_VOTE_ACK &&
 	    tmp_vote != TLV_VOTE_NACK &&
 	    tmp_vote != TLV_VOTE_ASK_LATER &&
-	    tmp_vote != TLV_VOTE_WAIT_FOR_REPLY) {
+	    tmp_vote != TLV_VOTE_WAIT_FOR_REPLY &&
+	    tmp_vote != TLV_VOTE_NO_CHANGE) {
 		return (-4);
 	}
 

+ 1 - 0
qdevices/tlv.h

@@ -124,6 +124,7 @@ enum tlv_vote {
 	TLV_VOTE_NACK = 2,
 	TLV_VOTE_ASK_LATER = 3,
 	TLV_VOTE_WAIT_FOR_REPLY = 4,
+	TLV_VOTE_NO_CHANGE = 5,
 };
 
 enum tlv_quorate {