private void sendFailShard(
     ShardRouting shardRouting, String indexUUID, String message, @Nullable Throwable failure) {
   try {
     logger.warn(
         "[{}] marking and sending shard failed due to [{}]",
         failure,
         shardRouting.shardId(),
         message);
     failedShards.put(shardRouting.shardId(), new FailedShard(shardRouting.version()));
     shardStateAction.shardFailed(
         shardRouting,
         indexUUID,
         "shard failure ["
             + message
             + "]"
             + (failure == null ? "" : "[" + detailedMessage(failure) + "]"));
   } catch (Throwable e1) {
     logger.warn(
         "[{}][{}] failed to mark shard as failed (because of [{}])",
         e1,
         shardRouting.getIndex(),
         shardRouting.getId(),
         message);
   }
 }
 private void failAndRemoveShard(
     ShardRouting shardRouting,
     IndexService indexService,
     boolean sendShardFailure,
     String message,
     @Nullable Throwable failure) {
   if (indexService.hasShard(shardRouting.getId())) {
     try {
       indexService.removeShard(shardRouting.getId(), message);
     } catch (ShardNotFoundException e) {
       // the node got closed on us, ignore it
     } catch (Throwable e1) {
       logger.warn(
           "[{}][{}] failed to remove shard after failure ([{}])",
           e1,
           shardRouting.getIndex(),
           shardRouting.getId(),
           message);
     }
   }
   if (sendShardFailure) {
     sendFailShard(shardRouting, indexService.indexUUID(), message, failure);
   }
 }