class TransportPutChunkAction extends TransportReplicationAction<PutChunkRequest, PutChunkReplicaRequest, PutChunkResponse> {

    private final BlobTransferTarget transferTarget;

    @Inject
    public TransportPutChunkAction(Settings settings,
                                   TransportService transportService,
                                   ClusterService clusterService,
                                   IndicesService indicesService,
                                   ThreadPool threadPool,
                                   ShardStateAction shardStateAction,
                                   BlobTransferTarget transferTarget) {
        super(
            settings,
            PutChunkAction.NAME,
            transportService,
            clusterService,
            indicesService,
            threadPool,
            shardStateAction,
            PutChunkRequest::new,
            PutChunkReplicaRequest::new,
            ThreadPool.Names.WRITE
        );
        this.transferTarget = transferTarget;
    }

    @Override
    protected PutChunkResponse newResponseInstance(StreamInput in) throws IOException {
        return new PutChunkResponse(in);
    }

    @Override
    protected void shardOperationOnPrimary(PutChunkRequest request,
                                           IndexShard primary,
                                           ActionListener<PrimaryResult<PutChunkReplicaRequest, PutChunkResponse>> listener) {
        ActionListener.completeWith(listener, () -> {
            PutChunkResponse response = new PutChunkResponse();
            transferTarget.continueTransfer(request, response);
            final PutChunkReplicaRequest replicaRequest = new PutChunkReplicaRequest(
                request.shardId(),
                clusterService.localNode().getId(),
                request.transferId(),
                request.currentPos(),
                request.content(),
                request.isLast()
            );
            replicaRequest.index(request.index());
            return new PrimaryResult<>(replicaRequest, response);
        });
    }

    @Override
    protected ReplicaResult shardOperationOnReplica(PutChunkReplicaRequest shardRequest, IndexShard replica) {<FILL_FUNCTION_BODY>}
}

        PutChunkResponse response = new PutChunkResponse();
        transferTarget.continueTransfer(shardRequest, 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