Repository: incubator-geode Updated Branches: refs/heads/GEODE-409 [created] ec307d2cb
GEODE-408: Fixed race condition in tests - For local functions stats might be checked before they are actually updated. Project: http://git-wip-us.apache.org/repos/asf/incubator-geode/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-geode/commit/ec307d2c Tree: http://git-wip-us.apache.org/repos/asf/incubator-geode/tree/ec307d2c Diff: http://git-wip-us.apache.org/repos/asf/incubator-geode/diff/ec307d2c Branch: refs/heads/GEODE-409 Commit: ec307d2cb3e6c21fe04abf8a000189e5dd2fcafe Parents: 5c7bbd0 Author: Jens Deppe <[email protected]> Authored: Wed Oct 21 14:01:40 2015 -0700 Committer: Jens Deppe <[email protected]> Committed: Wed Oct 21 16:02:33 2015 -0700 ---------------------------------------------------------------------- .../cache/execute/FunctionServiceStats.java | 3 +- .../execute/FunctionServiceStatsDUnitTest.java | 43 ++++++++++++++++++-- 2 files changed, 40 insertions(+), 6 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/ec307d2c/gemfire-core/src/main/java/com/gemstone/gemfire/internal/cache/execute/FunctionServiceStats.java ---------------------------------------------------------------------- diff --git a/gemfire-core/src/main/java/com/gemstone/gemfire/internal/cache/execute/FunctionServiceStats.java b/gemfire-core/src/main/java/com/gemstone/gemfire/internal/cache/execute/FunctionServiceStats.java index 26ebf5e..f491f7d 100644 --- a/gemfire-core/src/main/java/com/gemstone/gemfire/internal/cache/execute/FunctionServiceStats.java +++ b/gemfire-core/src/main/java/com/gemstone/gemfire/internal/cache/execute/FunctionServiceStats.java @@ -13,7 +13,6 @@ import com.gemstone.gemfire.StatisticsFactory; import com.gemstone.gemfire.StatisticsType; import com.gemstone.gemfire.StatisticsTypeFactory; import com.gemstone.gemfire.distributed.internal.DistributionStats; -import com.gemstone.gemfire.internal.NanoTimer; import com.gemstone.gemfire.internal.StatisticsTypeFactoryImpl; public class FunctionServiceStats { @@ -406,7 +405,7 @@ public class FunctionServiceStats { // Increment function execution with haveResult = true complete processing time this._stats.incLong(_functionExecutionsHasResultCompletedProcessingTimeId, elapsed); } - + } /** http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/ec307d2c/gemfire-core/src/test/java/com/gemstone/gemfire/internal/cache/execute/FunctionServiceStatsDUnitTest.java ---------------------------------------------------------------------- diff --git a/gemfire-core/src/test/java/com/gemstone/gemfire/internal/cache/execute/FunctionServiceStatsDUnitTest.java b/gemfire-core/src/test/java/com/gemstone/gemfire/internal/cache/execute/FunctionServiceStatsDUnitTest.java index 20b1e00..3cf714d 100644 --- a/gemfire-core/src/test/java/com/gemstone/gemfire/internal/cache/execute/FunctionServiceStatsDUnitTest.java +++ b/gemfire-core/src/test/java/com/gemstone/gemfire/internal/cache/execute/FunctionServiceStatsDUnitTest.java @@ -155,7 +155,26 @@ public class FunctionServiceStatsDUnitTest extends PRClientServerTestBase{ return Boolean.TRUE; } }; - + + /* + * This helper method prevents race conditions in local functions. Typically, when + * calling ResultCollector.getResult() one might expect the function to have completed. + * For local functions this is true, however, at this point the function stats may + * not have been updated yet thus any code which checks stats after calling getResult() + * may get wrong data. + */ + private void waitNoFunctionsRunning(FunctionServiceStats stats) { + int count = 100; + while (stats.getFunctionExecutionsRunning() > 0 && count > 0) { + count--; + try { + Thread.sleep(50); + } catch (InterruptedException ex) { + // Ignored + } + } + } + /* * 1-client 3-Servers * Function : TEST_FUNCTION2 @@ -250,6 +269,8 @@ public class FunctionServiceStatsDUnitTest extends PRClientServerTestBase{ InternalDistributedSystem iDS = (InternalDistributedSystem)cache.getDistributedSystem(); FunctionServiceStats functionServiceStats = iDS .getFunctionServiceStats(); + waitNoFunctionsRunning(functionServiceStats); + assertEquals(noOfExecutionCalls_Aggregate, functionServiceStats .getFunctionExecutionCalls()); assertEquals(noOfExecutionsCompleted_Aggregate, functionServiceStats @@ -286,7 +307,9 @@ public class FunctionServiceStatsDUnitTest extends PRClientServerTestBase{ .getDistributedSystem(); FunctionServiceStats functionServiceStats = iDS .getFunctionServiceStats(); - //functions are executed 3 times + waitNoFunctionsRunning(functionServiceStats); + + //functions are executed 3 times noOfExecutionCalls_Aggregate +=3; assertTrue(functionServiceStats .getFunctionExecutionCalls() >= noOfExecutionCalls_Aggregate); @@ -507,7 +530,8 @@ public class FunctionServiceStatsDUnitTest extends PRClientServerTestBase{ .getDistributedSystem(); FunctionServiceStats functionServiceStats = iDS .getFunctionServiceStats(); - + waitNoFunctionsRunning(functionServiceStats); + assertEquals(noOfExecutionCalls_Aggregate, functionServiceStats .getFunctionExecutionCalls()); assertEquals(noOfExecutionsCompleted_Aggregate, functionServiceStats @@ -609,6 +633,8 @@ public class FunctionServiceStatsDUnitTest extends PRClientServerTestBase{ .getDistributedSystem(); FunctionServiceStats functionServiceStats = iDS .getFunctionServiceStats(); + waitNoFunctionsRunning(functionServiceStats); + assertEquals(noOfExecutionCalls_Aggregate, functionServiceStats .getFunctionExecutionCalls()); assertEquals(noOfExecutionsCompleted_Aggregate, functionServiceStats @@ -646,6 +672,8 @@ public class FunctionServiceStatsDUnitTest extends PRClientServerTestBase{ .getDistributedSystem(); FunctionServiceStats functionServiceStats = iDS .getFunctionServiceStats(); + waitNoFunctionsRunning(functionServiceStats); + // functions are executed 2 times noOfExecutionCalls_Aggregate += 2; assertEquals(noOfExecutionCalls_Aggregate, functionServiceStats @@ -827,6 +855,8 @@ public class FunctionServiceStatsDUnitTest extends PRClientServerTestBase{ InternalDistributedSystem iDS = ((InternalDistributedSystem)getCache() .getDistributedSystem()); FunctionServiceStats functionServiceStats = iDS.getFunctionServiceStats(); + waitNoFunctionsRunning(functionServiceStats); + assertEquals(noOfExecutionCalls_Aggregate, functionServiceStats .getFunctionExecutionCalls()); assertEquals(noOfExecutionsCompleted_Aggregate, functionServiceStats @@ -860,6 +890,8 @@ public class FunctionServiceStatsDUnitTest extends PRClientServerTestBase{ .getDistributedSystem()); //3 Function Executions took place FunctionServiceStats functionServiceStats = iDS.getFunctionServiceStats(); + waitNoFunctionsRunning(functionServiceStats); + noOfExecutionCalls_Aggregate += 3; noOfExecutionsCompleted_Aggregate += 3; assertEquals(noOfExecutionCalls_Aggregate, functionServiceStats @@ -1119,7 +1151,8 @@ public class FunctionServiceStatsDUnitTest extends PRClientServerTestBase{ "checkFunctionExecutionStatsForMember1") { public Object call() throws Exception { FunctionServiceStats functionServiceStats = ds.getFunctionServiceStats(); - + waitNoFunctionsRunning(functionServiceStats); + assertEquals(noOfExecutionCalls_Aggregate, functionServiceStats .getFunctionExecutionCalls()); assertEquals(noOfExecutionsCompleted_Aggregate, functionServiceStats @@ -1140,6 +1173,8 @@ public class FunctionServiceStatsDUnitTest extends PRClientServerTestBase{ "checkFunctionExecutionStatsForOtherMember") { public Object call() throws Exception { FunctionServiceStats functionServiceStats = ds.getFunctionServiceStats(); + waitNoFunctionsRunning(functionServiceStats); + // One function Execution took place on there members //noOfExecutionCalls_Aggregate++; //noOfExecutionsCompleted_Aggregate++;
