From 0c6d4e364afb81d5e6ffe127b4b604db9c98dc5f Mon Sep 17 00:00:00 2001 From: zhangduo Date: Sun, 28 Aug 2016 20:38:27 +0800 Subject: [PATCH] HBASE-16510 Reset RpcController before retry --- .../apache/hadoop/hbase/client/MasterCallable.java | 3 ++- .../hbase/client/NoncedRegionServerCallable.java | 5 ++--- .../hadoop/hbase/client/RegionServerCallable.java | 22 +++++++++++----------- 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/MasterCallable.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/MasterCallable.java index 8c4da68..e279a39 100644 --- a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/MasterCallable.java +++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/MasterCallable.java @@ -92,6 +92,7 @@ abstract class MasterCallable implements RetryingCallable, Closeable { public V call(int callTimeout) throws IOException { try { if (this.rpcController != null) { + this.rpcController.reset(); this.rpcController.setCallTimeout(callTimeout); } return rpcCall(); @@ -129,7 +130,7 @@ abstract class MasterCallable implements RetryingCallable, Closeable { /** * @param regionName RegionName. If hbase:meta, we'll set high priority. */ - void setPriority(final byte [] regionName) { + void setPriority(final byte[] regionName) { if (isMetaRegion(regionName)) { setPriority(TableName.META_TABLE_NAME); } diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/NoncedRegionServerCallable.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/NoncedRegionServerCallable.java index 21e77bd..8fbaa90 100644 --- a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/NoncedRegionServerCallable.java +++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/NoncedRegionServerCallable.java @@ -63,9 +63,6 @@ public abstract class NoncedRegionServerCallable extends AbstractRegionServer TableName tableName, byte [] row) { super(connection, tableName, row); this.rpcController = rpcController; - if (this.rpcController != null) { - this.rpcController.setPriority(tableName); - } this.nonce = getConnection().getNonceGenerator().newNonce(); } @@ -96,6 +93,8 @@ public abstract class NoncedRegionServerCallable extends AbstractRegionServer @Override public T call(int callTimeout) throws IOException { if (this.rpcController != null) { + this.rpcController.reset(); + this.rpcController.setPriority(tableName); this.rpcController.setCallTimeout(callTimeout); } try { diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/RegionServerCallable.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/RegionServerCallable.java index 3771c50..baf99a0 100644 --- a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/RegionServerCallable.java +++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/RegionServerCallable.java @@ -70,12 +70,6 @@ public abstract class RegionServerCallable extends AbstractRegionServerCallab TableName tableName, byte [] row) { super(connection, tableName, row); this.rpcController = rpcController; - // If it is an instance of PayloadCarryingRpcController, we can set priority on the - // controller based off the tableName. RpcController may be null in tests when mocking so allow - // for null controller. - if (this.rpcController != null && this.rpcController instanceof PayloadCarryingRpcController) { - ((PayloadCarryingRpcController)this.rpcController).setPriority(tableName); - } } void setClientByServiceName(ServerName service) throws IOException { @@ -106,11 +100,17 @@ public abstract class RegionServerCallable extends AbstractRegionServerCallab @Override public T call(int callTimeout) throws IOException { try { - if (this.rpcController != null && - this.rpcController instanceof PayloadCarryingRpcController) { - ((PayloadCarryingRpcController)this.rpcController).setCallTimeout(callTimeout); - // Do a reset of the CellScanner in case we are carrying any Cells since last time through. - setRpcControllerCellScanner(null); + if (this.rpcController != null) { + // Do a reset to clear previous states, such as CellScanner. + this.rpcController.reset(); + if (this.rpcController instanceof PayloadCarryingRpcController) { + PayloadCarryingRpcController pcrc = (PayloadCarryingRpcController)this.rpcController; + // If it is an instance of PayloadCarryingRpcController, we can set priority on the + // controller based off the tableName. RpcController may be null in tests when mocking so allow + // for null controller. + pcrc.setPriority(tableName); + pcrc.setCallTimeout(callTimeout); + } } return rpcCall(); } catch (Exception e) { -- 1.9.1