docs: private void configure(RaftMember.Type type, CompletableFuture<Void> future) {
      // Set a timer to retry the attempt to leave the cluster.
      configureTimeout = cluster.getContext().getThreadContext().schedule(cluster.getContext().getElectionTimeout(), () -> {
        configure(type, future);
      });
  
      // Attempt to leave the cluster by submitting a LeaveRequest directly to the server state.
      // Non-leader states should forward the request to the leader if there is one. Leader states
      // will log, replicate, and commit the reconfiguration.
      cluster.getContext().getRaftRole().onReconfigure(ReconfigureRequest.builder()
          .withIndex(cluster.getConfiguration().index())
          .withTerm(cluster.getConfiguration().term())
          .withMember(new DefaultRaftMember(id, type, updated))
          .build()).whenComplete((response, error) -> {
            if (error == null) {
              if (response.status() == RaftResponse.Status.OK) {
                cancelConfigureTimer();
                cluster.configure(new Configuration(response.index(), response.term(), response.timestamp(), response.members()));
                future.complete(null);
              } else if (response.error() == null
                  || response.error().type() == RaftError.Type.UNAVAILABLE
                  || response.error().type() == RaftError.Type.PROTOCOL_ERROR
                  || response.error().type() == RaftError.Type.NO_LEADER) {
                cancelConfigureTimer();
                configureTimeout = cluster.getContext().getThreadContext().schedule(cluster.getContext().getElectionTimeout().multipliedBy(2), () -> configure(type, future));
              } else {
                cancelConfigureTimer();
                future.completeExceptionally(response.error().createException());
              }
            } else {
              future.completeExceptionally(error);
            }
          });
    }