[ 
https://issues.apache.org/jira/browse/TAP5-277?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12639444#action_12639444
 ] 

Howard M. Lewis Ship commented on TAP5-277:
-------------------------------------------

I've been trying to pursue this; my development JDK doesn't seem to have an 
issue.

Here's some code, adapted from a JDK bug report, to see if things are working 
correctly:


import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;

/**
 * Test ReentrantReadWrite Lock. This code shows how we cannot regain a read 
lock if a write lock times out.
 * Adapted from http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6571733.
 */
public class ValidateReentrantReadWriteLockBugFixed implements Runnable
{
    private static final int THREAD_COUNT = 10;

    final static ReadWriteLock lock = new ReentrantReadWriteLock(false);

    final static Runnable blocker = new Runnable()
    {
        public void run()
        {
            log("Acquire Read (blocker)");

            lock.readLock().lock();

            sleep(20);

            log("Release Read (blocker)");

            lock.readLock().unlock();
        }
    };

    public void run()
    {
        log("Acquire Read (initial)");

        lock.readLock().lock();

        log("Release Read (for upgrade)");

        lock.readLock().unlock();

        log("Try For Write");
        try
        {
            boolean gotWrite = lock.writeLock().tryLock(20, 
TimeUnit.MILLISECONDS);

            if (gotWrite)
            {
                log("Got Write");

                sleep(5);

                log("Unlocking write");

                lock.writeLock().unlock();
            }
            else
            {
                log("**** Write timed out");
            }
        }
        catch (InterruptedException e)
        {
            log("Interrupted");
        }

        log("Re-Obtain Read (after write lock released)");
        lock.readLock().lock();

        log("Release Read");
        lock.readLock().unlock();

        log("EXIT Try");
    }

    static void sleep(int millis)
    {
        try
        {
            Thread.sleep(millis);
        }
        catch (InterruptedException ex)
        { // Ignore.
        }
    }

    static void log(String s)
    {
        System.out.printf("%s: %s%n", Thread.currentThread().getName(), s);
    }

    public static void main(String[] args)
    {
        for (int i = 0; i < THREAD_COUNT; i++)
        {
            new Thread(blocker, "Blocker" + i).start();
            new Thread(new ValidateReentrantReadWriteLockBugFixed(), "TryWrite" 
+ i).start();
        }
    }
}


On my machine, this code executes and completes normally, with a mix of 
successful locks and lock timeouts.

Please compile and execute this code in your target environment.

> Request threads hang at ConcurrentBarrier.withRead() on multi-processor 
> machine
> -------------------------------------------------------------------------------
>
>                 Key: TAP5-277
>                 URL: https://issues.apache.org/jira/browse/TAP5-277
>             Project: Tapestry 5
>          Issue Type: Bug
>          Components: tapestry-ioc
>    Affects Versions: 5.0.15
>            Reporter: Wendell Ruotsi
>
> At some point, my pages stop responding - before the request even gets logged 
> - looking through the threads, I see them hung (3 of them here). On a single 
> processor machine, I haven't seen this. This happens with both Tomcat and 
> Jetty.
> Name: http-80-1
> State: WAITING on [EMAIL PROTECTED]
> Total blocked: 0  Total waited: 10
> Stack trace: 
> sun.misc.Unsafe.park(Native Method)
> java.util.concurrent.locks.LockSupport.park(Unknown Source)
> java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(Unknown
>  Source)
> java.util.concurrent.locks.AbstractQueuedSynchronizer.doAcquireShared(Unknown 
> Source)
> java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireShared(Unknown 
> Source)
> java.util.concurrent.locks.ReentrantReadWriteLock$ReadLock.lock(Unknown 
> Source)
> org.apache.tapestry5.ioc.internal.util.ConcurrentBarrier.withRead(ConcurrentBarrier.java:73)
> org.apache.tapestry5.internal.services.CheckForUpdatesFilter.service(CheckForUpdatesFilter.java:106)
> $RequestHandler_11cf8146628.service($RequestHandler_11cf8146628.java)
> $RequestHandler_11cf814661f.service($RequestHandler_11cf814661f.java)
> org.apache.tapestry5.services.TapestryModule$16.service(TapestryModule.java:1005)
> org.apache.tapestry5.upload.internal.services.MultipartServletRequestFilter.service(MultipartServletRequestFilter.java:44)
> $HttpServletRequestHandler_11cf8146620.service($HttpServletRequestHandler_11cf8146620.java)
> org.apache.tapestry5.internal.services.IgnoredPathsFilter.service(IgnoredPathsFilter.java:62)
> $HttpServletRequestFilter_11cf814661d.service($HttpServletRequestFilter_11cf814661d.java)
> $HttpServletRequestHandler_11cf8146620.service($HttpServletRequestHandler_11cf8146620.java)
> $HttpServletRequestHandler_11cf814661c.service($HttpServletRequestHandler_11cf814661c.java)
> org.apache.tapestry5.TapestryFilter.doFilter(TapestryFilter.java:179)
> org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
> org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
> org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
> org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
> org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
> org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
> org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
> org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
> org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
> org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
> org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
> java.lang.Thread.run(Unknown Source)
> Name: http-80-2
> State: WAITING on [EMAIL PROTECTED]
> Total blocked: 1  Total waited: 16
> Stack trace: 
> sun.misc.Unsafe.park(Native Method)
> java.util.concurrent.locks.LockSupport.park(Unknown Source)
> java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(Unknown
>  Source)
> java.util.concurrent.locks.AbstractQueuedSynchronizer.doAcquireShared(Unknown 
> Source)
> java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireShared(Unknown 
> Source)
> java.util.concurrent.locks.ReentrantReadWriteLock$ReadLock.lock(Unknown 
> Source)
> org.apache.tapestry5.ioc.internal.util.ConcurrentBarrier.restoreReadLock(ConcurrentBarrier.java:173)
> org.apache.tapestry5.ioc.internal.util.ConcurrentBarrier.tryWithWrite(ConcurrentBarrier.java:243)
> org.apache.tapestry5.internal.services.CheckForUpdatesFilter$2.invoke(CheckForUpdatesFilter.java:87)
> org.apache.tapestry5.internal.services.CheckForUpdatesFilter$2.invoke(CheckForUpdatesFilter.java:84)
> org.apache.tapestry5.ioc.internal.util.ConcurrentBarrier.withRead(ConcurrentBarrier.java:83)
> org.apache.tapestry5.internal.services.CheckForUpdatesFilter.service(CheckForUpdatesFilter.java:106)
> $RequestHandler_11cf8146628.service($RequestHandler_11cf8146628.java)
> $RequestHandler_11cf814661f.service($RequestHandler_11cf814661f.java)
> org.apache.tapestry5.services.TapestryModule$16.service(TapestryModule.java:1005)
> org.apache.tapestry5.upload.internal.services.MultipartServletRequestFilter.service(MultipartServletRequestFilter.java:44)
> $HttpServletRequestHandler_11cf8146620.service($HttpServletRequestHandler_11cf8146620.java)
> org.apache.tapestry5.internal.services.IgnoredPathsFilter.service(IgnoredPathsFilter.java:62)
> $HttpServletRequestFilter_11cf814661d.service($HttpServletRequestFilter_11cf814661d.java)
> $HttpServletRequestHandler_11cf8146620.service($HttpServletRequestHandler_11cf8146620.java)
> $HttpServletRequestHandler_11cf814661c.service($HttpServletRequestHandler_11cf814661c.java)
> org.apache.tapestry5.TapestryFilter.doFilter(TapestryFilter.java:179)
> org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
> org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
> org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
> org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
> org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
> org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
> org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
> org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
> org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
> org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
> org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
> java.lang.Thread.run(Unknown Source)
> Name: http-80-3
> State: WAITING on [EMAIL PROTECTED]
> Total blocked: 0  Total waited: 1
> Stack trace: 
> sun.misc.Unsafe.park(Native Method)
> java.util.concurrent.locks.LockSupport.park(Unknown Source)
> java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(Unknown
>  Source)
> java.util.concurrent.locks.AbstractQueuedSynchronizer.doAcquireShared(Unknown 
> Source)
> java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireShared(Unknown 
> Source)
> java.util.concurrent.locks.ReentrantReadWriteLock$ReadLock.lock(Unknown 
> Source)
> org.apache.tapestry5.ioc.internal.util.ConcurrentBarrier.withRead(ConcurrentBarrier.java:73)
> org.apache.tapestry5.internal.services.CheckForUpdatesFilter.service(CheckForUpdatesFilter.java:106)
> $RequestHandler_11cf8146628.service($RequestHandler_11cf8146628.java)
> $RequestHandler_11cf814661f.service($RequestHandler_11cf814661f.java)
> org.apache.tapestry5.services.TapestryModule$16.service(TapestryModule.java:1005)
> org.apache.tapestry5.upload.internal.services.MultipartServletRequestFilter.service(MultipartServletRequestFilter.java:44)
> $HttpServletRequestHandler_11cf8146620.service($HttpServletRequestHandler_11cf8146620.java)
> org.apache.tapestry5.internal.services.IgnoredPathsFilter.service(IgnoredPathsFilter.java:62)
> $HttpServletRequestFilter_11cf814661d.service($HttpServletRequestFilter_11cf814661d.java)
> $HttpServletRequestHandler_11cf8146620.service($HttpServletRequestHandler_11cf8146620.java)
> $HttpServletRequestHandler_11cf814661c.service($HttpServletRequestHandler_11cf814661c.java)
> org.apache.tapestry5.TapestryFilter.doFilter(TapestryFilter.java:179)
> org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
> org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
> org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
> org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
> org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
> org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
> org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
> org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
> org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
> org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
> org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
> java.lang.Thread.run(Unknown Source)

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to