/** 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); } }