protected AsyncBroadcastAction(Request request, ActionListener<Response> listener) {
      this.request = request;
      this.listener = listener;

      clusterState = clusterService.state();

      ClusterBlockException blockException = checkGlobalBlock(clusterState, request);
      if (blockException != null) {
        throw blockException;
      }
      // update to concrete indices
      String[] concreteIndices =
          clusterState.metaData().concreteIndices(request.indicesOptions(), request.indices());
      blockException = checkRequestBlock(clusterState, request, concreteIndices);
      if (blockException != null) {
        throw blockException;
      }

      nodes = clusterState.nodes();
      logger.trace("resolving shards based on cluster state version [{}]", clusterState.version());
      shardsIts = shards(clusterState, request, concreteIndices);
      expectedOps = shardsIts.size();

      shardsResponses = new AtomicReferenceArray<Object>(expectedOps);
    }
 @Override
 protected final void masterOperation(
     final Request request, final ClusterState state, final ActionListener<Response> listener)
     throws ElasticsearchException {
   String[] concreteIndices =
       state.metaData().concreteIndices(request.indicesOptions(), request.indices());
   doMasterOperation(request, concreteIndices, state, listener);
 }
 public String[] indices() {
   return indicesLevelRequest.indices();
 }
 @Override
 public String[] indices() {
   return request.indices();
 }