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

Jesse Yates updated HBASE-14703:
--------------------------------
    Attachment: HBASE-14703-5.2-addendum.patch

I'm starting to think that to support stats across all the mutation based calls 
needs to be reimplememented to support other calls. I'm attaching an addendum 
to 5.2 (so apply 5.2 and then this patch; makes it easier to see where I'm 
going with the bigger change). 

Here's what I'm thinking instead.

Results should not have a regionStatistic as there are potentially multiple 
results for a single region. Instead, MultiResponse should carry the 
statistics. In the RsRpcServices, we can collect statistics about all the 
regions affected by the call and then return them once per region Then in 
asyncProcess we just update all the region stats at once when we receive the 
MultiResponse. 

Note this is also cleaner in cases where we return multiple results for the 
same region; where previously we would return multiple region load stats, now 
we can return just the most recent.

Also, did a little of cleanup to support using this is in the mutateRows by 
adding an empty result for each mutateRow action that was successfully 
processed.

My only concern is about the viablilty of implementing this w/o breaking wire 
compatibility. Since this is just adding protobuf fields it will still make the 
puts correctly, but in the case of upgrading, the statistics will not be 
correct (actually, missing) from until both sides are upgraded. I don't think 
this is a widely used feature yet, so I'm not too worried, but thought I should 
mention it.

> not collect stats when call HTable.mutateRow 
> ---------------------------------------------
>
>                 Key: HBASE-14703
>                 URL: https://issues.apache.org/jira/browse/HBASE-14703
>             Project: HBase
>          Issue Type: Bug
>            Reporter: Heng Chen
>            Assignee: Heng Chen
>         Attachments: HBASE-14703-5.2-addendum.patch, HBASE-14703-async.patch, 
> HBASE-14703-start.patch, HBASE-14703-v4.1.patch, HBASE-14703-v4.patch, 
> HBASE-14703.patch, HBASE-14703_v1.patch, HBASE-14703_v2.patch, 
> HBASE-14703_v3.patch, HBASE-14703_v5.1.patch, HBASE-14703_v5.2.patch, 
> HBASE-14703_v5.patch
>
>
> In {{AsyncProcess.SingleServerRequestRunnable}}, it seems we update 
> serverStatistics twice.
> The first one is that we wrapper {{RetryingCallable}}  by 
> {{StatsTrackingRpcRetryingCaller}}, and do serverStatistics update when we 
> call {{callWithRetries}} and {{callWithoutRetries}}. Relates code like below:
> {code}
>   @Override
>   public T callWithRetries(RetryingCallable<T> callable, int callTimeout)
>       throws IOException, RuntimeException {
>     T result = delegate.callWithRetries(callable, callTimeout);
>     return updateStatsAndUnwrap(result, callable);
>   }
>   @Override
>   public T callWithoutRetries(RetryingCallable<T> callable, int callTimeout)
>       throws IOException, RuntimeException {
>     T result = delegate.callWithRetries(callable, callTimeout);
>     return updateStatsAndUnwrap(result, callable);
>   }
> {code}
> The secondary one is after we get response, in {{receiveMultiAction}}, we do 
> update again. 
> {code}
> // update the stats about the region, if its a user table. We don't want to 
> slow down
> // updates to meta tables, especially from internal updates (master, etc).
> if (AsyncProcess.this.connection.getStatisticsTracker() != null) {
>   result = ResultStatsUtil.updateStats(result,
>   AsyncProcess.this.connection.getStatisticsTracker(), server, regionName);
> }
> {code}
> It seems that {{StatsTrackingRpcRetryingCaller}} is NOT necessary,  remove it?



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

Reply via email to