You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@thrift.apache.org by br...@apache.org on 2011/12/22 20:04:16 UTC

svn commit: r1222397 - /thrift/trunk/lib/java/src/org/apache/thrift/transport/TSaslServerTransport.java

Author: bryanduxbury
Date: Thu Dec 22 19:04:16 2011
New Revision: 1222397

URL: http://svn.apache.org/viewvc?rev=1222397&view=rev
Log:
THRIFT-1468. java: Memory leak in TSaslServerTransport

This patch changes a particular map element to a WeakReference and thus avoids some awkward un-GC-ableness.

Patch: Mithun Radhakrishnan"

Modified:
    thrift/trunk/lib/java/src/org/apache/thrift/transport/TSaslServerTransport.java

Modified: thrift/trunk/lib/java/src/org/apache/thrift/transport/TSaslServerTransport.java
URL: http://svn.apache.org/viewvc/thrift/trunk/lib/java/src/org/apache/thrift/transport/TSaslServerTransport.java?rev=1222397&r1=1222396&r2=1222397&view=diff
==============================================================================
--- thrift/trunk/lib/java/src/org/apache/thrift/transport/TSaslServerTransport.java (original)
+++ thrift/trunk/lib/java/src/org/apache/thrift/transport/TSaslServerTransport.java Thu Dec 22 19:04:16 2011
@@ -19,6 +19,7 @@
 
 package org.apache.thrift.transport;
 
+import java.lang.ref.WeakReference;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
@@ -158,8 +159,8 @@ public class TSaslServerTransport extend
      * This is the implementation of the awful hack described above.
      * <code>WeakHashMap</code> is used to ensure that we don't leak memory.
      */
-    private static Map<TTransport, TSaslServerTransport> transportMap =
-      Collections.synchronizedMap(new WeakHashMap<TTransport, TSaslServerTransport>());
+    private static Map<TTransport, WeakReference<TSaslServerTransport>> transportMap =
+      Collections.synchronizedMap(new WeakHashMap<TTransport, WeakReference<TSaslServerTransport>>());
 
     /**
      * Mapping from SASL mechanism name -> all the parameters required to
@@ -207,21 +208,22 @@ public class TSaslServerTransport extend
      */
     @Override
     public TTransport getTransport(TTransport base) {
-      TSaslServerTransport ret = transportMap.get(base);
-      if (ret == null) {
+      WeakReference<TSaslServerTransport> ret = transportMap.get(base);
+      if (ret == null || ret.get() == null) {
         LOGGER.debug("transport map does not contain key", base);
-        ret = new TSaslServerTransport(serverDefinitionMap, base);
+        ret = new WeakReference<TSaslServerTransport>(new TSaslServerTransport(serverDefinitionMap, base));
         try {
-          ret.open();
+          ret.get().open();
         } catch (TTransportException e) {
           LOGGER.debug("failed to open server transport", e);
           throw new RuntimeException(e);
         }
-        transportMap.put(base, ret);
+        transportMap.put(base, ret); // No need for putIfAbsent().
+                                     // Concurrent calls to getTransport() will pass in different TTransports.
       } else {
         LOGGER.debug("transport map does contain key {}", base);
       }
-      return ret;
+      return ret.get();
     }
   }
 }