[ https://issues.apache.org/jira/browse/HBASE-7384?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13540729#comment-13540729 ]
Jeffrey Zhong commented on HBASE-7384: -------------------------------------- Thanks Ted for reviewing. I've incorporated your feedbacks into a new patch and submitted it into review board for easily reviewing. https://reviews.apache.org/r/8772/ > Introducing waitForCondition function into test cases > ----------------------------------------------------- > > Key: HBASE-7384 > URL: https://issues.apache.org/jira/browse/HBASE-7384 > Project: HBase > Issue Type: Test > Components: test > Reporter: Jeffrey Zhong > Assignee: Jeffrey Zhong > Labels: test > Fix For: 0.96.0 > > Attachments: hbase-7384_1.0.patch, hbase-7384.patch, Waiter.java > > > Recently I'm working on flaky test cases and found we have many places using > while loop and sleep to wait for a condition to be true. There are several > issues in existing ways: > 1) Many similar code doing the same thing > 2) When time out happens, different errors are reported without explicitly > indicating a time out situation > 3) When we want to increase the max timeout value to verify if a test case > fails due to a not-enough time out value, we have to recompile & redeploy code > I propose to create a waitForCondition function as a test utility function > like the following: > {code} > public interface WaitCheck { > public boolean Check() ; > } > public boolean waitForCondition(int timeOutInMilliSeconds, int > checkIntervalInMilliSeconds, WaitCheck s) > throws InterruptedException { > int multiplier = 1; > String multiplierProp = System.getProperty("extremeWaitMultiplier"); > if(multiplierProp != null) { > multiplier = Integer.parseInt(multiplierProp); > if(multiplier < 1) { > LOG.warn(String.format("Invalid extremeWaitMultiplier > property value:%s. is ignored.", multiplierProp)); > multiplier = 1; > } > } > int timeElapsed = 0; > while(timeElapsed < timeOutInMilliSeconds * multiplier) { > if(s.Check()) { > return true; > } > Thread.sleep(checkIntervalInMilliSeconds); > timeElapsed += checkIntervalInMilliSeconds; > } > assertTrue("WaitForCondition failed due to time out(" + > timeOutInMilliSeconds + " milliseconds expired)", > false); > return false; > } > {code} > By doing the above way, there are several advantages: > 1) Clearly report time out error when such situation happens > 2) Use System property extremeWaitMultiplier to increase max time out > dynamically for a quick verification > 3) Standardize current wait situations > Pleas let me know what your thoughts on this. > Thanks, > -Jeffrey -- 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