[ 
https://issues.apache.org/jira/browse/AXIS2-4749?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12881270#action_12881270
 ] 

Afkham Azeez edited comment on AXIS2-4749 at 6/22/10 2:02 PM:
--------------------------------------------------------------

Stefano,
Two different messages can have the same hashcode. So, if you simply store the 
hashcode & compare them, some distinct messages will be detected as duplicates, 
and will lead to message processing losses. 

There is a cleanup task which cleans up this Map, so this Map will not grow 
infinitely. Also, you could turn off at-most-once message processing if you do 
not require it using a configuration parameter in the axis2.xml file. 

      was (Author: afkham_azeez):
    Stefano,
Two different messages can have the same hashcode. So, if you simply store the 
hashcode & compare them, some distinct messages will be detected as duplicates, 
and will lead to message processing losses. 

There is a cleanup task which cleans up this Map, so this Map will not grow 
infinitely. Also, you could turn off at-most-once message processing if you do 
not require it using an configuration parameter in the axis2.xml file. 
  
> Tribe's AtMostOnceInterceptor could lead to OutOfMemory under heavy load and 
> big messages.
> ------------------------------------------------------------------------------------------
>
>                 Key: AXIS2-4749
>                 URL: https://issues.apache.org/jira/browse/AXIS2-4749
>             Project: Axis2
>          Issue Type: Bug
>    Affects Versions: 1.6
>         Environment: Linux 64 bit, JDK 1.6, WSO2 Carbon 2.0.3
>            Reporter: Stefano Bruna
>
> Wa are stressing the WSO2 ESB with some cache mediator enabled. Messages are 
> echanged by tribes through the cluster's nodes. Under heavy load and with 
> some big xml messages (1 mb per message) the local variable 
> Map<ChannelMessage, Long> receivedMessages is growing continuously leading to 
> a potential Out of Memory if the cleaning thread that runs every 5 minutes is 
> not fast enough to free up memory.
> See: 
> http://svn.apache.org/viewvc/axis/axis2/java/core/trunk/modules/clustering/src/org/apache/axis2/clustering/tribes/AtMostOnceInterceptor.java?view=markup
> This is because when an object is passed to a HashMap as a key internally the 
> original object is kept. The Hasmap is using a private class Entry that has 
> the hash, the orginal object used to create the hash, and the value that, in 
> this usage case, is a long.
> Somewhere inside HashMap.java
>         // private variables
>         final Object key;
>         Object value;
>         Entry next;
>         final int hash;
>         // constructor 
>         Entry(int i, Object obj, Object obj1, Entry entry)
>         {
>             value = obj1; <==== value, ok
>             next = entry; <===== entry with the same hash
>             key = obj; <======= orginal object, needed for the equals use in 
> case of same hash
>             hash = i; <======== key, ok 
>         }
> So if the AtMostOnceInterceptor manages for example 50 msg/sec and a message 
> is 1 mb we could have within 5 minutes a memory usage for the messageReceived 
> object of 6 GB.
> A simple solution, if we dont'to accept all this as something by desing, 
> could be to pass to the HashMap the already calculated hash of the object 
> (that is also the same method that is called internally  int i = 
> hash(obj.hashCode());) to not give the opportunity to the HashMap to keep the 
> actual object used to produce the key.
> .....
> // map
>  private static final Map<Integer, Long> receivedMessagesHashCodes =
>             new HashMap<Integer, Long>();
> .....
> Integer hashCode = new Integer(msg.hashCode());
>               
> if (receivedMessagesHashCodes.get(hashCode) == null) {  // If it is a new 
> message, keep track of it
>         receivedMessagesHashCodes.put(hashCode, System.currentTimeMillis());
>         super.messageReceived(msg);
> } else {  // If it is a duplicate message, discard it. i.e. dont call 
> super.messageReceived
>         log.info("Duplicate message received from " + 
> TribesUtil.getName(msg.getAddress()));
> }
> etc...
> but maybe is not strong enough in the case tow messages have the same hash. A 
> FIFO queue with a limited capacity  ?

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


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

Reply via email to