[ 
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-start.patch

So I was getting confused with the result returned in the client-small-scan 
that, I think, is just used to lookup the region; note that this does _not_ 
update any stats b/c the form of the result is 'wrong' for stats (its an array 
of results).

Adding a second put, I see that only the asyncProcess check is used to collect 
stats from the result.

The best I can tell is the StatsTrackingRpcRetryingCaller was there to catch 
cases where we don't go through the multi() calls.

I think the "right" way to fix this, following the original intent of the code, 
is to add support for unwrapping results from the other, non-put calls. 
Currently, things like mutateRows _don't return a result_, even though there is 
information there. Thus, the right thing to do would seem to be unwrapping that 
result and letting the StatsTrackingRpcCaller handle the result's stats as we 
would expect.

I'm attaching a patch that would be *starting point* for doing this - we would 
need to add support in a couple more places as well.

If you apply this patch and then drop breakpoints in at 
RSRpcServices#mutateRows and StatsTrackingRpcRetryingCaller#callWithRetries. 
You'll see that the RS does in fact send along the stats information, but 
HTable#mutateRow returns only retuns any kind of result after the changes in 
the patch.

> update the per-region stats twice for the call on return
> --------------------------------------------------------
>
>                 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-start.patch, HBASE-14703.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