[
https://issues.apache.org/jira/browse/DIRMINA-994?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Emmanuel Lecharny resolved DIRMINA-994.
---------------------------------------
Resolution: Fixed
Fixed with http://git-wip-us.apache.org/repos/asf/mina/commit/f1972fc3
We now check the cancel() method return before adding the future to the list of
cancelled ones.
> The ConnectionRequest.cancel() method is inconsistent wrt concurrent access
> ---------------------------------------------------------------------------
>
> Key: DIRMINA-994
> URL: https://issues.apache.org/jira/browse/DIRMINA-994
> Project: MINA
> Issue Type: Bug
> Affects Versions: 2.0.9
> Reporter: Emmanuel Lecharny
> Priority: Critical
> Fix For: 2.0.10
>
>
> When we call the ConnectionRequest.cancel() method, it does :
> {code}
> public void cancel() {
> if (!isDone()) {
> super.cancel();
> cancelQueue.add(this);
> startupWorker();
> wakeup();
> }
> {code}
> The problem is that the isDone() method is :
> {code}
> public boolean isDone() {
> synchronized (lock) {
> return ready;
> }
> }
> {code}
> and the super.cancel() method is :
> {code}
> public void cancel() {
> setValue(CANCELED);
> }
> {code}
> with the setValue() method :
> {code}
> public void setValue(Object newValue) {
> synchronized (lock) {
> // Allowed only once.
> if (ready) {
> return;
> }
> result = newValue;
> ready = true;
> ...
> {code}
> At this point, we may have the 'ready' flag set to false, enter into the
> super.cancel() method, and have the 'ready' flag set to true when we check it
> again, but still we will add the current connectRequest into the cancel
> queue, when we should not.
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)