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.

Reply via email to