[ 
https://issues.apache.org/jira/browse/HBASE-27657?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17741660#comment-17741660
 ] 

Bryan Beaudreault commented on HBASE-27657:
-------------------------------------------

That's correct – clients can't really access the HBaseRpcController directly. 
They can provide their own implementation, which can in turn call their own 
code within it. But they can't "call" methods on the controller themselves or 
get access to an instance of it.

For us, most of the attributes we'd want to set have values that are available 
statically in the client processes – such as environment variables or static 
thread locals for API request contexts.  So for us, we can create our own 
HBaseRpcController impl which pulls on those. For example:
{code:java}
public static class MyRpcController extends HBaseRpcController {

  @Override
  public Map<String, byte[]> getAttributes() {
    return ImmutableMap.builder()
      .put("apiCaller", Bytes.toBytes(ApiContext.current().getCallerString())
      .put("workerType", Bytes.toBytes(System.getenv("WORKER_TYPE"))
      .build();  
  }
} {code}
 

> Connection and Request Attributes
> ---------------------------------
>
>                 Key: HBASE-27657
>                 URL: https://issues.apache.org/jira/browse/HBASE-27657
>             Project: HBase
>          Issue Type: New Feature
>            Reporter: Bryan Beaudreault
>            Assignee: Ray Mattingly
>            Priority: Major
>
> Currently we have the ability to set Operation attributes, via 
> Get.setAttribute, etc. It would be useful to be able to set attributes at the 
> request and connection level.
> These levels can result in less duplication. For example, send some 
> attributes once per connection instead of for every one of the millions of 
> requests a connection might send. Or send once for the request, instead of 
> duplicating on every operation in a multi request.
> Additionally, the Connection and RequestHeader are more globally available on 
> the server side. Both can be accessed via RpcServer.getCurrentCall(), which 
> is useful in various integration points – coprocessors, custom queues, 
> quotas, slow log, etc. Operation attributes are harder to access because you 
> need to parse the raw Message into the appropriate type to get access to the 
> getter.
> I was thinking adding two new methods to Connection interface:
> - setAttribute (and getAttribute/getAttributes)
> - setRequestAttributeProvider
> Any Connection attributes would be set onto the ConnectionHeader during 
> initialization. The RequestAttributeProvider would be called when creating 
> each RequestHeader.
> An alternative to setRequestAttributeProvider would be to add this into 
> HBaseRpcController, which can already be customized via site configuration. 



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to