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