class TransportStartBlobAction extends TransportReplicationAction<StartBlobRequest, StartBlobRequest, StartBlobResponse> {

    private final BlobTransferTarget transferTarget;

    @Inject
    public TransportStartBlobAction(Settings settings,
                                    TransportService transportService,
                                    ClusterService clusterService,
                                    IndicesService indicesService,
                                    ThreadPool threadPool,
                                    ShardStateAction shardStateAction,
                                    BlobTransferTarget transferTarget) {
        super(
            settings,
            StartBlobAction.NAME,
            transportService,
            clusterService,
            indicesService,
            threadPool,
            shardStateAction,
            StartBlobRequest::new,
            StartBlobRequest::new,
            ThreadPool.Names.WRITE
        );
        this.transferTarget = transferTarget;
        logger.trace("Constructor");
    }

    @Override
    protected StartBlobResponse newResponseInstance(StreamInput in) throws IOException {
        logger.trace("newResponseInstance");
        return new StartBlobResponse(in);
    }

    @Override
    protected void shardOperationOnPrimary(StartBlobRequest request,
                                           IndexShard primary,
                                           ActionListener<PrimaryResult<StartBlobRequest, StartBlobResponse>> listener) {
        ActionListener.completeWith(listener, () -> {
            logger.trace("shardOperationOnPrimary {}", request);
            final StartBlobResponse response = new StartBlobResponse();
            transferTarget.startTransfer(request, response);
            return new PrimaryResult<>(request, response);
        });
    }

    @Override
    protected ReplicaResult shardOperationOnReplica(StartBlobRequest request, IndexShard replica) {<FILL_FUNCTION_BODY>}
}

        logger.trace("shardOperationOnReplica operating on replica {}", request);
        final StartBlobResponse response = new StartBlobResponse();
        transferTarget.startTransfer(request, response);
        return new ReplicaResult();
    
<methods>public org.elasticsearch.cluster.block.ClusterBlockLevel indexBlockLevel() <variables>public static final Setting<io.crate.common.unit.TimeValue> REPLICATION_INITIAL_RETRY_BACKOFF_BOUND,public static final Setting<io.crate.common.unit.TimeValue> REPLICATION_RETRY_TIMEOUT,protected final non-sealed org.elasticsearch.cluster.service.ClusterService clusterService,protected final non-sealed java.lang.String executor,protected final non-sealed boolean forceExecutionOnPrimary,protected final non-sealed org.elasticsearch.indices.IndicesService indicesService,private volatile io.crate.common.unit.TimeValue initialRetryBackoffBound,protected final Logger logger,private volatile io.crate.common.unit.TimeValue retryTimeout,protected final non-sealed org.elasticsearch.cluster.action.shard.ShardStateAction shardStateAction,private final non-sealed boolean syncGlobalCheckpointAfterOperation,protected final non-sealed org.elasticsearch.threadpool.ThreadPool threadPool,protected final non-sealed org.elasticsearch.transport.TransportRequestOptions transportOptions,protected final non-sealed java.lang.String transportPrimaryAction,protected final non-sealed java.lang.String transportReplicaAction,protected final non-sealed org.elasticsearch.transport.TransportService transportService