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));
}
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));
" 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) {
config_version, 0) != 0) {
net_instance->schedule_disconnect = 1;
net_instance->disconnect_reason = QDEVICE_NET_DISCONNECT_REASON_CANT_ALLOCATE_MSG_BUFFER;
+
+ return (0);
}
}
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));
" 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) {
*/
net_instance->disconnect_reason = QDEVICE_NET_DISCONNECT_REASON_CANT_ALLOCATE_MSG_BUFFER;
net_instance->schedule_disconnect = 1;
+
+ return (0);
}
}
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));
*/
net_instance->disconnect_reason = QDEVICE_NET_DISCONNECT_REASON_CANT_ALLOCATE_MSG_BUFFER;
net_instance->schedule_disconnect = 1;
+
+ return (0);
}
}
"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);
uint32_t expected_votes)
{
struct qdevice_net_instance *net_instance;
+ enum tlv_vote vote;
net_instance = instance->model_data;
" (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);
}
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)
.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,
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);
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)
.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,
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);
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)
.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,
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);
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
.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,
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);
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)
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);
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,
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,