You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@hbase.apache.org by "Jeffrey Zhong (JIRA)" <ji...@apache.org> on 2012/12/19 00:46:12 UTC

[jira] [Created] (HBASE-7384) Introduing waitForCondition function into test cases

Jeffrey Zhong created HBASE-7384:
------------------------------------

             Summary: Introduing 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


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