/** First get should try and use a shard that exists on a local node for better performance */
    private void performFirst() {
      if (shardsIt == null) {
        // just execute it on the local node
        if (internalRequest.request().operationThreaded()) {
          internalRequest.request().beforeLocalFork();
          threadPool
              .executor(executor())
              .execute(
                  new Runnable() {
                    @Override
                    public void run() {
                      try {
                        Response response = shardOperation(internalRequest.request(), null);
                        listener.onResponse(response);
                      } catch (Throwable e) {
                        onFailure(null, e);
                      }
                    }
                  });
          return;
        } else {
          try {
            final Response response = shardOperation(internalRequest.request(), null);
            listener.onResponse(response);
            return;
          } catch (Throwable e) {
            onFailure(null, e);
          }
        }
        return;
      }

      if (internalRequest.request().preferLocalShard()) {
        boolean foundLocal = false;
        ShardRouting shardX;
        while ((shardX = shardsIt.nextOrNull()) != null) {
          final ShardRouting shard = shardX;
          if (shard.currentNodeId().equals(nodes.localNodeId())) {
            foundLocal = true;
            if (internalRequest.request().operationThreaded()) {
              internalRequest.request().beforeLocalFork();
              threadPool
                  .executor(executor())
                  .execute(
                      new Runnable() {
                        @Override
                        public void run() {
                          try {
                            Response response =
                                shardOperation(internalRequest.request(), shard.shardId());
                            listener.onResponse(response);
                          } catch (Throwable e) {
                            shardsIt.reset();
                            onFailure(shard, e);
                          }
                        }
                      });
              return;
            } else {
              try {
                final Response response =
                    shardOperation(internalRequest.request(), shard.shardId());
                listener.onResponse(response);
                return;
              } catch (Throwable e) {
                shardsIt.reset();
                onFailure(shard, e);
              }
            }
          }
        }
        if (!foundLocal) {
          // no local node get, go remote
          shardsIt.reset();
          perform(null);
        }
      } else {
        perform(null);
      }
    }