[ https://issues.apache.org/jira/browse/HBASE-14703?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15010428#comment-15010428 ]
Heng Chen commented on HBASE-14703: ----------------------------------- {quote} Now, the timeout tracking is encapsulated and reused in the RetryingCaller and in the callable. {quote} I like the idea, it is amazing! And unify switching code in AP looks wonderful! Base on that, i made some little changes. * Add some code in AP.run {code: title=AsyncProcess.java} res = caller.callWithoutRetries(callable, currentCallTotalTimeout); if (res == null|| res.getResults().size() == 0) { if (currentCallable != null) { // As mutateRow, if statistic off, nothing will return. So let's stop. actionsInProgress.set(0); } return; } {code} * Add some code in HTable.mutateRow {code: title=HTable.java} int remainingTime = tracker.getRemainingTime(callTimeout); if (remainingTime == 0) { throw new DoNotRetryIOException("Timeout for mutate row"); } {code} * remove some code unused in RpcRetryingCallerImpl {code} public T callWithoutRetries(RetryingCallable<T> callable, int callTimeout) throws IOException, RuntimeException { + tracker.start(); //Remove it. {code} * fix some checkstyle errors and org.apache.hadoop.hbase.TestInterfaceAudienceAnnotations failed. Let's say how QA talks. > 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-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.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)