[
https://issues.apache.org/jira/browse/WICKET-311?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
János Cserép updated WICKET-311:
--------------------------------
Who shouldl call notifyAll() when the whole block is synchronized?
>From Session.getPage():
synchronized (pageMapsUsedInRequest)
{
long startTime = System.currentTimeMillis();
// TODO For now only use the setting. Might be
extended with
// something overridable on request/ page/
request target level
// later
Duration timeout =
Application.get().getRequestCycleSettings().getTimeout();
// Get page entry for id and version
Thread t =
(Thread)pageMapsUsedInRequest.get(pageMap);
while (t != null && t != Thread.currentThread())
{
try
{
pageMapsUsedInRequest.wait(timeout.getMilliseconds());
}
catch (InterruptedException ex)
{
throw new
WicketRuntimeException(ex);
}
t =
(Thread)pageMapsUsedInRequest.get(pageMap);
if (t != null && t !=
Thread.currentThread()
&& (startTime +
timeout.getMilliseconds()) < System.currentTimeMillis())
{
// if it is still not the right
thread..
// This either points to long
running code (a report
// page?) or a deadlock or such
throw new
WicketRuntimeException("After " + timeout + " the Pagemap "
+ pageMapName +
" is still locked by: " + t
+ ", giving up
trying to get the page for path: " + path);
}
}
pageMapsUsedInRequest.put(pageMap,
Thread.currentThread());
final String id =
Strings.firstPathComponent(path, Component.PATH_SEPARATOR);
Page page = pageMap.get(Integer.parseInt(id),
versionNumber);
if (page == null)
{
pageMapsUsedInRequest.remove(pageMap);
pageMapsUsedInRequest.notifyAll();
}
return page;
}
> race condition between
> wicket.session.pagemap.LeastRecentlyAccessedEvictionStrategy and
> Session.getPage()
> ----------------------------------------------------------------------------------------------------------
>
> Key: WICKET-311
> URL: https://issues.apache.org/jira/browse/WICKET-311
> Project: Wicket
> Issue Type: Bug
> Components: wicket
> Affects Versions: 1.2.3
> Environment: Glassfish, Open Portlet Container
> Reporter: János Cserép
>
> I'm seeing a race condition when using PortletApplication (probably because
> of overlapping (?) RENDER and ACTION phases)
> One thread is stopped here:
> wicket.session.pagemap.LeastRecentlyAccessedEvictionStrategy.evict(LeastRecentlyAccessedEvictionStrategy.java:60)
> wicket.Page.endVersion(Page.java:1136)
> wicket.Page.internalOnDetach(Page.java:811)
> wicket.Component.internalDetach(Component.java:2571)
> wicket.MarkupContainer.internalDetach(MarkupContainer.java:374)
> wicket.Page.internalDetach(Page.java:300)
> wicket.request.target.component.PageRequestTarget.detach(PageRequestTarget.java:84)
> wicket.RequestCycle.detach(RequestCycle.java:807)
> wicket.RequestCycle.steps(RequestCycle.java:1102)
> wicket.RequestCycle.request(RequestCycle.java:454)
> wicket.protocol.http.portlet.WicketPortlet.render(WicketPortlet.java:250)
> The other throws an exception after 1 minute here:
> wicket.WicketRuntimeException: After 1 minute the Pagemap null is still
> locked by: Thread[httpWorkerThread-8080-0,10,Grizzly], giving up trying to
> get the page for path:
> 0:tabs:panel:tasklist:topToolbars:1:toolbar:span:navigator:navigation:4:pageLink
> at wicket.Session.getPage(Session.java:440)
> at
> wicket.protocol.http.portlet.PortletRequestTargetResolverStrategy.resolveRenderedPage(PortletRequestTargetResolverStrategy.java:214)
> at
> wicket.protocol.http.portlet.PortletRequestTargetResolverStrategy.resolve(PortletRequestTargetResolverStrategy.java:135)
> at
> wicket.request.compound.AbstractCompoundRequestCycleProcessor.resolve(AbstractCompoundRequestCycleProcessor.java:48)
> at wicket.RequestCycle.step(RequestCycle.java:992)
> at wicket.RequestCycle.steps(RequestCycle.java:1084)
> at wicket.RequestCycle.request(RequestCycle.java:454)
> at
> wicket.protocol.http.portlet.WicketPortlet.processAction(WicketPortlet.java:198)
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.