[jbosscache-issues] [JBoss JIRA] Updated: (JBCACHE-1557) EvictionTimer thread going into endless loop when using LFUAlgorithm
Galder Zamarreno (JIRA)
jira-events at lists.jboss.org
Mon Jan 4 07:05:30 EST 2010
[ https://jira.jboss.org/jira/browse/JBCACHE-1557?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Galder Zamarreno updated JBCACHE-1557:
--------------------------------------
Workaround Description: Use LRU.
Workaround: [Workaround Exists]
> EvictionTimer thread going into endless loop when using LFUAlgorithm
> --------------------------------------------------------------------
>
> Key: JBCACHE-1557
> URL: https://jira.jboss.org/jira/browse/JBCACHE-1557
> Project: JBoss Cache
> Issue Type: Bug
> Security Level: Public(Everyone can see)
> Components: Eviction
> Affects Versions: 3.2.1.GA
> Environment: Hibernate3.3.2GA using JBOSSCACHE3.2.1GA as second level cache implementation
> Database: SQLServer2008
> Reporter: Guenther Demetz
> Assignee: Manik Surtani
>
> Background:Im using JBoss-cache 3.2.1 GA as 2L-cache for a Hibernate application.
> As Hibernate documentation does not suggest LRU as algorithm for 2L-cache, I use the LFU algorithm.
> At a certain point BaseEvictionAlgorithm#prune method never exits his loop anymore because of evictionQueue.getFirstNodeEntry() always returning the same value. Debugging the code we saw that the actual bug stays in method LFUQueue#removeNodeEntry (see code below) :
> This method don't handles correctly the case of non-existance of the node in the nodeMap:
> if ne == null, then neither removalQueue nor the evictionList is touched.
> This causes evictionQueue.getFirstNodeEntry() returning always the same result.
> Code:
> BaseEvictionAlgorithm.java
> ...
> protected void prune() throws EvictionException
> {
> NodeEntry entry;
> while ((entry = evictionQueue.getFirstNodeEntry()) != null) --> ENDLESS-LOOP because evict doesn't alter the evictionQueye
> {
> if (this.shouldEvictNode(entry))
> {
> this.evict(entry);
> }
> else
> {
> break;
> }
> }
> }
> Code:
> LFUQueue.java:
> public void removeNodeEntry(NodeEntry entry)
> {
> NodeEntry ne = nodeMap.remove(entry.getFqn());
> if (ne != null)
> {
> // don't remove directly from the LinkedList otherwise we will incur a O(n) = n
> // performance penalty for every removal! In the prune method for LFU, we will iterate the
> LinkedList through ONCE
> // doing a single O(n) = n operation and removal. This is much preferred over running O(n)
> = n every single time
> // remove is called. There is also special logic in the getFirstNodeEntry that will know to
> check
> // the removalQueue before returning.
> this.removalQueue.add(ne);
> /* if(!evictionList.remove(ne)) {
> throw new RuntimeException("");
> } */
> this.numElements -= ne.getNumberOfElements();
> }
> }
> Solution: following Else-block added in method LFUQueue#removeNodeEntry resolves the problem.
> Code:
> else { // ELSE BLOCK: bugfix: this prevents endless loop in BaseEvictionAlgorithm#prune method
> if(!evictionList.remove(entry))
> throw new RuntimeException("");
> this.removalQueue.add(entry);
> this.numElements -= entry.getNumberOfElements();
> }
> N.B.: In other parts of the code, i.e BaseEvictionAlgorithm: line 406 the non-existance of the node is properly handled, see following logging outputs:
> 13:55:11,712 DEBUG BaseEvictionAlgorithm:384 - Removing node /com/wuerth/phoenix/Cis/bc/persistent/jpa/ConcreteAccountPeer/assAccount/COLL/com.wuerth.phoenix.Cis.bc.persistent.jpa.ConcreteAccountPeer.assAccount#32770 from eviction queue and attempting eviction
> 13:55:11,712 DEBUG BaseEvictionAlgorithm:406 - processRemoveNodes(): Can't find node associated with fqn: /com/wuerth/phoenix/Cis/bc/persistent/jpa/ConcreteAccountPeer/assAccount/COLL/com.wuerth.phoenix.Cis.bc.persistent.jpa.ConcreteAccountPeer.assAccount#32770Could have been evicted earlier. Will just continue.
>
> regards
> G.D.
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: https://jira.jboss.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira
More information about the jbosscache-issues
mailing list