/**
  * Returns an iterator over active and initializing shards. Making sure though that its random
  * within the active shards, and initializing shards are the last to iterate through.
  */
 public ShardIterator activeInitializingShardsIt(int seed) {
   if (allInitializingShards.isEmpty()) {
     return new PlainShardIterator(shardId, shuffler.shuffle(activeShards, seed));
   }
   ArrayList<ShardRouting> ordered =
       new ArrayList<>(activeShards.size() + allInitializingShards.size());
   ordered.addAll(shuffler.shuffle(activeShards, seed));
   ordered.addAll(allInitializingShards);
   return new PlainShardIterator(shardId, ordered);
 }
  public ShardIterator preferAttributesActiveInitializingShardsIt(
      String[] attributes, DiscoveryNodes nodes, int seed) {
    AttributesKey key = new AttributesKey(attributes);
    AttributesRoutings activeRoutings = getActiveAttribute(key, nodes);
    AttributesRoutings initializingRoutings = getInitializingAttribute(key, nodes);

    // we now randomize, once between the ones that have the same attributes, and once for the ones
    // that don't
    // we don't want to mix between the two!
    ArrayList<ShardRouting> ordered =
        new ArrayList<>(activeRoutings.totalSize + initializingRoutings.totalSize);
    ordered.addAll(shuffler.shuffle(activeRoutings.withSameAttribute, seed));
    ordered.addAll(shuffler.shuffle(activeRoutings.withoutSameAttribute, seed));
    ordered.addAll(shuffler.shuffle(initializingRoutings.withSameAttribute, seed));
    ordered.addAll(shuffler.shuffle(initializingRoutings.withoutSameAttribute, seed));
    return new PlainShardIterator(shardId, ordered);
  }
 public ShardIterator preferNodeActiveInitializingShardsIt(String nodeId) {
   ArrayList<ShardRouting> ordered =
       new ArrayList<>(activeShards.size() + allInitializingShards.size());
   // fill it in a randomized fashion
   for (ShardRouting shardRouting : shuffler.shuffle(activeShards)) {
     ordered.add(shardRouting);
     if (nodeId.equals(shardRouting.currentNodeId())) {
       // switch, its the matching node id
       ordered.set(ordered.size() - 1, ordered.get(0));
       ordered.set(0, shardRouting);
     }
   }
   if (!allInitializingShards.isEmpty()) {
     ordered.addAll(allInitializingShards);
   }
   return new PlainShardIterator(shardId, ordered);
 }
 public ShardIterator primaryFirstActiveInitializingShardsIt() {
   ArrayList<ShardRouting> ordered =
       new ArrayList<>(activeShards.size() + allInitializingShards.size());
   // fill it in a randomized fashion
   for (ShardRouting shardRouting : shuffler.shuffle(activeShards)) {
     ordered.add(shardRouting);
     if (shardRouting.primary()) {
       // switch, its the matching node id
       ordered.set(ordered.size() - 1, ordered.get(0));
       ordered.set(0, shardRouting);
     }
   }
   // no need to worry about primary first here..., its temporal
   if (!allInitializingShards.isEmpty()) {
     ordered.addAll(allInitializingShards);
   }
   return new PlainShardIterator(shardId, ordered);
 }
 public ShardIterator preferAttributesActiveInitializingShardsIt(
     String[] attributes, DiscoveryNodes nodes) {
   return preferAttributesActiveInitializingShardsIt(attributes, nodes, shuffler.nextSeed());
 }
 /**
  * Returns an iterator over active and initializing shards. Making sure though that its random
  * within the active shards, and initializing shards are the last to iterate through.
  */
 public ShardIterator activeInitializingShardsRandomIt() {
   return activeInitializingShardsIt(shuffler.nextSeed());
 }
 public ShardIterator shardsIt(int seed) {
   return new PlainShardIterator(shardId, shuffler.shuffle(shards, seed));
 }
 public ShardIterator shardsRandomIt() {
   return new PlainShardIterator(shardId, shuffler.shuffle(shards));
 }