[
https://issues.apache.org/jira/browse/HBASE-14222?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14702396#comment-14702396
]
Heng Chen commented on HBASE-14222:
-----------------------------------
I think the more simple way to fix is add another check in sync block of
{{stopAndDrainOps}}. just like
{code}
private void stopAndDrainOps(boolean ignoreRepeatedCalls) throws
InterruptedException {
long oldValAndFlags;
do {
....
} while (!valueAndFlags.compareAndSet(oldValAndFlags, dec(oldValAndFlags) |
DRAINING_FLAG));
if (getValue(oldValAndFlags) == 1) return; // There were no operations
outstanding.
synchronized (this) {
if (getValue(oldValAndFlags) == 1) return; // check once again
this.wait();
}
}
{code}
> Improve DrainBarrier
> --------------------
>
> Key: HBASE-14222
> URL: https://issues.apache.org/jira/browse/HBASE-14222
> Project: HBase
> Issue Type: Bug
> Components: util
> Reporter: Hiroshi Ikeda
> Assignee: Hiroshi Ikeda
> Priority: Minor
> Attachments: HBASE-14222-V2.patch, HBASE-14222.patch
>
>
> 1. {{DrainBarrier.stopAndDrainOps}} may wait forever if
> {{DrainBarrier.endOp}} changes its state and calls {{Object.notifyAll}} just
> before {{stopAndDrainOps}} enters the synchronized block to call
> {{Object.wait}}. Moreover, {{Object.wait}} may wake up false-positively, and
> {{stopAndDrainOps}} may break the block before outstanding operations are
> complete.
> 2. Some tests for {{DrainBarrier}} catch and ignore {{AssertionError}}
> explicitly thrown JUnit's {{fail}} method.
> The implementation of {{DrainBarrier}} is a little complex, and I'll fix and
> refactor it.
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)