Author: rgodfrey
Date: Thu Jul 30 09:13:06 2015
New Revision: 1693397

URL: http://svn.apache.org/r1693397
Log:
QPID-6662 : When using direct ByteBuffers the GC does not evacuate SoftRefs 
from memory in a timely fashion leading to out of memory errors.  By explicitly 
nulling the softrefs when the broker indicates eviction is desired the GC can 
remove the bytebuffer from memory

Modified:
    
qpid/java/trunk/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/AbstractBDBMessageStore.java
    
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/store/AbstractJDBCMessageStore.java

Modified: 
qpid/java/trunk/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/AbstractBDBMessageStore.java
URL: 
http://svn.apache.org/viewvc/qpid/java/trunk/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/AbstractBDBMessageStore.java?rev=1693397&r1=1693396&r2=1693397&view=diff
==============================================================================
--- 
qpid/java/trunk/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/AbstractBDBMessageStore.java
 (original)
+++ 
qpid/java/trunk/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/AbstractBDBMessageStore.java
 Thu Jul 30 09:13:06 2015
@@ -1263,7 +1263,7 @@ public abstract class AbstractBDBMessage
         @Override
         public boolean isInMemory()
         {
-            return _messageDataRef.isHardRef();
+            return _messageDataRef.isHardRef() || _messageDataRef.getData() != 
null;
         }
 
         private boolean stored()
@@ -1274,7 +1274,12 @@ public abstract class AbstractBDBMessage
         @Override
         public boolean flowToDisk()
         {
+
             flushToStore();
+            if(!_messageDataRef.isHardRef())
+            {
+                ((MessageDataSoftRef)_messageDataRef).clear();
+            }
             return true;
         }
 

Modified: 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/store/AbstractJDBCMessageStore.java
URL: 
http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/store/AbstractJDBCMessageStore.java?rev=1693397&r1=1693396&r2=1693397&view=diff
==============================================================================
--- 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/store/AbstractJDBCMessageStore.java
 (original)
+++ 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/store/AbstractJDBCMessageStore.java
 Thu Jul 30 09:13:06 2015
@@ -1697,20 +1697,27 @@ public abstract class AbstractJDBCMessag
         @Override
         public boolean isInMemory()
         {
-            return _messageDataRef.isHardRef();
+            return _messageDataRef.isHardRef() || _messageDataRef.getData() != 
null;
         }
 
         @Override
         public boolean flowToDisk()
         {
-            try(Connection conn = newConnection())
+            if(!stored())
             {
-                store(conn);
-                conn.commit();
+                try (Connection conn = newConnection())
+                {
+                    store(conn);
+                    conn.commit();
+                }
+                catch (SQLException e)
+                {
+                    throw new StoreException("Failed to flow to disk", e);
+                }
             }
-            catch (SQLException e)
+            if(!_messageDataRef.isHardRef())
             {
-                throw new StoreException("Failed to flow to disk", e);
+                ((MessageDataSoftRef)_messageDataRef).clear();
             }
             return true;
         }



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to