Esempio n. 1
0
    @Override
    public State<?, ?> handle(
        ClusterContext context, Message<ClusterMessage> message, MessageHolder outgoing)
        throws Throwable {
      switch (message.getMessageType()) {
        case configurationChanged:
          {
            ClusterMessage.ConfigurationChangeState state = message.getPayload();
            if (state.isLeaving(context.getMe())) {
              context.timeouts.cancelTimeout("leave");

              context.left();

              return start;
            } else {
              state.apply(context);
              return leaving;
            }
          }

        case leaveTimedout:
          {
            context
                .getLogger(ClusterState.class)
                .warn(
                    "Failed to leave. Cluster may consider this" + " instance still a " + "member");
            context.left();
            return start;
          }
      }

      return this;
    }
Esempio n. 2
0
    @Override
    public State<?, ?> handle(
        ClusterContext context, Message<ClusterMessage> message, MessageHolder outgoing)
        throws Throwable {
      switch (message.getMessageType()) {
        case configurationChanged:
          {
            ClusterMessage.ConfigurationChangeState state = message.getPayload();

            if (context.getMe().equals(state.getJoin())) {
              context.timeouts.cancelTimeout("join");

              context.joined();
              outgoing.offer(
                  message.copyHeadersTo(
                      internal(ClusterMessage.joinResponse, context.getConfiguration())));
              return entered;
            } else {
              state.apply(context);
              return this;
            }
          }

        case joiningTimeout:
          {
            context
                .getLogger(ClusterState.class)
                .info("Join timeout for " + message.getHeader(Message.CONVERSATION_ID));

            // Go back to requesting configurations from potential members
            for (URI potentialClusterInstanceUri : context.getJoiningInstances()) {
              outgoing.offer(to(ClusterMessage.configurationRequest, potentialClusterInstanceUri));
            }
            context.timeouts.setTimeout(
                "discovery",
                timeout(
                    ClusterMessage.configurationTimeout,
                    message,
                    new ClusterMessage.ConfigurationTimeoutState(4)));

            return acquiringConfiguration;
          }

        case joinFailure:
          {
            // This causes an exception from the join() method
            return start;
          }
      }

      return this;
    }
Esempio n. 3
0
    @Override
    public State<?, ?> handle(
        ClusterContext context, Message<ClusterMessage> message, MessageHolder outgoing)
        throws Throwable {
      switch (message.getMessageType()) {
        case addClusterListener:
          {
            context.addClusterListener(message.<ClusterListener>getPayload());

            break;
          }

        case removeClusterListener:
          {
            context.removeClusterListener(message.<ClusterListener>getPayload());

            break;
          }

        case configurationRequest:
          {
            outgoing.offer(
                message.copyHeadersTo(
                    respond(
                        ClusterMessage.configurationResponse,
                        message,
                        new ClusterMessage.ConfigurationResponseState(
                            context.getConfiguration().getRoles(),
                            context.getConfiguration().getMembers(),
                            new InstanceId(context.learnerContext.getLastDeliveredInstanceId()),
                            context.getConfiguration().getName()))));
            break;
          }

        case configurationChanged:
          {
            ClusterMessage.ConfigurationChangeState state = message.getPayload();
            state.apply(context);
            break;
          }

        case leave:
          {
            List<URI> nodeList = new ArrayList<URI>(context.getConfiguration().getMembers());
            if (nodeList.size() == 1) {
              context
                  .getLogger(ClusterState.class)
                  .info("Shutting down cluster: " + context.getConfiguration().getName());
              context.left();

              return start;

            } else {
              context.getLogger(ClusterState.class).info("Leaving:" + nodeList);

              ClusterMessage.ConfigurationChangeState newState =
                  new ClusterMessage.ConfigurationChangeState();
              newState.leave(context.me);

              outgoing.offer(internal(AtomicBroadcastMessage.broadcast, newState));
              context.timeouts.setTimeout("leave", timeout(ClusterMessage.leaveTimedout, message));

              return leaving;
            }
          }
      }

      return this;
    }