[ 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)