You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by st...@apache.org on 2013/01/11 06:27:37 UTC
svn commit: r1431894 - in
/hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/client:
HConnectionManager.java RetriesExhaustedWithDetailsException.java
Author: stack
Date: Fri Jan 11 05:27:37 2013
New Revision: 1431894
URL: http://svn.apache.org/viewvc?rev=1431894&view=rev
Log:
HBASE-7318 Add verbose logging option to HConnectionManager
Modified:
hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/client/HConnectionManager.java
hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/client/RetriesExhaustedWithDetailsException.java
Modified: hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/client/HConnectionManager.java
URL: http://svn.apache.org/viewvc/hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/client/HConnectionManager.java?rev=1431894&r1=1431893&r2=1431894&view=diff
==============================================================================
--- hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/client/HConnectionManager.java (original)
+++ hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/client/HConnectionManager.java Fri Jan 11 05:27:37 2013
@@ -518,7 +518,7 @@ public class HConnectionManager {
}
}
- /* Encapsulates connection to zookeeper and regionservers.*/
+ /** Encapsulates connection to zookeeper and regionservers.*/
static class HConnectionImplementation implements HConnection, Closeable {
static final Log LOG = LogFactory.getLog(HConnectionImplementation.class);
private final Class<? extends AdminProtocol> adminClass;
@@ -1856,12 +1856,6 @@ public class HConnectionManager {
private final Object[] results;
private final Batch.Callback<R> callback;
- // Error management: these lists are filled by the errors on the final try. Indexes
- // are consistent, i.e. exceptions[i] matches failedActions[i] and failedAddresses[i]
- private final List<Throwable> exceptions;
- private final List<Row> failedActions;
- private final List<String> failedAddresses;
-
// Used during the batch process
private final List<Action<R>> toReplay;
private final LinkedList<Triple<MultiAction<R>, HRegionLocation, Future<MultiResponse>>>
@@ -1883,9 +1877,6 @@ public class HConnectionManager {
this.toReplay = new ArrayList<Action<R>>();
this.inProgress =
new LinkedList<Triple<MultiAction<R>, HRegionLocation, Future<MultiResponse>>>();
- this.exceptions = new ArrayList<Throwable>();
- this.failedActions = new ArrayList<Row>();
- this.failedAddresses = new ArrayList<String>();
this.curNumRetries = 0;
}
@@ -1924,6 +1915,14 @@ public class HConnectionManager {
for (Entry<HRegionLocation, MultiAction<R>> e : actionsByServer.entrySet()) {
Callable<MultiResponse> callable =
createDelayedCallable(sleepTime, e.getKey(), e.getValue());
+ if (LOG.isTraceEnabled() && (sleepTime > 0)) {
+ StringBuilder sb = new StringBuilder();
+ for (Action<R> action : e.getValue().allActions()) {
+ sb.append(Bytes.toStringBinary(action.getAction().getRow()) + ";");
+ }
+ LOG.trace("Sending requests to [" + e.getKey().getHostnamePort()
+ + "] with delay of [" + sleepTime + "] for rows [" + sb.toString() + "]");
+ }
Triple<MultiAction<R>, HRegionLocation, Future<MultiResponse>> p =
new Triple<MultiAction<R>, HRegionLocation, Future<MultiResponse>>(
e.getValue(), e.getKey(), this.pool.submit(callable));
@@ -1931,14 +1930,6 @@ public class HConnectionManager {
}
}
-
- private void addToErrorsLists(Exception ex, Row row, Triple<MultiAction<R>,
- HRegionLocation, Future<MultiResponse>> obj) {
- this.exceptions.add(ex);
- this.failedActions.add(row);
- this.failedAddresses.add(obj.getSecond().getHostnamePort());
- }
-
/**
* Resubmit the actions which have failed, after a sleep time.
* @throws IOException
@@ -1965,6 +1956,13 @@ public class HConnectionManager {
return;
}
+ boolean isTraceEnabled = LOG.isTraceEnabled();
+ BatchErrors errors = new BatchErrors();
+ BatchErrors retriedErrors = null;
+ if (isTraceEnabled) {
+ retriedErrors = new BatchErrors();
+ }
+
// We keep the number of retry per action.
int[] nbRetries = new int[this.results.length];
@@ -1990,7 +1988,6 @@ public class HConnectionManager {
// Analyze and resubmit until all actions are done successfully or failed after numRetries
while (!this.inProgress.isEmpty()) {
-
// We need the original multi action to find out what actions to replay if
// we have a 'total' failure of the Future<MultiResponse>
// We need the HRegionLocation as we give it back if we go out of retries
@@ -2013,8 +2010,11 @@ public class HConnectionManager {
Row row = action.getAction();
hci.updateCachedLocations(this.tableName, row, exception);
if (noRetry) {
- addToErrorsLists(exception, row, currentTask);
+ errors.add(exception, row, currentTask);
} else {
+ if (isTraceEnabled) {
+ retriedErrors.add(exception, row, currentTask);
+ }
lastRetry = addToReplay(nbRetries, action);
}
}
@@ -2036,8 +2036,11 @@ public class HConnectionManager {
Row row = correspondingAction.getAction();
hci.updateCachedLocations(this.tableName, row, result);
if (result instanceof DoNotRetryIOException || noRetry) {
- addToErrorsLists((Exception)result, row, currentTask);
+ errors.add((Exception)result, row, currentTask);
} else {
+ if (isTraceEnabled) {
+ retriedErrors.add((Exception)result, row, currentTask);
+ }
lastRetry = addToReplay(nbRetries, correspondingAction);
}
} else // success
@@ -2052,20 +2055,60 @@ public class HConnectionManager {
// Retry all actions in toReplay then clear it.
if (!noRetry && !toReplay.isEmpty()) {
+ if (isTraceEnabled) {
+ LOG.trace("Retrying due to errors: " + retriedErrors.getDescriptionAndClear());
+ }
doRetry();
if (lastRetry) {
+ if (isTraceEnabled) {
+ LOG.trace("No more retries");
+ }
noRetry = true;
}
}
}
- if (!exceptions.isEmpty()) {
- throw new RetriesExhaustedWithDetailsException(this.exceptions,
- this.failedActions,
- this.failedAddresses);
+ errors.rethrowIfAny();
+ }
+
+
+ private class BatchErrors {
+ private List<Throwable> exceptions = new ArrayList<Throwable>();
+ private List<Row> actions = new ArrayList<Row>();
+ private List<String> addresses = new ArrayList<String>();
+
+ public void add(Exception ex, Row row,
+ Triple<MultiAction<R>, HRegionLocation, Future<MultiResponse>> obj) {
+ exceptions.add(ex);
+ actions.add(row);
+ addresses.add(obj.getSecond().getHostnamePort());
+ }
+
+ public void rethrowIfAny() throws RetriesExhaustedWithDetailsException {
+ if (!exceptions.isEmpty()) {
+ throw makeException();
+ }
+ }
+
+ public String getDescriptionAndClear()
+ {
+ if (exceptions.isEmpty()) {
+ return "";
+ }
+ String result = makeException().getMessage();
+ exceptions.clear();
+ actions.clear();
+ addresses.clear();
+ return result;
+ };
+
+ private RetriesExhaustedWithDetailsException makeException() {
+ return new RetriesExhaustedWithDetailsException(exceptions, actions, addresses);
}
}
+
+
/**
* Put the action that has to be retried in the Replay list.
* @return true if we're out of numRetries and it's the last retry.
Modified: hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/client/RetriesExhaustedWithDetailsException.java
URL: http://svn.apache.org/viewvc/hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/client/RetriesExhaustedWithDetailsException.java?rev=1431894&r1=1431893&r2=1431894&view=diff
==============================================================================
--- hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/client/RetriesExhaustedWithDetailsException.java (original)
+++ hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/client/RetriesExhaustedWithDetailsException.java Fri Jan 11 05:27:37 2013
@@ -54,7 +54,7 @@ extends RetriesExhaustedException {
super("Failed " + exceptions.size() + " action" +
pluralize(exceptions) + ": " +
getDesc(exceptions, actions, hostnameAndPort));
-
+
this.exceptions = exceptions;
this.actions = actions;
this.hostnameAndPort = hostnameAndPort;