You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@activemq.apache.org by Hiram Chirino <hi...@hiramchirino.com> on 2005/12/23 18:37:08 UTC

Re: svn commit: r358785 - /incubator/activemq/trunk/activemq-core/src/main/java/org/activemq/broker/region/PrefetchSubscription.java

Hi Adrian,

doing a getMessage() before incrementReferenceCount() is dangerous  
since the message could have been swapped out and the call to  
getMessage() will return null.
Yes, I know there is a null check to see if the message is null, but  
that should only happen if the message was expired.  Right now I  
think it's possible that we are going to have cases of where messages  
get swapped out and this code is going to think that the message has  
been expired.

Regards,
Hiram


On Dec 23, 2005, at 4:48 AM, aco@apache.org wrote:

> Author: aco
> Date: Fri Dec 23 01:47:47 2005
> New Revision: 358785
>
> URL: http://svn.apache.org/viewcvs?rev=358785&view=rev
> Log:
> Postpone incrementing of reference count and preload size, only  
> after we are sure that the message will be dispatched by the  
> current subscription. This is to prevent a memory leak type of  
> scenario.
>
> Modified:
>     incubator/activemq/trunk/activemq-core/src/main/java/org/ 
> activemq/broker/region/PrefetchSubscription.java
>
> Modified: incubator/activemq/trunk/activemq-core/src/main/java/org/ 
> activemq/broker/region/PrefetchSubscription.java
> URL: http://svn.apache.org/viewcvs/incubator/activemq/trunk/ 
> activemq-core/src/main/java/org/activemq/broker/region/ 
> PrefetchSubscription.java?rev=358785&r1=358784&r2=358785&view=diff
> ====================================================================== 
> ========
> --- incubator/activemq/trunk/activemq-core/src/main/java/org/ 
> activemq/broker/region/PrefetchSubscription.java (original)
> +++ incubator/activemq/trunk/activemq-core/src/main/java/org/ 
> activemq/broker/region/PrefetchSubscription.java Fri Dec 23  
> 01:47:47 2005
> @@ -239,19 +239,19 @@
>
>      private void dispatch(final MessageReference node) throws  
> IOException {
>
> -        node.incrementReferenceCount();
> -
>          final Message message = node.getMessage();
>          if( message == null ) {
>              return;
> -        }
> -        incrementPreloadSize(node.getMessage().getSize());
> +        }
>
>          // Make sure we can dispatch a message.
>          if( canDispatch(node) ) {
>
>              MessageDispatch md = createMessageDispatch(node,  
> message);
>              dispatched.addLast(node);
> +
> +            node.incrementReferenceCount();
> +            incrementPreloadSize(node.getMessage().getSize());
>
>              if( info.isDispatchAsync() ) {
>                  md.setConsumer(new Runnable(){
>