You are viewing a plain text version of this content. The canonical link for it is here.
Posted to common-dev@hadoop.apache.org by "Doug Cutting (JIRA)" <ji...@apache.org> on 2006/04/20 01:13:36 UTC
[jira] Updated: (HADOOP-151) RPC code has socket leak?
[ http://issues.apache.org/jira/browse/HADOOP-151?page=all ]
Doug Cutting updated HADOOP-151:
--------------------------------
Summary: RPC code has socket leak? (was: Misdeclared field in RPC.class)
Component: ipc
Fix Version: 0.2
Version: 0.1.1
0.1.0
0.2
Description:
In RPC.java, the field named CLIENT should be neither static, nor a field of RPC. It should be (a) a private nonstatic field of InvocationHandler(),and (just further down), (b) a local variable in the RPC.call() method below. The comment above the declaration was a bit of giveaway:
//TODO mb@media-style.com: static client or non-static client?
private static Client CLIENT;
private static class Invoker implements InvocationHandler {
private InetSocketAddress address;
public Invoker(InetSocketAddress address, Configuration conf) {
this.address = address;
CLIENT = (Client) conf.getObject(Client.class.getName());
if(CLIENT == null) {
CLIENT = new Client(ObjectWritable.class, conf);
conf.setObject(Client.class.getName(), CLIENT);
}
}
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
ObjectWritable value = (ObjectWritable)
CLIENT.call(new Invocation(method, args), address);
return value.get();
}
}
/** Construct a client-side proxy object that implements the named protocol,
* talking to a server at the named address. */
public static Object getProxy(Class protocol, InetSocketAddress addr, Configuration conf) {
return Proxy.newProxyInstance(protocol.getClassLoader(),
new Class[] { protocol },
new Invoker(addr, conf));
}
/** Expert: Make multiple, parallel calls to a set of servers. */
public static Object[] call(Method method, Object[][] params,
InetSocketAddress[] addrs, Configuration conf)
throws IOException {
Invocation[] invocations = new Invocation[params.length];
for (int i = 0; i < params.length; i++)
invocations[i] = new Invocation(method, params[i]);
CLIENT = (Client) conf.getObject(Client.class.getName());
if(CLIENT == null) {
CLIENT = new Client(ObjectWritable.class, conf);
conf.setObject(Client.class.getName(), CLIENT);
}
Writable[] wrappedValues = CLIENT.call(invocations, addrs);
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;
}.
was:
In RPC.java, the field named CLIENT should be neither static, nor a field of RPC. It should be (a) a private nonstatic field of InvocationHandler(),and (just further down), (b) a local variable in the RPC.call() method below. The comment above the declaration was a bit of giveaway:
//TODO mb@media-style.com: static client or non-static client?
private static Client CLIENT;
private static class Invoker implements InvocationHandler {
private InetSocketAddress address;
public Invoker(InetSocketAddress address, Configuration conf) {
this.address = address;
CLIENT = (Client) conf.getObject(Client.class.getName());
if(CLIENT == null) {
CLIENT = new Client(ObjectWritable.class, conf);
conf.setObject(Client.class.getName(), CLIENT);
}
}
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
ObjectWritable value = (ObjectWritable)
CLIENT.call(new Invocation(method, args), address);
return value.get();
}
}
/** Construct a client-side proxy object that implements the named protocol,
* talking to a server at the named address. */
public static Object getProxy(Class protocol, InetSocketAddress addr, Configuration conf) {
return Proxy.newProxyInstance(protocol.getClassLoader(),
new Class[] { protocol },
new Invoker(addr, conf));
}
/** Expert: Make multiple, parallel calls to a set of servers. */
public static Object[] call(Method method, Object[][] params,
InetSocketAddress[] addrs, Configuration conf)
throws IOException {
Invocation[] invocations = new Invocation[params.length];
for (int i = 0; i < params.length; i++)
invocations[i] = new Invocation(method, params[i]);
CLIENT = (Client) conf.getObject(Client.class.getName());
if(CLIENT == null) {
CLIENT = new Client(ObjectWritable.class, conf);
conf.setObject(Client.class.getName(), CLIENT);
}
Writable[] wrappedValues = CLIENT.call(invocations, addrs);
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;
}.
Assign To: Doug Cutting
> RPC code has socket leak?
> -------------------------
>
> Key: HADOOP-151
> URL: http://issues.apache.org/jira/browse/HADOOP-151
> Project: Hadoop
> Type: Bug
> Components: ipc
> Versions: 0.1.0, 0.2, 0.1.1
> Reporter: paul sutter
> Assignee: Doug Cutting
> Fix For: 0.2
>
> In RPC.java, the field named CLIENT should be neither static, nor a field of RPC. It should be (a) a private nonstatic field of InvocationHandler(),and (just further down), (b) a local variable in the RPC.call() method below. The comment above the declaration was a bit of giveaway:
> //TODO mb@media-style.com: static client or non-static client?
> private static Client CLIENT;
> private static class Invoker implements InvocationHandler {
> private InetSocketAddress address;
> public Invoker(InetSocketAddress address, Configuration conf) {
> this.address = address;
> CLIENT = (Client) conf.getObject(Client.class.getName());
> if(CLIENT == null) {
> CLIENT = new Client(ObjectWritable.class, conf);
> conf.setObject(Client.class.getName(), CLIENT);
> }
> }
> public Object invoke(Object proxy, Method method, Object[] args)
> throws Throwable {
> ObjectWritable value = (ObjectWritable)
> CLIENT.call(new Invocation(method, args), address);
> return value.get();
> }
> }
> /** Construct a client-side proxy object that implements the named protocol,
> * talking to a server at the named address. */
> public static Object getProxy(Class protocol, InetSocketAddress addr, Configuration conf) {
> return Proxy.newProxyInstance(protocol.getClassLoader(),
> new Class[] { protocol },
> new Invoker(addr, conf));
> }
> /** Expert: Make multiple, parallel calls to a set of servers. */
> public static Object[] call(Method method, Object[][] params,
> InetSocketAddress[] addrs, Configuration conf)
> throws IOException {
> Invocation[] invocations = new Invocation[params.length];
> for (int i = 0; i < params.length; i++)
> invocations[i] = new Invocation(method, params[i]);
> CLIENT = (Client) conf.getObject(Client.class.getName());
> if(CLIENT == null) {
> CLIENT = new Client(ObjectWritable.class, conf);
> conf.setObject(Client.class.getName(), CLIENT);
> }
> Writable[] wrappedValues = CLIENT.call(invocations, addrs);
>
> 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;
> }.
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see:
http://www.atlassian.com/software/jira