Uploaded image for project: 'Hadoop Common'
  1. Hadoop Common
  2. HADOOP-151

RPC code has socket leak?

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Closed
    • Major
    • Resolution: Fixed
    • 0.1.0, 0.1.1, 0.2.0
    • 0.2.0
    • ipc
    • None

    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)
        Unknown macro: { 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;
      }.

      Attachments

        Activity

          People

            cutting Doug Cutting
            psutter Peter Sutter
            Votes:
            0 Vote for this issue
            Watchers:
            1 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved: