That's a very good catch; it's difficult to do work that requires
synchronizing the Session because locking it can also cause deadlocks.
I've been investigating a broader approach that identifies when
multiple threads are operating on the same session and serializes
those requests using a per-session lock (possibly, by synchronizing on
the session relatively early in the pipeline).

On Mon, May 16, 2011 at 12:31 PM, David Rees <[email protected]> wrote:
> On Mon, May 16, 2011 at 7:57 AM, antalk <[email protected]> wrote:
>> Thanks for your message, i hope it is now clear that it indeed is a issue
>> somewhere within Tapestry. As a matter of fact i didn't saw this message for
>> a long time on our test machines. But just today i encountered the same
>> issue again.
>
> It looks like SessionImpl.getAttributeNames should be reworked to
> synchronize on the session - or at least catch the
> ConcurrentModificationException and try again (see patch below) which
> is simpler.
>
> But I worry that the same error could be thrown in the
> getAttributeNames function on line 61, too - similar technique should
> probably be used there as well.
>
> --- SessionImpl.java~   2011-05-16 12:19:31.159348203 -0700
> +++ SessionImpl.java    2011-05-16 12:28:35.073307235 -0700
> @@ -72,8 +72,27 @@
>
>     public List<String> getAttributeNames(String prefix)
>     {
> -        List<String> result = CollectionFactory.newList();
> +        List<String> result = null;
>
> +        do
> +        {
> +            try
> +            {
> +                result = getAttributeNamesFromSession(prefix);
> +            }
> +            catch (ConcurrentModificationException)
> +            {
> +                // Ignore - result will be null so we will try again
> +            }
> +        }
> +        while (result == null);
> +
> +        return result;
> +    }
> +
> +    private List<String> getAttributeNamesFromSession(String prefix)
> throws ConcurrentModificationException
> +    {
> +        List<String> result = CollectionFactory.newList();
>         Enumeration e = session.getAttributeNames();
>         while (e.hasMoreElements())
>         {
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [email protected]
> For additional commands, e-mail: [email protected]
>
>



-- 
Howard M. Lewis Ship

Creator of Apache Tapestry

The source for Tapestry training, mentoring and support. Contact me to
learn how I can get you up and productive in Tapestry fast!

(971) 678-5210
http://howardlewisship.com

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to