@Override
 protected void handleCommitRequest(
     PublishClusterStateAction.CommitClusterStateRequest request, TransportChannel channel) {
   if (errorOnCommit.get()) {
     throw new ElasticsearchException("forced error on incoming commit");
   }
   if (timeoutOnCommit.get()) {
     return;
   }
   super.handleCommitRequest(request, channel);
 }
  public void testOutOfOrderCommitMessages() throws Throwable {
    MockNode node = createMockNode("node").setAsMaster();
    final CapturingTransportChannel channel = new CapturingTransportChannel();

    List<ClusterState> states = new ArrayList<>();
    final int numOfStates = scaledRandomIntBetween(3, 25);
    for (int i = 1; i <= numOfStates; i++) {
      states.add(
          ClusterState.builder(node.clusterState)
              .version(i)
              .stateUUID(ClusterState.UNKNOWN_UUID)
              .build());
    }

    final ClusterState finalState = states.get(numOfStates - 1);

    logger.info("--> publishing states");
    for (ClusterState state : states) {
      node.action.handleIncomingClusterStateRequest(
          new BytesTransportRequest(
              PublishClusterStateAction.serializeFullClusterState(state, Version.CURRENT),
              Version.CURRENT),
          channel);
      assertThat(
          channel.response.get(), equalTo((TransportResponse) TransportResponse.Empty.INSTANCE));
      assertThat(channel.error.get(), nullValue());
      channel.clear();
    }

    logger.info("--> committing states");

    long largestVersionSeen = Long.MIN_VALUE;
    Randomness.shuffle(states);
    for (ClusterState state : states) {
      node.action.handleCommitRequest(
          new PublishClusterStateAction.CommitClusterStateRequest(state.stateUUID()), channel);
      if (largestVersionSeen < state.getVersion()) {
        assertThat(
            channel.response.get(), equalTo((TransportResponse) TransportResponse.Empty.INSTANCE));
        if (channel.error.get() != null) {
          throw channel.error.get();
        }
        largestVersionSeen = state.getVersion();
      } else {
        // older cluster states will be rejected
        assertNotNull(channel.error.get());
        assertThat(channel.error.get(), instanceOf(IllegalStateException.class));
      }
      channel.clear();
    }

    // now check the last state held
    assertSameState(node.clusterState, finalState);
  }
 @Override
 protected void handleIncomingClusterStateRequest(
     BytesTransportRequest request, TransportChannel channel) throws IOException {
   if (errorOnSend.get()) {
     throw new ElasticsearchException("forced error on incoming cluster state");
   }
   if (timeoutOnSend.get()) {
     return;
   }
   super.handleIncomingClusterStateRequest(request, channel);
 }
 public AssertingAckListener publishState(
     PublishClusterStateAction action,
     ClusterState state,
     ClusterState previousState,
     int minMasterNodes)
     throws InterruptedException {
   AssertingAckListener assertingAckListener =
       new AssertingAckListener(state.nodes().getSize() - 1);
   ClusterChangedEvent changedEvent = new ClusterChangedEvent("test update", state, previousState);
   action.publish(changedEvent, minMasterNodes, assertingAckListener);
   return assertingAckListener;
 }