@Override
  public Future invokeOnPartitionOwner(Object operation, int partitionId) {
    checkNotNull(operation, "operation cannot be null");
    checkNotNegative(partitionId, "partitionId");

    Operation op = (Operation) operation;
    return operationService.invokeOnPartition(MapService.SERVICE_NAME, op, partitionId);
  }
  @Override
  public ICompletableFuture<ReadResultSet<E>> readManyAsync(
      long startSequence, int minCount, int maxCount, IFunction<E, Boolean> filter) {

    checkSequence(startSequence);
    checkNotNegative(minCount, "minCount can't be smaller than 0");
    checkTrue(maxCount >= minCount, "maxCount should be equal or larger than minCount");
    checkTrue(
        minCount <= capacity(), "the minCount should be smaller than or equal to the capacity");
    checkTrue(maxCount <= MAX_BATCH_SIZE, "maxCount can't be larger than " + MAX_BATCH_SIZE);

    ClientMessage request =
        RingbufferReadManyAsyncCodec.encodeRequest(
            name, startSequence, minCount, maxCount, toData(filter));
    request.setPartitionId(partitionId);

    try {
      ClientInvocationFuture invocationFuture = new ClientInvocation(getClient(), request).invoke();
      return new ClientDelegatingFuture<ReadResultSet<E>>(
          invocationFuture, getContext().getSerializationService(), readManyAsyncResponseDecoder);
    } catch (Exception e) {
      throw ExceptionUtil.rethrow(e);
    }
  }
 @Override
 public InvocationBuilder createInvocationBuilder(
     String serviceName, Operation op, int partitionId) {
   checkNotNegative(partitionId, "Partition id cannot be negative!");
   return new InvocationBuilderImpl(invocationContext, serviceName, op, partitionId);
 }