You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@hbase.apache.org by "Anoop Sam John (JIRA)" <ji...@apache.org> on 2016/02/01 11:48:39 UTC

[jira] [Updated] (HBASE-15198) RPC client not using Codec and CellBlock for puts by default

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

Anoop Sam John updated HBASE-15198:
-----------------------------------
    Attachment: HBASE-15198.patch

Simple fix to make code in both places similar.
This involves reading 2 configs every time a write request goes from this client connection.   An optimization is possible with having this Codec class finding in only one place (ConnectionImpl)  which will happen once.  Then the MultiServerCallable uses the info from ConnectionImpl.   We have to add new method to ClusterConnection interface for that.  
Just gone with simple direct fix in this patch

> RPC client not using Codec and CellBlock for puts by default
> ------------------------------------------------------------
>
>                 Key: HBASE-15198
>                 URL: https://issues.apache.org/jira/browse/HBASE-15198
>             Project: HBase
>          Issue Type: Bug
>            Reporter: Anoop Sam John
>            Assignee: Anoop Sam John
>            Priority: Critical
>         Attachments: HBASE-15198.patch
>
>
> For puts we use MultiServerCallable. Here to decide whether to use cellBlock we have
> {code}
> private boolean isCellBlock() {
>     // This is not exact -- the configuration could have changed on us after connection was set up
>     // but it will do for now.
>     HConnection connection = getConnection();
>     if (connection == null) return true; // Default is to do cellblocks.
>     Configuration configuration = connection.getConfiguration();
>     if (configuration == null) return true;
>     String codec = configuration.get(HConstants.RPC_CODEC_CONF_KEY, "");
>     return codec != null && codec.length() > 0;
>   }
> {code}
> By default in hbase-default.xml, we dont have any Codec being specified.
> Where as in AbstractRpcClient we have
> {code}
> Codec getCodec() {
>     // For NO CODEC, "hbase.client.rpc.codec" must be configured with empty string AND
>     // "hbase.client.default.rpc.codec" also -- because default is to do cell block encoding.
>     String className = conf.get(HConstants.RPC_CODEC_CONF_KEY, getDefaultCodec(this.conf));
>     if (className == null || className.length() == 0) return null;
>     try {
>       return (Codec)Class.forName(className).newInstance();
>     } catch (Exception e) {
>       throw new RuntimeException("Failed getting codec " + className, e);
>     }
>   }
> .....
> public static String getDefaultCodec(final Configuration c) {
>     // If "hbase.client.default.rpc.codec" is empty string -- you can't set it to null because
>     // Configuration will complain -- then no default codec (and we'll pb everything).  Else
>     // default is KeyValueCodec
>     return c.get(DEFAULT_CODEC_CLASS, KeyValueCodec.class.getCanonicalName());
>   }
> {code}
> Our aim is to by def use Codec and it is KeyValueCodec.  
> The codec finding in MultiServerCallable to be same way as in AbstractRpcClient and then only we will be doing cellblock stuff.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)