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]