[ https://issues.apache.org/jira/browse/TAP5-2799?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17901417#comment-17901417 ]
Alex Craddock commented on TAP5-2799: ------------------------------------- Hi, Thank you for the update on the ticket, apologies it's taken me a while to respond. While what you say makes sense, as the session Object could change due to the lack of immutability of the object itself. We have a filter that does this {code:java} String queryParameter = request.getParameter(PARAMETER); if (session != null && StringUtils.isBlank(queryParameter)) { queryParameter = (String) session.getAttribute(PARAMETER); } return queryParameter;{code} I think quite often the query parameter is empty or null when it returns from the method. Reading the code it seems the lock is dropped once the Thread has completed (due to a thread cleanup method). I am wondering if changing it to {code:java} String queryParameter = request.getParameter(PARAMETER); if (session != null && StringUtils.isBlank(queryParameter)) { if (CollectionUtils.isNotEmpty(session.getAttributeNames(PARAMETER))) { queryParameter = (String) session.getAttribute(PARAMETER); } } return queryParameter; {code} Although this would still hold a read lock it may make it less likely to cause an issue. Although I am still concerned by how many individual threads are locking on the write lock, as if this is ThreadLocal then I would expect it not to cause a problem between threads. > Thread Lockup when trying to read from a Session Object > ------------------------------------------------------- > > Key: TAP5-2799 > URL: https://issues.apache.org/jira/browse/TAP5-2799 > Project: Tapestry 5 > Issue Type: Bug > Components: tapestry-http > Affects Versions: 5.8.7 > Reporter: Alex Craddock > Assignee: Ben Weidig > Priority: Major > > I am not 100% sure how to recreate this but one of our servers froze up on > the 443 port, when I looked into it and checked a thread dump I noticed 24 > threads all in this stack. > > > {code:java} > "http-nio-443-exec-25" #95 daemon prio=5 os_prio=0 cpu=6249001.07ms > elapsed=138173.76s tid=0x00007fd974035800 nid=0x6288f waiting on condition > [0x00007fd929edb000] > java.lang.Thread.State: WAITING (parking) > at jdk.internal.misc.Unsafe.park(java.base@11.0.25/Native Method) > - parking to wait for <0x000000047a350910> (a > java.util.concurrent.locks.ReentrantReadWriteLock$NonfairSync) > at > java.util.concurrent.locks.LockSupport.park(java.base@11.0.25/LockSupport.java:194) > at > java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(java.base@11.0.25/AbstractQueuedSynchronizer.java:885) > at > java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireQueued(java.base@11.0.25/AbstractQueuedSynchronizer.java:917) > at > java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(java.base@11.0.25/AbstractQueuedSynchronizer.java:1240) > at > java.util.concurrent.locks.ReentrantReadWriteLock$WriteLock.lock(java.base@11.0.25/ReentrantReadWriteLock.java:959) > at > org.apache.tapestry5.http.internal.services.TapestrySessionFactoryImpl$SessionLockImpl.acquireWriteLock(TapestrySessionFactoryImpl.java:110) > at > org.apache.tapestry5.http.internal.services.SessionImpl.getAttribute(SessionImpl.java:50) > at > org.apache.tapestry5.http.internal.services.ClusteredSessionImpl.getAttribute(ClusteredSessionImpl.java:56) > {code} > > > Which seemed a bit odd to me. When I looked into the code for > "org.apache.tapestry5.http.internal.services.SessionImpl" I noticed this > > {code:java} > public Object getAttribute(String name) { > this.lock.acquireWriteLock(); > return this.session.getAttribute(name); > } > public List<String> getAttributeNames() { > this.lock.acquireReadLock(); > return InternalUtils.toList(this.session.getAttributeNames()); > } > public void setAttribute(String name, Object value) { > this.lock.acquireWriteLock(); > this.session.setAttribute(name, value); > } {code} > I am not sure why, but I think it's a bug that when you are calling > getAttribute, that it should only apply a read lock rather than a write lock. > Not sure if this will solve my issue but I think this should be looked into. > -- This message was sent by Atlassian Jira (v8.20.10#820010)