[ 
https://issues.apache.org/jira/browse/QPID-7272?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15543463#comment-15543463
 ] 

Keith Wall commented on QPID-7272:
----------------------------------

I can see three ways to fix this:

# {{MessageConverter#convert()}} methods produce a {{ServerMessage}} which 
encapsulates a {{StoredMessage}}.  StoredMessages have a #remove() method.  We 
could give the #remove responsibility for disposing any QBBs allocated by the 
converter.  The disadvantage with this is the ConsumerTargets need to remember 
to call #remove on StoredMessages that arise from conversion, but otherwise 
not.  This seems ugly.  Also this approach seems unpleasant for another reason: 
a converted  {{ServerMessage}} exposes the message's content but it does not 
own it.  I might expect that calling  #remove would also dispose the content, 
but it would not.
# Add method {{MessageConverter#dispose(N)}} which would accept a 
{{ServerMessage}} that was previously produced by the same converter.  The 
{{#dispose()}}  implementation would know how to dispose ServerMessages that it 
produced.  The {{ConsumerTarget#send}} would need to keep a reference to the 
converter and remember to call {{MessageConverter#dispose(N)}} once the message 
is passed to the protocol layer.
# Make the {{MessageConverter}} stateful. It would remember the resources that 
it produced and need to be released.  The {{ConsumerTarget}} would call 
{{MessageConverter#releaseResources}} after the converted message is passed to 
the protocol layer.  To avoid creating per-message converter garbage, the 
{{ConsumerTarget}} would need to cache the MessageConverters that it had used 
so far.  For this the MessageConverterRegistry would need to turn into a 
MessageConverterFactoryRegistry.

I am in favour 2). I think this will be unobtrusive change and could be 
incorporated in 6.1.



> [Java Broker] Direct memory QpidByteBuffer created in message conversion 
> modules should be disposed as soon as possible after becoming unused
> ---------------------------------------------------------------------------------------------------------------------------------------------
>
>                 Key: QPID-7272
>                 URL: https://issues.apache.org/jira/browse/QPID-7272
>             Project: Qpid
>          Issue Type: Bug
>          Components: Java Broker
>    Affects Versions: qpid-java-6.0
>            Reporter: Alex Rudyy
>             Fix For: qpid-java-7.0.0
>
>
> Direct memory QpidByteBuffer in 
> MessageConverter_to_1_0#convertServerMessage(...) is not disposed 
> programmatically. We rely on GC to release it from memory when it became 
> unused. There is a risk that when such QpidByteBuffers are not "garbage 
> collected" soon enough Broker might run out of direct memory on heavy loads.
> Currently a user who relies heavily of message conversion with high rates of 
> message flow, may see an OOM direct.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

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

Reply via email to