/** * Set the current state. * * \param[in] new_state Supervisor's new state */ static inline void set_state(sup_state_t new_state) { #ifdef USE_YAOURT yaourt_event_wait(EXAMSG_CSUPD_ID, "sup_set_state %s", sup_state_name(new_state)); #endif self->view.state = new_state; __trace("state is now %s", sup_state_name(new_state)); }
/** * Print info about a node. * * \param[in] node Node to print info about */ static void dump_node(const sup_node_t *node) { char seen_str[EXA_MAX_NODES_NUMBER + 1]; char clique_str[EXA_MAX_NODES_NUMBER + 1]; if (node == NULL) return; exa_nodeset_to_bin(&node->view.nodes_seen, seen_str); exa_nodeset_to_bin(&node->view.clique, clique_str); __debug("%c%c%u: (state=%s seen=%s clique=%s coord=%u accepted=%u committed=%u)", self_sees(node) ? ' ' : '-', node->id == self->id ? '*' : ' ', node->id, sup_state_name(node->view.state), seen_str, clique_str, node->view.coord, node->view.accepted, node->view.committed); }
/** * Print a view in a file. * * \param[in] view View to print * \param file File to print to */ void sup_view_debug(const sup_view_t *view) { char seen_str[EXA_MAX_NODES_NUMBER + 1]; char clique_str[EXA_MAX_NODES_NUMBER + 1]; if (view == NULL) { __debug("(null view)"); return; } exa_nodeset_to_bin(&view->nodes_seen, seen_str); exa_nodeset_to_bin(&view->clique, clique_str); __debug("state=%s seen=%s num_seen=%u clique=%s coord=%u" " accepted=%u committed=%u", sup_state_name(view->state), seen_str, view->num_seen, clique_str, view->coord, view->accepted, view->committed); }
/** * Called in state CHANGE to process a ping. * * \param[in] ping Ping to process */ static void state_change_process_ping(const sup_ping_t *ping) { switch (ping->view.state) { case SUP_STATE_UNKNOWN: /* Not possible */ break; case SUP_STATE_CHANGE: if (self_is_coord()) { __trace("i'm coord"); /* Go to state ACCEPT if all the nodes in our clique see us as * their coordinator. This will initiate the agreement phase. */ if (clique_sees_self_as_coord()) { __trace("+++ EVERYONE IN MY CLIQUE SEES ME AS COORD"); accept_clique(next_gen()); __trace("\t=> new state=%s, accepted=%u", sup_state_name(self->view.state), self->view.accepted); } } break; case SUP_STATE_ACCEPT: if (!self_is_coord()) { /* Go to state ACCEPT if the sender is our coordinator, views the * same clique as us and its accepted clique generation is higher * than ours. */ if (ping->sender == self->view.coord && exa_nodeset_equals(&ping->view.clique, &self->view.clique) && ping->view.accepted > self_highest_gen()) { __trace("coord ok, view ok, accepted ok => i accept"); accept_clique(ping->view.accepted); } } break; case SUP_STATE_COMMIT: if (!self_is_coord()) { /* Commit the membership if we accepted it */ if (exa_nodeset_equals(&ping->view.clique, &accepted_clique) && ping->view.committed == self->view.accepted && ping->view.committed > self->view.committed) { __trace("saw commit %u from %u and i accepted %u => i commit %u", ping->view.committed, ping->sender, self->view.accepted, self->view.accepted); commit_clique(); } } break; } }