HADOOP-8533. Remove parallel call ununsed capability in RPC. Contributed by Brandon Li.
git-svn-id: https://svn.apache.org/repos/asf/hadoop/common/trunk@1356504 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
72a5f92e69
commit
22822df7c3
@ -82,6 +82,9 @@ Trunk (unreleased changes)
|
|||||||
HADOOP-8059. Add javadoc to InterfaceAudience and InterfaceStability.
|
HADOOP-8059. Add javadoc to InterfaceAudience and InterfaceStability.
|
||||||
(Brandon Li via suresh)
|
(Brandon Li via suresh)
|
||||||
|
|
||||||
|
HADOOP-8533. Remove parallel call ununsed capability in RPC.
|
||||||
|
(Brandon Li via suresh)
|
||||||
|
|
||||||
BUG FIXES
|
BUG FIXES
|
||||||
|
|
||||||
HADOOP-8177. MBeans shouldn't try to register when it fails to create MBeanName.
|
HADOOP-8177. MBeans shouldn't try to register when it fails to create MBeanName.
|
||||||
|
@ -971,43 +971,6 @@ private void cleanupCalls() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Call implementation used for parallel calls. */
|
|
||||||
private class ParallelCall extends Call {
|
|
||||||
private ParallelResults results;
|
|
||||||
private int index;
|
|
||||||
|
|
||||||
public ParallelCall(Writable param, ParallelResults results, int index) {
|
|
||||||
super(RPC.RpcKind.RPC_WRITABLE, param);
|
|
||||||
this.results = results;
|
|
||||||
this.index = index;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Deliver result to result collector. */
|
|
||||||
protected void callComplete() {
|
|
||||||
results.callComplete(this);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Result collector for parallel calls. */
|
|
||||||
private static class ParallelResults {
|
|
||||||
private Writable[] values;
|
|
||||||
private int size;
|
|
||||||
private int count;
|
|
||||||
|
|
||||||
public ParallelResults(int size) {
|
|
||||||
this.values = new Writable[size];
|
|
||||||
this.size = size;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Collect a result. */
|
|
||||||
public synchronized void callComplete(ParallelCall call) {
|
|
||||||
values[call.index] = call.getRpcResult(); // store the value
|
|
||||||
count++; // count it
|
|
||||||
if (count == size) // if all values are in
|
|
||||||
notify(); // then notify waiting caller
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Construct an IPC client whose values are of the given {@link Writable}
|
/** Construct an IPC client whose values are of the given {@link Writable}
|
||||||
* class. */
|
* class. */
|
||||||
public Client(Class<? extends Writable> valueClass, Configuration conf,
|
public Client(Class<? extends Writable> valueClass, Configuration conf,
|
||||||
@ -1209,63 +1172,6 @@ public Writable call(RPC.RpcKind rpcKind, Writable rpcRequest,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @deprecated Use {@link #call(Writable[], InetSocketAddress[],
|
|
||||||
* Class, UserGroupInformation, Configuration)} instead
|
|
||||||
*/
|
|
||||||
@Deprecated
|
|
||||||
public Writable[] call(Writable[] params, InetSocketAddress[] addresses)
|
|
||||||
throws IOException, InterruptedException {
|
|
||||||
return call(params, addresses, null, null, conf);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @deprecated Use {@link #call(Writable[], InetSocketAddress[],
|
|
||||||
* Class, UserGroupInformation, Configuration)} instead
|
|
||||||
*/
|
|
||||||
@Deprecated
|
|
||||||
public Writable[] call(Writable[] params, InetSocketAddress[] addresses,
|
|
||||||
Class<?> protocol, UserGroupInformation ticket)
|
|
||||||
throws IOException, InterruptedException {
|
|
||||||
return call(params, addresses, protocol, ticket, conf);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/** Makes a set of calls in parallel. Each parameter is sent to the
|
|
||||||
* corresponding address. When all values are available, or have timed out
|
|
||||||
* or errored, the collected results are returned in an array. The array
|
|
||||||
* contains nulls for calls that timed out or errored. */
|
|
||||||
public Writable[] call(Writable[] params, InetSocketAddress[] addresses,
|
|
||||||
Class<?> protocol, UserGroupInformation ticket, Configuration conf)
|
|
||||||
throws IOException, InterruptedException {
|
|
||||||
if (addresses.length == 0) return new Writable[0];
|
|
||||||
|
|
||||||
ParallelResults results = new ParallelResults(params.length);
|
|
||||||
synchronized (results) {
|
|
||||||
for (int i = 0; i < params.length; i++) {
|
|
||||||
ParallelCall call = new ParallelCall(params[i], results, i);
|
|
||||||
try {
|
|
||||||
ConnectionId remoteId = ConnectionId.getConnectionId(addresses[i],
|
|
||||||
protocol, ticket, 0, conf);
|
|
||||||
Connection connection = getConnection(remoteId, call);
|
|
||||||
connection.sendParam(call); // send each parameter
|
|
||||||
} catch (IOException e) {
|
|
||||||
// log errors
|
|
||||||
LOG.info("Calling "+addresses[i]+" caught: " +
|
|
||||||
e.getMessage(),e);
|
|
||||||
results.size--; // wait for one fewer result
|
|
||||||
}
|
|
||||||
}
|
|
||||||
while (results.count != results.size) {
|
|
||||||
try {
|
|
||||||
results.wait(); // wait for all results
|
|
||||||
} catch (InterruptedException e) {}
|
|
||||||
}
|
|
||||||
|
|
||||||
return results.values;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// for unit testing only
|
// for unit testing only
|
||||||
@InterfaceAudience.Private
|
@InterfaceAudience.Private
|
||||||
@InterfaceStability.Unstable
|
@InterfaceStability.Unstable
|
||||||
|
@ -244,12 +244,6 @@ public ConnectionId getConnectionId() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public Object[] call(Method method, Object[][] params,
|
|
||||||
InetSocketAddress[] addrs, UserGroupInformation ticket, Configuration conf) {
|
|
||||||
throw new UnsupportedOperationException();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Writable Wrapper for Protocol Buffer Requests
|
* Writable Wrapper for Protocol Buffer Requests
|
||||||
*/
|
*/
|
||||||
|
@ -21,7 +21,6 @@
|
|||||||
import java.lang.reflect.Field;
|
import java.lang.reflect.Field;
|
||||||
import java.lang.reflect.InvocationHandler;
|
import java.lang.reflect.InvocationHandler;
|
||||||
import java.lang.reflect.Proxy;
|
import java.lang.reflect.Proxy;
|
||||||
import java.lang.reflect.Method;
|
|
||||||
|
|
||||||
import java.net.ConnectException;
|
import java.net.ConnectException;
|
||||||
import java.net.InetSocketAddress;
|
import java.net.InetSocketAddress;
|
||||||
@ -627,27 +626,6 @@ public static void stopProxy(Object proxy) {
|
|||||||
+ proxy.getClass());
|
+ proxy.getClass());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Expert: Make multiple, parallel calls to a set of servers.
|
|
||||||
* @deprecated Use {@link #call(Method, Object[][], InetSocketAddress[], UserGroupInformation, Configuration)} instead
|
|
||||||
*/
|
|
||||||
@Deprecated
|
|
||||||
public static Object[] call(Method method, Object[][] params,
|
|
||||||
InetSocketAddress[] addrs, Configuration conf)
|
|
||||||
throws IOException, InterruptedException {
|
|
||||||
return call(method, params, addrs, null, conf);
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Expert: Make multiple, parallel calls to a set of servers. */
|
|
||||||
public static Object[] call(Method method, Object[][] params,
|
|
||||||
InetSocketAddress[] addrs,
|
|
||||||
UserGroupInformation ticket, Configuration conf)
|
|
||||||
throws IOException, InterruptedException {
|
|
||||||
|
|
||||||
return getProtocolEngine(method.getDeclaringClass(), conf)
|
|
||||||
.call(method, params, addrs, ticket, conf);
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Construct a server for a protocol implementation instance listening on a
|
/** Construct a server for a protocol implementation instance listening on a
|
||||||
* port and address.
|
* port and address.
|
||||||
* @deprecated protocol interface should be passed.
|
* @deprecated protocol interface should be passed.
|
||||||
|
@ -19,7 +19,6 @@
|
|||||||
package org.apache.hadoop.ipc;
|
package org.apache.hadoop.ipc;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.lang.reflect.Method;
|
|
||||||
import java.net.InetSocketAddress;
|
import java.net.InetSocketAddress;
|
||||||
|
|
||||||
import javax.net.SocketFactory;
|
import javax.net.SocketFactory;
|
||||||
@ -44,11 +43,6 @@ <T> ProtocolProxy<T> getProxy(Class<T> protocol,
|
|||||||
SocketFactory factory, int rpcTimeout,
|
SocketFactory factory, int rpcTimeout,
|
||||||
RetryPolicy connectionRetryPolicy) throws IOException;
|
RetryPolicy connectionRetryPolicy) throws IOException;
|
||||||
|
|
||||||
/** Expert: Make multiple, parallel calls to a set of servers. */
|
|
||||||
Object[] call(Method method, Object[][] params, InetSocketAddress[] addrs,
|
|
||||||
UserGroupInformation ticket, Configuration conf)
|
|
||||||
throws IOException, InterruptedException;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Construct a server for a protocol implementation instance.
|
* Construct a server for a protocol implementation instance.
|
||||||
*
|
*
|
||||||
|
@ -20,7 +20,6 @@
|
|||||||
|
|
||||||
import java.lang.reflect.Proxy;
|
import java.lang.reflect.Proxy;
|
||||||
import java.lang.reflect.Method;
|
import java.lang.reflect.Method;
|
||||||
import java.lang.reflect.Array;
|
|
||||||
import java.lang.reflect.InvocationTargetException;
|
import java.lang.reflect.InvocationTargetException;
|
||||||
|
|
||||||
import java.net.InetSocketAddress;
|
import java.net.InetSocketAddress;
|
||||||
@ -274,36 +273,6 @@ public <T> ProtocolProxy<T> getProxy(Class<T> protocol, long clientVersion,
|
|||||||
return new ProtocolProxy<T>(protocol, proxy, true);
|
return new ProtocolProxy<T>(protocol, proxy, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Expert: Make multiple, parallel calls to a set of servers. */
|
|
||||||
public Object[] call(Method method, Object[][] params,
|
|
||||||
InetSocketAddress[] addrs,
|
|
||||||
UserGroupInformation ticket, Configuration conf)
|
|
||||||
throws IOException, InterruptedException {
|
|
||||||
|
|
||||||
Invocation[] invocations = new Invocation[params.length];
|
|
||||||
for (int i = 0; i < params.length; i++)
|
|
||||||
invocations[i] = new Invocation(method, params[i]);
|
|
||||||
Client client = CLIENTS.getClient(conf);
|
|
||||||
try {
|
|
||||||
Writable[] wrappedValues =
|
|
||||||
client.call(invocations, addrs, method.getDeclaringClass(), ticket, conf);
|
|
||||||
|
|
||||||
if (method.getReturnType() == Void.TYPE) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
Object[] values =
|
|
||||||
(Object[])Array.newInstance(method.getReturnType(), wrappedValues.length);
|
|
||||||
for (int i = 0; i < values.length; i++)
|
|
||||||
if (wrappedValues[i] != null)
|
|
||||||
values[i] = ((ObjectWritable)wrappedValues[i]).get();
|
|
||||||
|
|
||||||
return values;
|
|
||||||
} finally {
|
|
||||||
CLIENTS.stopClient(client);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Construct a server for a protocol implementation instance listening on a
|
/* Construct a server for a protocol implementation instance listening on a
|
||||||
* port and address. */
|
* port and address. */
|
||||||
@Override
|
@Override
|
||||||
|
@ -149,41 +149,6 @@ public void run() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static class ParallelCaller extends Thread {
|
|
||||||
private Client client;
|
|
||||||
private int count;
|
|
||||||
private InetSocketAddress[] addresses;
|
|
||||||
private boolean failed;
|
|
||||||
|
|
||||||
public ParallelCaller(Client client, InetSocketAddress[] addresses,
|
|
||||||
int count) {
|
|
||||||
this.client = client;
|
|
||||||
this.addresses = addresses;
|
|
||||||
this.count = count;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void run() {
|
|
||||||
for (int i = 0; i < count; i++) {
|
|
||||||
try {
|
|
||||||
Writable[] params = new Writable[addresses.length];
|
|
||||||
for (int j = 0; j < addresses.length; j++)
|
|
||||||
params[j] = new LongWritable(RANDOM.nextLong());
|
|
||||||
Writable[] values = client.call(params, addresses, null, null, conf);
|
|
||||||
for (int j = 0; j < addresses.length; j++) {
|
|
||||||
if (!params[j].equals(values[j])) {
|
|
||||||
LOG.fatal("Call failed!");
|
|
||||||
failed = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} catch (Exception e) {
|
|
||||||
LOG.fatal("Caught: " + StringUtils.stringifyException(e));
|
|
||||||
failed = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testSerial() throws Exception {
|
public void testSerial() throws Exception {
|
||||||
testSerial(3, false, 2, 5, 100);
|
testSerial(3, false, 2, 5, 100);
|
||||||
@ -217,52 +182,8 @@ public void testSerial(int handlerCount, boolean handlerSleep,
|
|||||||
server.stop();
|
server.stop();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testParallel() throws Exception {
|
|
||||||
testParallel(10, false, 2, 4, 2, 4, 100);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void testParallel(int handlerCount, boolean handlerSleep,
|
|
||||||
int serverCount, int addressCount,
|
|
||||||
int clientCount, int callerCount, int callCount)
|
|
||||||
throws Exception {
|
|
||||||
Server[] servers = new Server[serverCount];
|
|
||||||
for (int i = 0; i < serverCount; i++) {
|
|
||||||
servers[i] = new TestServer(handlerCount, handlerSleep);
|
|
||||||
servers[i].start();
|
|
||||||
}
|
|
||||||
|
|
||||||
InetSocketAddress[] addresses = new InetSocketAddress[addressCount];
|
|
||||||
for (int i = 0; i < addressCount; i++) {
|
|
||||||
addresses[i] = NetUtils.getConnectAddress(servers[i%serverCount]);
|
|
||||||
}
|
|
||||||
|
|
||||||
Client[] clients = new Client[clientCount];
|
|
||||||
for (int i = 0; i < clientCount; i++) {
|
|
||||||
clients[i] = new Client(LongWritable.class, conf);
|
|
||||||
}
|
|
||||||
|
|
||||||
ParallelCaller[] callers = new ParallelCaller[callerCount];
|
|
||||||
for (int i = 0; i < callerCount; i++) {
|
|
||||||
callers[i] =
|
|
||||||
new ParallelCaller(clients[i%clientCount], addresses, callCount);
|
|
||||||
callers[i].start();
|
|
||||||
}
|
|
||||||
for (int i = 0; i < callerCount; i++) {
|
|
||||||
callers[i].join();
|
|
||||||
assertFalse(callers[i].failed);
|
|
||||||
}
|
|
||||||
for (int i = 0; i < clientCount; i++) {
|
|
||||||
clients[i].stop();
|
|
||||||
}
|
|
||||||
for (int i = 0; i < serverCount; i++) {
|
|
||||||
servers[i].stop();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testStandAloneClient() throws Exception {
|
public void testStandAloneClient() throws Exception {
|
||||||
testParallel(10, false, 2, 4, 2, 4, 100);
|
|
||||||
Client client = new Client(LongWritable.class, conf);
|
Client client = new Client(LongWritable.class, conf);
|
||||||
InetSocketAddress address = new InetSocketAddress("127.0.0.1", 10);
|
InetSocketAddress address = new InetSocketAddress("127.0.0.1", 10);
|
||||||
try {
|
try {
|
||||||
@ -781,13 +702,4 @@ private static abstract class NetworkTraces {
|
|||||||
Ints.toByteArray(HADOOP0_21_ERROR_MSG.length()),
|
Ints.toByteArray(HADOOP0_21_ERROR_MSG.length()),
|
||||||
HADOOP0_21_ERROR_MSG.getBytes());
|
HADOOP0_21_ERROR_MSG.getBytes());
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void main(String[] args) throws Exception {
|
|
||||||
|
|
||||||
//new TestIPC().testSerial(5, false, 2, 10, 1000);
|
|
||||||
|
|
||||||
new TestIPC().testParallel(10, false, 2, 4, 2, 4, 1000);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -244,13 +244,6 @@ private static interface StoppedProtocol {
|
|||||||
*/
|
*/
|
||||||
private static class StoppedRpcEngine implements RpcEngine {
|
private static class StoppedRpcEngine implements RpcEngine {
|
||||||
|
|
||||||
@Override
|
|
||||||
public Object[] call(Method method, Object[][] params, InetSocketAddress[] addrs,
|
|
||||||
UserGroupInformation ticket, Configuration conf)
|
|
||||||
throws IOException, InterruptedException {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
@Override
|
@Override
|
||||||
public <T> ProtocolProxy<T> getProxy(Class<T> protocol, long clientVersion,
|
public <T> ProtocolProxy<T> getProxy(Class<T> protocol, long clientVersion,
|
||||||
@ -491,17 +484,6 @@ private void testCallsInternal(Configuration conf) throws Exception {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// try some multi-calls
|
|
||||||
Method echo =
|
|
||||||
TestProtocol.class.getMethod("echo", new Class[] { String.class });
|
|
||||||
String[] strings = (String[])RPC.call(echo, new String[][]{{"a"},{"b"}},
|
|
||||||
new InetSocketAddress[] {addr, addr}, conf);
|
|
||||||
assertTrue(Arrays.equals(strings, new String[]{"a","b"}));
|
|
||||||
|
|
||||||
Method ping = TestProtocol.class.getMethod("ping", new Class[] {});
|
|
||||||
Object[] voids = RPC.call(ping, new Object[][]{{},{}},
|
|
||||||
new InetSocketAddress[] {addr, addr}, conf);
|
|
||||||
assertEquals(voids, null);
|
|
||||||
} finally {
|
} finally {
|
||||||
server.stop();
|
server.stop();
|
||||||
if(proxy!=null) RPC.stopProxy(proxy);
|
if(proxy!=null) RPC.stopProxy(proxy);
|
||||||
|
Loading…
Reference in New Issue
Block a user