tomcat-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Leon Rosenberg <struts_u...@anotheria.net>
Subject RE: Tomcat/JVM hangs in session.getAttribute / HashMap.get()
Date Tue, 06 Sep 2005 13:02:55 GMT
On Tue, 2005-09-06 at 08:47 -0400, Larry Isaacs wrote:
> I have seen instances of a HashMap whose entries got circularly
> linked, I assume, due to updates which where not thread safe.
> Any thread using a get() on such a HashMap will spin forever
> chasing its tail.
> 
> Cheers,
> Larry

Could be possible since we also have increasing load (until idle time
goes to zero) on those machines.... but...
we are putting only pretty simple objects like Locale or an userId
object. 
If I understand you correctly your scenario is:
HashMap Entry has a linked list of X entries at one position
and entry[Y] is poiting to the first entry instead of next or null?
But how can that happen? a JVM / Core Api bug?


public abstract class UserId  implements Serializable{

	public abstract String getPlainPresentation();
	
	public boolean equals(Object anotherObject){
		return anotherObject instanceof UserId ? 

((UserId)anotherObject).getPlainPresentation().equals(getPlainPresentation()):
			false;
	}
	
	public abstract String[] getFragmentation(int fragementationDepth, int
fragmentLength);
	
	public String toString(){
		return getPlainPresentation();
	}
}

public class LongUserId extends UserId implements Serializable{
	
	private long value;
	private transient String cachedStringPresentation; 
	
	private static final long serialVersionUID = 451670268366493765L;

	public LongUserId(long aValue){
		this.value = aValue;
	}
  
	public int hashCode(){
		return (int)value;
	}
	
	
	public boolean equals(Object o){
		return (o instanceof LongUserId) ? 
			((LongUserId)o).value == value : false;
	}
	

	public String[] getFragmentation(int fragmentationDepth, int
fragmentLength) {
		String s = getPlainPresentation();
		//first ensure our string is long enough.
		while (s.length()<fragmentationDepth*fragmentLength)
			s = "0"+s;
		
		int singleLength = fragmentLength;
		String ret[] = new String[fragmentationDepth];
		for (int i=0; i<fragmentationDepth; i++){
			String fragment = s.substring(i*singleLength, i*singleLength
+singleLength);
			ret[i] = fragment;
		}
		 
		return ret;
	}

	public String getPlainPresentation() {
		if (cachedStringPresentation==null)
			cachedStringPresentation = ""+value;
		return cachedStringPresentation;
	}


thanx
Leon


> 
> > -----Original Message-----
> > From: Leon Rosenberg [mailto:struts_user@anotheria.net] 
> > Sent: Tuesday, September 06, 2005 8:31 AM
> > To: tomcat-user@jakarta.apache.org
> > Subject: Tomcat/JVM hangs in session.getAttribute / HashMap.get()
> > 
> > Hi,
> > 
> > This is quite ugly but we are running out of ideas.
> > 
> > We are currently experiencing stange behaviour of tomcat (or the VM).
> > 
> > Our tomcat hangs (not reproduceable, but probably on parallel 
> > requests to similar methods) in session.getAttibute():
> > 
> > We checked the source code of the HashMap, StandardSession 
> > and StandardSessionFacade but couldn't find any synchronized methods. 
> > The manager shows the 4 threads hanging since 4000000 millis 
> > (more than an hour). 
> > 
> > we created a stacktrace with kill - QUIT, here the threads are:
> > 
> > 
> > "http-8580-Processor3" daemon prio=1 tid=0x7cdf11d0 
> > nid=0x3269 runnable [7d7fe000..7d7ff8bc]
> >         at java.util.HashMap.get(HashMap.java:325)
> >         at
> > org.apache.catalina.session.StandardSession.getAttribute(Stand
> > ardSession.java:975)
> >         at
> > org.apache.catalina.session.StandardSessionFacade.getAttribute
> > (StandardSessionFacade.java:109)
> >         at
> > de.friendscout.datingr4.shared.presentation.action.BaseAction.
> > getUserId(BaseAction.java:653)
> >         at
> > de.friendscout.datingr4.onlinearea.presentation.action.BaseOnl
> > ineAreaAction.getSettings(BaseOnlineAreaAction.java:89)
> >         at
> > de.friendscout.datingr4.onlinearea.presentation.action.GetOnli
> > neUsersAction.doExecute(GetOnlineUsersAction.java:49)
> > 
> > 
> > "http-8580-Processor1" daemon prio=1 tid=0x7d3fa078 
> > nid=0x3269 runnable [7ce7f000..7ce7f8bc]
> >         at java.util.HashMap.get(HashMap.java:325)
> >         at
> > org.apache.catalina.session.StandardSession.getAttribute(Stand
> > ardSession.java:975)
> >         at
> > org.apache.catalina.session.StandardSessionFacade.getAttribute
> > (StandardSessionFacade.java:109)
> >         at
> > de.friendscout.datingr4.shared.presentation.action.BaseAction.
> > getUserId(BaseAction.java:653)
> >         at
> > de.friendscout.datingr4.onlinearea.presentation.action.ShowFil
> > tersAction.doExecute(ShowFiltersAction.java:42)
> >         at
> > de.friendscout.datingr4.shared.presentation.action.BaseAction.
> > execute(BaseAction.java:316)
> > 
> > 
> > 
> > "http-8580-Processor24" daemon prio=1 tid=0x7d430200 
> > nid=0x3269 runnable [7e77f000..7e77f8bc]
> >         at java.util.HashMap.get(HashMap.java:325)
> >         at
> > org.apache.catalina.session.StandardSession.getAttribute(Stand
> > ardSession.java:975)
> >         at
> > org.apache.catalina.session.StandardSessionFacade.getAttribute
> > (StandardSessionFacade.java:109)
> >         at
> > de.friendscout.datingr4.shared.presentation.util.RealmUtility.
> > initRealm(RealmUtility.java:66)
> >         at
> > de.friendscout.datingr4.shared.presentation.util.RealmUtility.
> > initRealm(RealmUtility.java:61)
> >         at
> > de.friendscout.datingr4.shared.presentation.controller.Control
> > lerServlet.doGet(ControllerServlet.java:139)
> > 
> > 
> > My Java knowledge isn't sufficent to explain how something can hang in
> > HashMap.get() since its not synchronized. Neither are the 
> > .getAttribute() methods of the StandardSession or 
> > StandardSessionFacade. 
> > 
> > We are using jdk 1.4.2_08-b03, tomcat 5.0.25, struts 1.1, 
> > jacorb 2.2 (night build) on linux/debian/sarge - 3.1 stable.
> > 
> > any ideas? anybody?
> > 
> > regards
> > Leon
> > 
> > 
> > 
> > ---------------------------------------------------------------------
> > To unsubscribe, e-mail: tomcat-user-unsubscribe@jakarta.apache.org
> > For additional commands, e-mail: tomcat-user-help@jakarta.apache.org
> > 
> > 
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: tomcat-user-unsubscribe@jakarta.apache.org
> For additional commands, e-mail: tomcat-user-help@jakarta.apache.org
> 
> 



---------------------------------------------------------------------
To unsubscribe, e-mail: tomcat-user-unsubscribe@jakarta.apache.org
For additional commands, e-mail: tomcat-user-help@jakarta.apache.org


Mime
View raw message