[jboss-jira] [JBoss JIRA] Commented: (JBAS-4611) HTTP Session Repl Cache configured with CacheLoader can cause slow AS shutdowns
Jimmy Wilson (JIRA)
jira-events at lists.jboss.org
Tue Sep 4 10:14:15 EDT 2007
[ http://jira.jboss.com/jira/browse/JBAS-4611?page=comments#action_12375148 ]
Jimmy Wilson commented on JBAS-4611:
------------------------------------
Using a local remove in evictSubTree seems to work as expected.
> HTTP Session Repl Cache configured with CacheLoader can cause slow AS shutdowns
> -------------------------------------------------------------------------------
>
> Key: JBAS-4611
> URL: http://jira.jboss.com/jira/browse/JBAS-4611
> Project: JBoss Application Server
> Issue Type: Bug
> Security Level: Public(Everyone can see)
> Components: Web (Tomcat) service, Clustering, JBoss Cache
> Affects Versions: JBossAS-4.0.5.GA, JBossAS-4.2.1.GA, JBossAS-5.0.0.Beta2
> Reporter: Galder Zamarreno
> Assigned To: Brian Stansberry
> Priority: Minor
>
> When AS stops, the sessions for that web app are evicted from memory,
> which means removing from the memory locally. We still need the sessions
> in other nodes, for example if we're bringing a node down for maintenance
> in which case, we don't want to remove sessions of the cluster completely.
> We want users to failover to another node and continue as normal.
> The code handling this evictions first removes any data in these sessions and
> then tries to check whether this HTTP session has any children nodes in the
> cache so that it can do a complete clearout of the subtree:
> JBossCacheWrapper:
> void evictSubtree(Fqn fqn)
> {
> Exception ex = null;
> for (int i = 0; i < RETRY; i++)
> {
> try
> {
> // Evict the node itself first, since if it stores a Pojo
> // that will do everything
> proxy_.evict(fqn);
> // next do a depth first removal; this ensure all nodes
> // are removed, not just their data map
> Set children = proxy_.getChildrenNames(fqn);
> ...
> If no cache loaders were used, this would be fine, it wouldn't find any
> children in memory and would return quickly. A true local call.
> However, for a customer who's using a ClusteredCacheLoader to get around
> some state transfer issues, when AS discovers that this session does
> not contain any children nodes, it goes remote to find them because
> it didn't find them locally (won't find them remotely either):
> CacheLoaderInterceptor:
> private boolean mustLoad(DataNode n, Object key)
> {
> return n == null ||
> (n.containsKey(TreeCache.UNINITIALIZED) && (key == null || !n.containsKey(key)));
> }
> As the node has been emptied, CLI (CacheLoaderInterceptor) thinks it
> needs to go remote. Same thing would happen with Pojo too (as the
> entire node is emptied). This is an unnecessary trip which is delaying
> the local eviction of sessions.
> This would happen regardless of the CacheLoader used.
> Two possible solutions come to my mind:
> - easy one: call getChildrenNames() before evict and cache in a local variable the
> children Set. getChildrenNames() would land locally cos the fqn exists yet.
> - complex one: do a getChildrenNames(Option) passing an option indicating that
> if the lookup fails locally, don't bother going remote.
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: http://jira.jboss.com/jira/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira
More information about the jboss-jira
mailing list