16 #include <galerautils.h>
19 #include "gcs_recv_msg.h"
20 #include "gcs_seqno.h"
21 #include "gcs_state_msg.h"
25 typedef enum gcs_group_state
27 GCS_GROUP_NON_PRIMARY,
28 GCS_GROUP_WAIT_STATE_UUID,
29 GCS_GROUP_WAIT_STATE_MSG,
35 extern const char* gcs_group_state_str[];
47 const char* my_address;
48 gcs_group_state_t state;
49 gcs_seqno_t last_applied;
56 gu_seqno_t prim_seqno;
58 gcs_node_state_t prim_state;
61 gcs_proto_t
const gcs_proto_ver;
62 int const repl_proto_ver;
63 int const appl_proto_ver;
66 int last_applied_proto_ver;
76 const char* node_name,
78 gcs_proto_t gcs_proto_ver,
88 const gu_uuid_t* uuid);
108 extern gcs_group_state_t
109 gcs_group_handle_comp_msg (
gcs_group_t* group,
const gcs_comp_msg_t* msg);
111 extern gcs_group_state_t
114 extern gcs_group_state_t
132 gcs_group_handle_state_request (
gcs_group_t* group,
139 static inline ssize_t
140 gcs_group_handle_act_msg (
gcs_group_t*
const group,
145 long const sender_idx = msg->sender_idx;
146 bool const local = (sender_idx == group->my_idx);
149 assert (GCS_MSG_ACTION == msg->type);
150 assert (sender_idx < group->num);
151 assert (frg->act_id > 0);
152 assert (frg->act_size > 0);
155 group->frag_reset = (group->frag_reset && (!local || (0 != frg->frag_no)));
157 ret = gcs_node_handle_act_frag (&group->nodes[sender_idx], frg, &rcvd->act,
162 assert (ret == rcvd->act.buf_len);
164 rcvd->act.type = frg->act_type;
166 if (gu_likely(GCS_ACT_TORDERED == rcvd->act.type &&
167 GCS_GROUP_PRIMARY == group->state &&
168 group->nodes[sender_idx].status >= GCS_NODE_STATE_DONOR &&
169 !(group->frag_reset && local))) {
173 rcvd->id = ++group->act_id;
175 else if (GCS_ACT_TORDERED == rcvd->act.type) {
179 rcvd->id = -ERESTART;
180 gu_debug(
"Returning -ERESTART for TORDERED action: group->state"
181 " = %s, sender->status = %s, frag_reset = %s, "
183 gcs_group_state_str[group->state],
185 group->frag_reset ?
"true" :
"false", rcvd->act.buf);
190 gcs_group_ignore_action (group, rcvd);
198 static inline gcs_group_state_t
207 return (GCS_GROUP_PRIMARY == group->state);
213 return group->my_idx;
226 extern gcs_state_msg_t*
Definition: gcs_group.h:37
Definition: gcs_node.h:27
const char * gcs_node_state_to_str(gcs_node_state_t state)
Definition: gcs.c:29
Definition: gcs_act_proto.h:24
Definition: gcs_recv_msg.h:16
Definition: gcs_state_msg.h:53