[ 
https://issues.apache.org/jira/browse/CASSANDRA-5690?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13713272#comment-13713272
 ] 

Mikhail Mazursky commented on CASSANDRA-5690:
---------------------------------------------

No, that is not true.

get() obtains the lock, then do TimeUnit.NANOSECONDS.timedWait() [1] that uses 
Object.wait() [2] internally.
>From it's javadocs:
{quote}
 The current thread must own this object's monitor. The thread releases 
ownership of this monitor and waits until either of the following two 
conditions has occurred:

    Another thread notifies threads waiting on this object's monitor to wake up 
either through a call to the notify method or the notifyAll method.
    The timeout period, specified by timeout milliseconds plus nanos 
nanoseconds arguments, has elapsed. 

The thread then waits until it can re-obtain ownership of the monitor and 
resumes execution. 
{quote}

So, any number of threads blocked in get() are not preventing response() from 
setting the result.

p.s. Current implementation uses the same pattern but just doing it wrong.

[1]: 
https://docs.oracle.com/javase/6/docs/api/java/util/concurrent/TimeUnit.html#timedWait%28java.lang.Object,%20long%29
[2]: 
https://docs.oracle.com/javase/6/docs/api/java/lang/Object.html#wait%28long,%20int%29
                
> Fix AsyncOneResponse
> --------------------
>
>                 Key: CASSANDRA-5690
>                 URL: https://issues.apache.org/jira/browse/CASSANDRA-5690
>             Project: Cassandra
>          Issue Type: Bug
>          Components: Core
>            Reporter: Mikhail Mazursky
>            Assignee: Mikhail Mazursky
>            Priority: Minor
>         Attachments: trunk-5690.patch
>
>
> Current implementation of AsyncOneResponse suffers from two problems:
> 1. Spurious wakeup will lead to TimeoutException being thrown because 
> awaiting for condition is not done in loop;
> 2. condition.signal() is used where .signalAll() should be used - this leads 
> to only one thread blocked on .get() to be unblocked. Other threads will stay 
> blocked forever.

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira

Reply via email to