45#include <sys/socket.h>
48#include <sys/resource.h>
49#include <netinet/in.h>
62#include <qb/qbipc_common.h>
71#define YKD_PROCESSOR_COUNT_MAX 32
115static void *ykd_group_handle;
119static int state_received_confchg_entries;
123static int state_received_process_entries;
129static int ykd_view_list_entries;
131static int session_id_max;
137static int ambiguous_sessions_max_entries;
139static int ykd_primary_designated = 0;
149static void (*ykd_primary_callback_fn) (
150 const unsigned int *view_list,
152 int primary_designated,
155static void ykd_state_init (
void)
164static int ykd_state_send_msg (
const void *context)
183static void ykd_state_send (
void)
191static int ykd_attempt_send_msg (
const void *context)
208static void ykd_attempt_send (
void)
212 ykd_attempt_send_msg,
216static void compute (
void)
223 ambiguous_sessions_max_entries = 0;
225 for (
i = 0;
i < state_received_process_entries;
i++) {
245 memcpy (&ambiguous_sessions_max[ambiguous_sessions_max_entries],
248 ambiguous_sessions_max_entries += 1;
254static int subquorum (
255 unsigned int *member_list,
256 int member_list_entries,
263 for (
i = 0;
i < member_list_entries;
i++) {
264 for (
j = 0;
j <
session->member_list_entries;
j++) {
265 if (member_list[
i] ==
session->member_list[
j]) {
287static int decide (
void)
294 if (subquorum (ykd_view_list, ykd_view_list_entries, last_primary_max) == 0) {
298 for (
i = 0;
i < ambiguous_sessions_max_entries;
i++) {
299 if (subquorum (ykd_view_list, ykd_view_list_entries, &ambiguous_sessions_max[
i]) == 0) {
320static void ykd_state_endian_convert (
struct ykd_state *state)
338static void ykd_deliver_fn (
341 unsigned int msg_len,
356 "This processor is within the primary component.");
357 primary_designated = 1;
359 ykd_primary_callback_fn (
361 ykd_view_list_entries,
389 for (
i = 0;
i < state_received_confchg_entries;
i++) {
390 if (state_received_process[
i].received == 0) {
415 for (
i = 0;
i < state_received_confchg_entries;
i++) {
427 ykd_view_list,
sizeof (
unsigned int) * ykd_view_list_entries);
438 "This processor is within the primary component.");
439 ykd_primary_designated = 1;
441 ykd_primary_callback_fn (
443 ykd_view_list_entries,
444 ykd_primary_designated,
457static void ykd_confchg_fn (
459 const unsigned int *member_list,
size_t member_list_entries,
478 memcpy (ykd_view_list, member_list,
479 member_list_entries *
sizeof (
unsigned int));
480 ykd_view_list_entries = member_list_entries;
484 ykd_primary_designated = 0;
486 ykd_primary_callback_fn (
488 ykd_view_list_entries,
489 ykd_primary_designated,
492 memset (&state_received_confchg, 0,
sizeof (state_received_confchg));
493 for (
i = 0;
i < member_list_entries;
i++) {
494 state_received_confchg[
i].
nodeid = member_list[
i];
497 memcpy (state_received_process, state_received_confchg,
498 sizeof (state_received_confchg));
500 state_received_confchg_entries = member_list_entries;
501 state_received_process_entries = member_list_entries;
521 error = (
char *)
"set primary not set";
536 return ((
char *)
error);
totem_configuration_type
The totem_configuration_type enum.
@ TOTEM_CONFIGURATION_REGULAR
void(* quorum_set_quorate_fn_t)(const unsigned int *view_list, size_t view_list_entries, int quorate, struct memb_ring_id *)
#define log_printf(level, format, args...)
#define LOGSYS_LEVEL_NOTICE
#define LOGSYS_DECLARE_SUBSYS(subsys)
The LOGSYS_DECLARE_SUBSYS macro.
The corosync_api_v1 struct.
int(* tpg_join)(void *instance, const struct corosync_tpg_group *groups, size_t group_cnt)
unsigned int(* totem_nodeid_get)(void)
int(* tpg_init)(void **instance, void(*deliver_fn)(unsigned int nodeid, const void *msg, unsigned int msg_len, int endian_conversion_required), void(*confchg_fn)(enum totem_configuration_type configuration_type, const unsigned int *member_list, size_t member_list_entries, const unsigned int *left_list, size_t left_list_entries, const unsigned int *joined_list, size_t joined_list_entries, const struct memb_ring_id *ring_id))
int(* schedwrk_create)(hdb_handle_t *handle, int(schedwrk_fn)(const void *), const void *context)
int(* tpg_joined_mcast)(void *totempg_groups_instance, const struct iovec *iovec, unsigned int iov_len, int guarantee)
The corosync_tpg_group struct.
struct ykd_state ykd_state
unsigned int member_list[YKD_PROCESSOR_COUNT_MAX]
struct ykd_session last_formed[YKD_PROCESSOR_COUNT_MAX]
struct ykd_session ambiguous_sessions[YKD_PROCESSOR_COUNT_MAX]
struct ykd_session last_primary
int ambiguous_sessions_entries
#define swab32(x)
The swab32 macro.
int totemip_localhost_check(const struct totem_ip_address *addr)
struct memb_ring_id ring_id
struct totem_message_header header
#define YKD_PROCESSOR_COUNT_MAX
hdb_handle_t schedwrk_attempt_send_callback_handle
struct corosync_tpg_group ykd_group
hdb_handle_t schedwrk_state_send_callback_handle
char * ykd_init(struct corosync_api_v1 *corosync_api, quorum_set_quorate_fn_t set_primary)