HDFS-14721. RBF: ProxyOpComplete is not accurate in FederationRPCPerformanceMonitor. Contributed by xuzq.

This commit is contained in:
Ayush Saxena 2019-08-29 20:08:38 +05:30
parent 8c0759d02a
commit 8e779a151e
2 changed files with 29 additions and 6 deletions

View File

@ -432,8 +432,11 @@ private Object invokeMethod(
if (this.rpcMonitor != null) {
this.rpcMonitor.proxyOpComplete(true);
}
RemoteException re = (RemoteException) ioe;
ioe = re.unwrapRemoteException();
ioe = getCleanException(ioe);
// RemoteException returned by NN
throw (RemoteException) ioe;
throw ioe;
} else if (ioe instanceof ConnectionNullException) {
if (this.rpcMonitor != null) {
this.rpcMonitor.proxyOpFailureCommunicate();
@ -553,11 +556,6 @@ private Object invoke(String nsId, int retryCount, final Method method,
throw new StandbyException(ioe.getMessage());
}
} else {
if (ioe instanceof RemoteException) {
RemoteException re = (RemoteException) ioe;
ioe = re.unwrapRemoteException();
ioe = getCleanException(ioe);
}
throw ioe;
}
} else {

View File

@ -188,6 +188,31 @@ private void testListing(String path) throws IOException {
requiredPaths.size(), partialListing.length);
}
/**
* Verify the metric ProxyOp with RemoteException.
*/
@Test
public void testProxyOpWithRemoteException() throws IOException {
final String testPath = "/proxy_op/remote_exception.txt";
final FederationRPCMetrics metrics = getRouterContext().
getRouter().getRpcServer().getRPCMetrics();
String ns1 = getCluster().getNameservices().get(1);
final FileSystem fileSystem1 = getCluster().
getNamenode(ns1, null).getFileSystem();
try {
// Create the test file in ns1.
createFile(fileSystem1, testPath, 32);
long beforeProxyOp = metrics.getProxyOps();
// First retry nn0 with remoteException then nn1.
getRouterProtocol().getBlockLocations(testPath, 0, 1);
assertEquals(2, metrics.getProxyOps() - beforeProxyOp);
} finally {
fileSystem1.delete(new Path(testPath), true);
}
}
@Override
public void testProxyListFiles() throws IOException, InterruptedException,
URISyntaxException, NoSuchMethodException, SecurityException {