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

Anoop Sam John commented on HBASE-15198:
----------------------------------------

Now we do CellBlocking from client it unearths some bugs.. Test failures in 
TestMultiParallel interesting one.
In testBatchWithPut() we are aborting one HRS.   Then testFlushCommitsWithAbort 
runs which also doing some puts. Regions getting moved to another RS.
In RsRpcServices#multi() we have
{code}
try {
        region = getRegion(regionAction.getRegion());
        quota = getQuotaManager().checkQuota(region, 
regionAction.getActionList());
      } catch (IOException e) {
rpcServer.getMetrics().exception(e);
        
regionActionResultBuilder.setException(ResponseConverter.buildException(e));
        
responseBuilder.addRegionActionResult(regionActionResultBuilder.build());
        continue;  // For this region it's a failure.
      }
{code}
So we dont get live region there and this try fail for those Region actions in 
this MultiRequest.  It would have got retried from client after finding new 
region location.
When we switched to cell blocking way, this getRegion fail happens. This 
Region's action might contain N Mutations in that with cells associated with 
each one.  All the Cells across diff Mutation targetted for diff Regions and in 
one continuous Cell block.    We are NOT skipping the Cells corresponding to 
these failed Mutations!   So when next RegionAction comes and continue with 
mutation, the CellScanner is in a wrong position and use Cells of invalid 
Mutation.  This results in  checkRow() in HRegion#doMiniBatchMutation to fail.  
!!!     We need to skip the CellScanner when some mutation fails.

> 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
>    Affects Versions: 0.98.0
>            Reporter: Anoop Sam John
>            Assignee: Anoop Sam John
>            Priority: Critical
>         Attachments: HBASE-15198.patch, HBASE-15198_V2.patch, 
> HBASE-15198_V3.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)

Reply via email to