Refactor the HTable#get and HTable#getRow methods to avoid repetition of
retry-on-failure logic
-----------------------------------------------------------------------------------------------
Key: HADOOP-2555
URL: https://issues.apache.org/jira/browse/HADOOP-2555
Project: Hadoop
Issue Type: Improvement
Components: contrib/hbase
Reporter: Peter Dolan
Priority: Minor
The following code is repeated in every one of HTable#get and HTable#getRow
methods:
{code:title=HTable.java|borderStyle=solid}
MapWritable value = null;
for (int tries = 0; tries < numRetries; tries++) {
HRegionLocation r = getRegionLocation(row);
HRegionInterface server =
connection.getHRegionConnection(r.getServerAddress());
try {
value = server.getRow(r.getRegionInfo().getRegionName(), row, ts); //
This is the only line of code that changes significantly between methods
break;
} catch (IOException e) {
if (e instanceof RemoteException) {
e = RemoteExceptionHandler.decodeRemoteException((RemoteException) e);
}
if (tries == numRetries - 1) {
// No more tries
throw e;
}
if (LOG.isDebugEnabled()) {
LOG.debug("reloading table servers because: " + e.getMessage());
}
tableServers = connection.reloadTableServers(tableName);
}
try {
Thread.sleep(this.pause);
} catch (InterruptedException x) {
// continue
}
}
{code}
This should be factored out into a protected method that handles
retry-on-failure logic to facilitate more robust testing and the development of
new API methods.
Proposed modification:
// Execute the provided Callable against the server
protected <T> callServerWithRetries(Callable<T> callable) throws
RemoteException;
The above code could then be reduced to:
{code:title=HTable.java|borderStyle=solid}
MapWritable value = null;
final connection;
try {
value = callServerWithRetries(new Callable<MapWritable>() {
HRegionLocation r = getRegionLocation(row);
HRegionInterface server =
connection.getHRegionConnection(r.getServerAddress());
server.getRow(r.getRegionInfo().getRegionName(), row, ts);
});
} catch (RemoteException e) {
// handle unrecoverable remote exceptions
}
{code}
This would greatly ease the development of new API methods by reducing the
amount of code needed to implement a new method and reducing the amount of
logic that needs to be tested per method.
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.