|
@@ -159,6 +159,7 @@ static int votequorum_exec_send_reconfigure(uint8_t param, unsigned int nodeid,
|
|
|
#define NODE_FLAGS_FIRST 8
|
|
#define NODE_FLAGS_FIRST 8
|
|
|
#define NODE_FLAGS_QDEVICE_REGISTERED 16
|
|
#define NODE_FLAGS_QDEVICE_REGISTERED 16
|
|
|
#define NODE_FLAGS_QDEVICE_ALIVE 32
|
|
#define NODE_FLAGS_QDEVICE_ALIVE 32
|
|
|
|
|
+#define NODE_FLAGS_QDEVICE_CAST_VOTE 64
|
|
|
|
|
|
|
|
#define NODEID_QDEVICE 0
|
|
#define NODEID_QDEVICE 0
|
|
|
|
|
|
|
@@ -545,13 +546,14 @@ static int check_low_node_id_partition(void)
|
|
|
static void decode_flags(uint32_t flags)
|
|
static void decode_flags(uint32_t flags)
|
|
|
{
|
|
{
|
|
|
log_printf(LOGSYS_LEVEL_DEBUG,
|
|
log_printf(LOGSYS_LEVEL_DEBUG,
|
|
|
- "flags: quorate: %s Leaving: %s WFA Status: %s First: %s Qdevice: %s QdeviceState: %s",
|
|
|
|
|
|
|
+ "flags: quorate: %s Leaving: %s WFA Status: %s First: %s Qdevice: %s QdeviceAlive: %s QdeviceCastVote: %s",
|
|
|
(flags & NODE_FLAGS_QUORATE)?"Yes":"No",
|
|
(flags & NODE_FLAGS_QUORATE)?"Yes":"No",
|
|
|
(flags & NODE_FLAGS_LEAVING)?"Yes":"No",
|
|
(flags & NODE_FLAGS_LEAVING)?"Yes":"No",
|
|
|
(flags & NODE_FLAGS_WFASTATUS)?"Yes":"No",
|
|
(flags & NODE_FLAGS_WFASTATUS)?"Yes":"No",
|
|
|
(flags & NODE_FLAGS_FIRST)?"Yes":"No",
|
|
(flags & NODE_FLAGS_FIRST)?"Yes":"No",
|
|
|
(flags & NODE_FLAGS_QDEVICE_REGISTERED)?"Yes":"No",
|
|
(flags & NODE_FLAGS_QDEVICE_REGISTERED)?"Yes":"No",
|
|
|
- (flags & NODE_FLAGS_QDEVICE_ALIVE)?"Yes":"No");
|
|
|
|
|
|
|
+ (flags & NODE_FLAGS_QDEVICE_ALIVE)?"Yes":"No",
|
|
|
|
|
+ (flags & NODE_FLAGS_QDEVICE_CAST_VOTE)?"Yes":"No");
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
static void update_wait_for_all_status(uint8_t wfa_status)
|
|
static void update_wait_for_all_status(uint8_t wfa_status)
|
|
@@ -1924,6 +1926,7 @@ static void qdevice_timer_fn(void *arg)
|
|
|
|
|
|
|
|
qdevice->state = NODESTATE_DEAD;
|
|
qdevice->state = NODESTATE_DEAD;
|
|
|
us->flags &= ~NODE_FLAGS_QDEVICE_ALIVE;
|
|
us->flags &= ~NODE_FLAGS_QDEVICE_ALIVE;
|
|
|
|
|
+ us->flags &= ~NODE_FLAGS_QDEVICE_CAST_VOTE;
|
|
|
log_printf(LOGSYS_LEVEL_INFO, "lost contact with quorum device %s", qdevice_name);
|
|
log_printf(LOGSYS_LEVEL_INFO, "lost contact with quorum device %s", qdevice_name);
|
|
|
votequorum_exec_send_nodeinfo(us->node_id);
|
|
votequorum_exec_send_nodeinfo(us->node_id);
|
|
|
|
|
|
|
@@ -1965,7 +1968,9 @@ static void message_handler_req_lib_votequorum_getinfo (void *conn, const void *
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
if (((qdevice_is_registered) && (qdevice->state == NODESTATE_MEMBER)) ||
|
|
if (((qdevice_is_registered) && (qdevice->state == NODESTATE_MEMBER)) ||
|
|
|
- ((node->flags & NODE_FLAGS_QDEVICE_REGISTERED) && (node->flags & NODE_FLAGS_QDEVICE_ALIVE))) {
|
|
|
|
|
|
|
+ ((node->flags & NODE_FLAGS_QDEVICE_REGISTERED) &&
|
|
|
|
|
+ (node->flags & NODE_FLAGS_QDEVICE_ALIVE) &&
|
|
|
|
|
+ (node->flags & NODE_FLAGS_QDEVICE_CAST_VOTE))) {
|
|
|
total_votes += qdevice->votes;
|
|
total_votes += qdevice->votes;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -2003,6 +2008,9 @@ static void message_handler_req_lib_votequorum_getinfo (void *conn, const void *
|
|
|
if (node->flags & NODE_FLAGS_QDEVICE_ALIVE) {
|
|
if (node->flags & NODE_FLAGS_QDEVICE_ALIVE) {
|
|
|
res_lib_votequorum_getinfo.flags |= VOTEQUORUM_INFO_QDEVICE_ALIVE;
|
|
res_lib_votequorum_getinfo.flags |= VOTEQUORUM_INFO_QDEVICE_ALIVE;
|
|
|
}
|
|
}
|
|
|
|
|
+ if (node->flags & NODE_FLAGS_QDEVICE_CAST_VOTE) {
|
|
|
|
|
+ res_lib_votequorum_getinfo.flags |= VOTEQUORUM_INFO_QDEVICE_CAST_VOTE;
|
|
|
|
|
+ }
|
|
|
} else {
|
|
} else {
|
|
|
error = CS_ERR_NOT_EXIST;
|
|
error = CS_ERR_NOT_EXIST;
|
|
|
}
|
|
}
|
|
@@ -2242,6 +2250,7 @@ static void message_handler_req_lib_votequorum_qdevice_unregister (void *conn,
|
|
|
qdevice_is_registered = 0;
|
|
qdevice_is_registered = 0;
|
|
|
us->flags &= ~NODE_FLAGS_QDEVICE_REGISTERED;
|
|
us->flags &= ~NODE_FLAGS_QDEVICE_REGISTERED;
|
|
|
us->flags &= ~NODE_FLAGS_QDEVICE_ALIVE;
|
|
us->flags &= ~NODE_FLAGS_QDEVICE_ALIVE;
|
|
|
|
|
+ us->flags &= ~NODE_FLAGS_QDEVICE_CAST_VOTE;
|
|
|
qdevice->state = NODESTATE_DEAD;
|
|
qdevice->state = NODESTATE_DEAD;
|
|
|
votequorum_exec_send_nodeinfo(us->node_id);
|
|
votequorum_exec_send_nodeinfo(us->node_id);
|
|
|
votequorum_exec_send_qdevice_reg(VOTEQUORUM_QDEVICE_OPERATION_UNREGISTER,
|
|
votequorum_exec_send_qdevice_reg(VOTEQUORUM_QDEVICE_OPERATION_UNREGISTER,
|
|
@@ -2316,12 +2325,14 @@ static void message_handler_req_lib_votequorum_qdevice_poll (void *conn,
|
|
|
if (qdevice->state == NODESTATE_DEAD) {
|
|
if (qdevice->state == NODESTATE_DEAD) {
|
|
|
qdevice->state = NODESTATE_MEMBER;
|
|
qdevice->state = NODESTATE_MEMBER;
|
|
|
us->flags |= NODE_FLAGS_QDEVICE_ALIVE;
|
|
us->flags |= NODE_FLAGS_QDEVICE_ALIVE;
|
|
|
|
|
+ us->flags |= NODE_FLAGS_QDEVICE_CAST_VOTE;
|
|
|
votequorum_exec_send_nodeinfo(us->node_id);
|
|
votequorum_exec_send_nodeinfo(us->node_id);
|
|
|
}
|
|
}
|
|
|
} else {
|
|
} else {
|
|
|
if (qdevice->state == NODESTATE_MEMBER) {
|
|
if (qdevice->state == NODESTATE_MEMBER) {
|
|
|
qdevice->state = NODESTATE_DEAD;
|
|
qdevice->state = NODESTATE_DEAD;
|
|
|
us->flags &= ~NODE_FLAGS_QDEVICE_ALIVE;
|
|
us->flags &= ~NODE_FLAGS_QDEVICE_ALIVE;
|
|
|
|
|
+ us->flags &= ~NODE_FLAGS_QDEVICE_CAST_VOTE;
|
|
|
votequorum_exec_send_nodeinfo(us->node_id);
|
|
votequorum_exec_send_nodeinfo(us->node_id);
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
@@ -2358,14 +2369,18 @@ static void message_handler_req_lib_votequorum_qdevice_getinfo (void *conn,
|
|
|
node = find_node_by_nodeid(req_lib_votequorum_qdevice_getinfo->nodeid);
|
|
node = find_node_by_nodeid(req_lib_votequorum_qdevice_getinfo->nodeid);
|
|
|
if ((node) &&
|
|
if ((node) &&
|
|
|
(node->flags & NODE_FLAGS_QDEVICE_REGISTERED)) {
|
|
(node->flags & NODE_FLAGS_QDEVICE_REGISTERED)) {
|
|
|
- int alive_status = 0;
|
|
|
|
|
|
|
+ int alive_status = 0, vote_status = 0;
|
|
|
|
|
|
|
|
if (node->flags & NODE_FLAGS_QDEVICE_ALIVE) {
|
|
if (node->flags & NODE_FLAGS_QDEVICE_ALIVE) {
|
|
|
alive_status = 1;
|
|
alive_status = 1;
|
|
|
}
|
|
}
|
|
|
|
|
+ if (node->flags & NODE_FLAGS_QDEVICE_CAST_VOTE) {
|
|
|
|
|
+ vote_status = 1;
|
|
|
|
|
+ }
|
|
|
log_printf(LOGSYS_LEVEL_DEBUG, "got qdevice_getinfo node %u alive_status %d", nodeid, alive_status);
|
|
log_printf(LOGSYS_LEVEL_DEBUG, "got qdevice_getinfo node %u alive_status %d", nodeid, alive_status);
|
|
|
res_lib_votequorum_qdevice_getinfo.votes = qdevice->votes;
|
|
res_lib_votequorum_qdevice_getinfo.votes = qdevice->votes;
|
|
|
res_lib_votequorum_qdevice_getinfo.alive = alive_status;
|
|
res_lib_votequorum_qdevice_getinfo.alive = alive_status;
|
|
|
|
|
+ res_lib_votequorum_qdevice_getinfo.vote = vote_status;
|
|
|
strcpy(res_lib_votequorum_qdevice_getinfo.name, qdevice_name);
|
|
strcpy(res_lib_votequorum_qdevice_getinfo.name, qdevice_name);
|
|
|
} else {
|
|
} else {
|
|
|
error = CS_ERR_NOT_EXIST;
|
|
error = CS_ERR_NOT_EXIST;
|
|
@@ -2376,8 +2391,10 @@ static void message_handler_req_lib_votequorum_qdevice_getinfo (void *conn,
|
|
|
res_lib_votequorum_qdevice_getinfo.votes = qdevice->votes;
|
|
res_lib_votequorum_qdevice_getinfo.votes = qdevice->votes;
|
|
|
if (qdevice->state == NODESTATE_MEMBER) {
|
|
if (qdevice->state == NODESTATE_MEMBER) {
|
|
|
res_lib_votequorum_qdevice_getinfo.alive = 1;
|
|
res_lib_votequorum_qdevice_getinfo.alive = 1;
|
|
|
|
|
+ res_lib_votequorum_qdevice_getinfo.vote = 1;
|
|
|
} else {
|
|
} else {
|
|
|
res_lib_votequorum_qdevice_getinfo.alive = 0;
|
|
res_lib_votequorum_qdevice_getinfo.alive = 0;
|
|
|
|
|
+ res_lib_votequorum_qdevice_getinfo.vote = 0;
|
|
|
}
|
|
}
|
|
|
strcpy(res_lib_votequorum_qdevice_getinfo.name, qdevice_name);
|
|
strcpy(res_lib_votequorum_qdevice_getinfo.name, qdevice_name);
|
|
|
} else {
|
|
} else {
|