示例#1
0
/**
 * 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));
}
示例#2
0
/**
 * 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);
}
示例#3
0
/**
 * 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);
}
示例#4
0
/**
 * 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;
    }
}