can you submit a quickstart that reproduces this?

the lock on session only blocks concurrent requests from the browser,
which is usually not a big deal because most users operate one window
at a time.

also we do not get the same results in our wicket-threadtest project.

-igor

On Tue, Nov 10, 2009 at 10:17 AM, Pamir Erdem <pamir.er...@gmail.com> wrote:
> From wicket source code WebRequestCycleProcessor has a lock on session.
> (Look at the source code below).
> From a profiler we can easily observe that %57 of the time is spent on this
> function especially on lock region.
> Is there any way to speed it up  this source code ?
>
>
>  /**
>  * @see
> org.apache.wicket.request.IRequestCycleProcessor#resolve(org.apache.wicket.RequestCycle,
>  *      org.apache.wicket.request.RequestParameters)
>  */
>  public IRequestTarget resolve(final RequestCycle requestCycle,
>   final RequestParameters requestParameters)
>  {
>  IRequestCodingStrategy requestCodingStrategy = requestCycle.getProcessor()
>    .getRequestCodingStrategy();
>
>  final String path = requestParameters.getPath();
>  IRequestTarget target = null;
>
>  // See whether this request points to a bookmarkable page
>  if (requestParameters.getBookmarkablePageClass() != null)
>  {
>   target = resolveBookmarkablePage(requestCycle, requestParameters);
>  }
>  // See whether this request points to a rendered page
>  else if (requestParameters.getComponentPath() != null)
>  {
>   // marks whether or not we will be processing this request
>   boolean processRequest = true;
>   synchronized (requestCycle.getSession())
>   {
>    // we need to check if this request has been flagged as
>    // process-only-if-path-is-active and if so make sure this
>    // condition is met
>    if (requestParameters.isOnlyProcessIfPathActive())
>    {
>     // this request has indeed been flagged as
>     // process-only-if-path-is-active
>
>     Session session = Session.get();
>     IPageMap pageMap =
> session.pageMapForName(requestParameters.getPageMapName(),
>       false);
>     if (pageMap == null)
>     {
>      // requested pagemap no longer exists - ignore this
>      // request
>      processRequest = false;
>     }
>     else if (pageMap instanceof AccessStackPageMap)
>     {
>      AccessStackPageMap accessStackPageMap = (AccessStackPageMap)pageMap;
>      if (accessStackPageMap.getAccessStack().size() > 0)
>      {
>       final Access access = (Access)accessStackPageMap.getAccessStack()
>         .peek();
>
>       final int pageId = Integer
>         .parseInt(Strings.firstPathComponent(requestParameters
>           .getComponentPath(), Component.PATH_SEPARATOR));
>
>       if (pageId != access.getId())
>       {
>        // the page is no longer the active page
>        // - ignore this request
>        processRequest = false;
>       }
>       else
>       {
>        final int version = requestParameters.getVersionNumber();
>        if (version != Page.LATEST_VERSION &&
>          version != access.getVersion())
>        {
>         // version is no longer the active version -
>         // ignore this request
>         processRequest = false;
>        }
>       }
>      }
>     }
>     else
>     {
>      // TODO also this should work..
>     }
>    }
>   }
>   if (processRequest)
>   {
>    try
>    {
>     target = resolveRenderedPage(requestCycle, requestParameters);
>    }
>    catch (IgnoreAjaxRequestException e)
>    {
>     target = EmptyAjaxRequestTarget.getInstance();
>    }
>   }
>   else
>   {
>    throw new PageExpiredException("Request cannot be processed");
>   }
>  }
>  // See whether this request points to a shared resource
>  else if (requestParameters.getResourceKey() != null)
>  {
>   target = resolveSharedResource(requestCycle, requestParameters);
>  }
>  // See whether this request points to the home page
>  else if (Strings.isEmpty(path) || ("/".equals(path)))
>  {
>   target = resolveHomePageTarget(requestCycle, requestParameters);
>  }
>
>  // NOTE we are doing the mount check as the last item, so that it will
>  // only be executed when everything else fails. This enables URLs like
>  // /foo/bar/?wicket:bookmarkablePage=my.Page to be resolved, where
>  // is either a valid mount or a non-valid mount. I (Eelco) am not
>  // absolutely sure this is a great way to go, but it seems to have been
>  // established as the default way of doing things. If we ever want to
>  // tighten the algorithm up, it should be combined by going back to
>  // unmounted paths so that requests with Wicket parameters like
>  // 'bookmarkablePage' are always created and resolved in the same
>  // fashion. There is a test for this in UrlMountingTest.
>  if (target == null)
>  {
>   // still null? check for a mount
>   target = requestCodingStrategy.targetForRequest(requestParameters);
>
>   if (target == null && requestParameters.getComponentPath() != null)
>   {
>    // If the target is still null and there was a component path
>    // then the Page could not be located in the session
>    throw new PageExpiredException(
>      "Cannot find the rendered page in session [pagemap=" +
>        requestParameters.getPageMapName() + ",componentPath=" +
>        requestParameters.getComponentPath() + ",versionNumber=" +
>        requestParameters.getVersionNumber() + "]");
>   }
>  }
>  else
>  {
>   // a target was found, but not by looking up a mount. check whether
>   // this is allowed
>   if (Application.get().getSecuritySettings().getEnforceMounts() &&
>     requestCodingStrategy.pathForTarget(target) != null)
>   {
>    String msg = "Direct access not allowed for mounted targets";
>    // the target was mounted, but we got here via another path
>    // : deny the request
>    log.error(msg + " [request=" + requestCycle.getRequest() + ",target=" +
> target +
>      ",session=" + Session.get() + "]");
>    throw new
> AbortWithWebErrorCodeException(HttpServletResponse.SC_FORBIDDEN, msg);
>   }
>  }
>
>  // (WICKET-1356) in case no target was found, return null here.
> RequestCycle will deal with it
>  // possible letting wicket filter to pass the request down the filter
> chain
>  /*
>  if (target == null)
>  {
>   // if we get here, we have no recognized Wicket target, and thus
>   // regard this as a external (non-wicket) resource request on
>   // this server
>   return resolveExternalResource(requestCycle);
>  }
>  */
>
>  return target;
>  }
>
>
> --
> Pamir Erdem
>

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscr...@wicket.apache.org
For additional commands, e-mail: users-h...@wicket.apache.org

Reply via email to