You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@ratis.apache.org by "Shashikant Banerjee (Jira)" <ji...@apache.org> on 2019/09/23 11:11:00 UTC

[jira] [Updated] (RATIS-688) Avoid buffer copies while submitting client requests in Ratis

     [ https://issues.apache.org/jira/browse/RATIS-688?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Shashikant Banerjee updated RATIS-688:
--------------------------------------
    Description: 
Currently, while sending write requests to Ratis from ozone, a protobuf object containing data encoded  and then resultant protobuf is again converted to a byteString which internally does a copy of the buffer embedded inside the protobuf again so that it can be submitted over to Ratis client. Again, while sending the appendRequest as well while building up the appendRequestProto, it might be again copying the data. The idea here is to provide client so pass the raw data(stateMachine data) separately to ratis client without copying overhead. 

 
{code:java}
private CompletableFuture<RaftClientReply> sendRequestAsync(
    ContainerCommandRequestProto request) {
  try (Scope scope = GlobalTracer.get()
      .buildSpan("XceiverClientRatis." + request.getCmdType().name())
      .startActive(true)) {
    ContainerCommandRequestProto finalPayload =
        ContainerCommandRequestProto.newBuilder(request)
            .setTraceID(TracingUtil.exportCurrentSpan())
            .build();
    boolean isReadOnlyRequest = HddsUtils.isReadOnly(finalPayload);

//  finalPayload already has the byteString data embedded. 
    ByteString byteString = finalPayload.toByteString(); -----> It involves a copy again.
    if (LOG.isDebugEnabled()) {
      LOG.debug("sendCommandAsync {} {}", isReadOnlyRequest,
          sanitizeForDebug(finalPayload));
    }
    return isReadOnlyRequest ?
        getClient().sendReadOnlyAsync(() -> byteString) :
        getClient().sendAsync(() -> byteString);
  }
}
{code}

  was:Currently, while sending write requests to Ratis from ozone, a protobuf object containing data encoded  and then resultant protobuf is again converted to a byteString which internally does a copy of the buffer embedded inside the protobuf again so that it can be submitted over to Ratis client. Again, while sending the appendRequest as well while building up the appendRequestProto, it might be again copying the data. The idea here is to provide client so pass the raw data(stateMachinne data) separately to ratis client without copying overhead. 


> Avoid buffer copies while submitting client requests in Ratis
> -------------------------------------------------------------
>
>                 Key: RATIS-688
>                 URL: https://issues.apache.org/jira/browse/RATIS-688
>             Project: Ratis
>          Issue Type: Bug
>          Components: client, server
>            Reporter: Shashikant Banerjee
>            Priority: Major
>             Fix For: 0.4.0
>
>
> Currently, while sending write requests to Ratis from ozone, a protobuf object containing data encoded  and then resultant protobuf is again converted to a byteString which internally does a copy of the buffer embedded inside the protobuf again so that it can be submitted over to Ratis client. Again, while sending the appendRequest as well while building up the appendRequestProto, it might be again copying the data. The idea here is to provide client so pass the raw data(stateMachine data) separately to ratis client without copying overhead. 
>  
> {code:java}
> private CompletableFuture<RaftClientReply> sendRequestAsync(
>     ContainerCommandRequestProto request) {
>   try (Scope scope = GlobalTracer.get()
>       .buildSpan("XceiverClientRatis." + request.getCmdType().name())
>       .startActive(true)) {
>     ContainerCommandRequestProto finalPayload =
>         ContainerCommandRequestProto.newBuilder(request)
>             .setTraceID(TracingUtil.exportCurrentSpan())
>             .build();
>     boolean isReadOnlyRequest = HddsUtils.isReadOnly(finalPayload);
> //  finalPayload already has the byteString data embedded. 
>     ByteString byteString = finalPayload.toByteString(); -----> It involves a copy again.
>     if (LOG.isDebugEnabled()) {
>       LOG.debug("sendCommandAsync {} {}", isReadOnlyRequest,
>           sanitizeForDebug(finalPayload));
>     }
>     return isReadOnlyRequest ?
>         getClient().sendReadOnlyAsync(() -> byteString) :
>         getClient().sendAsync(() -> byteString);
>   }
> }
> {code}



--
This message was sent by Atlassian Jira
(v8.3.4#803005)