This is an automated email from the ASF dual-hosted git repository. jbarrett pushed a commit to branch develop in repository https://gitbox.apache.org/repos/asf/geode-benchmarks.git
The following commit(s) were added to refs/heads/develop by this push: new e45a12f Stabilizes function benchmarks (#101) e45a12f is described below commit e45a12f024886bffeed42cec7c77f3a997d9e8d2 Author: Jacob Barrett <jbarr...@pivotal.io> AuthorDate: Tue Aug 27 16:29:42 2019 -0700 Stabilizes function benchmarks (#101) * New LongRange object for managing ranges of longs. * Only get 1 value. * Balanced CPU utilization and threads. --- geode-benchmarks/build.gradle | 1 - .../benchmark/geode/data/BenchmarkFunction.java | 34 ++--- .../geode/data/FunctionWithArguments.java | 27 +--- .../benchmark/geode/data/FunctionWithFilter.java | 24 ++-- .../benchmark/tasks/ExecuteFilteredFunction.java | 47 ++----- .../geode/benchmark/tasks/ExecuteFunction.java | 35 +---- .../tasks/ExecuteParameterizedFunction.java | 42 ++---- .../org/apache/geode/benchmark/tasks/GetTask.java | 12 +- .../org/apache/geode/benchmark/tasks/OQLQuery.java | 8 +- .../geode/benchmark/tasks/PrePopulateRegion.java | 88 ++++-------- .../apache/geode/benchmark/tasks/PutAllTask.java | 10 +- .../org/apache/geode/benchmark/tasks/PutTask.java | 10 +- .../geode/benchmark/tasks/RegisterFunction.java} | 34 ++--- ...nchmark.java => AbstractFunctionBenchmark.java} | 22 +-- .../AbstractPartitionedFunctionBenchmark.java | 25 +--- .../tests/AbstractReplicatedFunctionBenchmark.java | 25 +--- .../PartitionedFunctionExecutionBenchmark.java | 7 +- ...nedFunctionExecutionWithArgumentsBenchmark.java | 8 +- ...ionedFunctionExecutionWithFiltersBenchmark.java | 8 +- .../benchmark/tests/PartitionedGetBenchmark.java | 5 +- .../tests/PartitionedIndexedQueryBenchmark.java | 7 +- .../tests/PartitionedNonIndexedQueryBenchmark.java | 7 +- .../tests/PartitionedPutAllBenchmark.java | 5 +- .../benchmark/tests/PartitionedPutBenchmark.java | 5 +- .../ReplicatedFunctionExecutionBenchmark.java | 7 +- ...tedFunctionExecutionWithArgumentsBenchmark.java | 8 +- ...catedFunctionExecutionWithFiltersBenchmark.java | 8 +- .../benchmark/tests/ReplicatedGetBenchmark.java | 5 +- .../tests/ReplicatedIndexedQueryBenchmark.java | 7 +- .../tests/ReplicatedNonIndexedQueryBenchmark.java | 5 +- .../benchmark/tests/ReplicatedPutAllBenchmark.java | 5 +- .../benchmark/tests/ReplicatedPutBenchmark.java | 5 +- .../benchmark/tasks/PrePopulateRegionTest.java | 12 +- .../PartitionedFunctionExecutionBenchmarkTest.java | 4 +- ...unctionExecutionWithArgumentsBenchmarkTest.java | 4 +- ...dFunctionExecutionWithFiltersBenchmarkTest.java | 8 +- .../tests/PartitionedGetBenchmarkTest.java | 3 +- .../PartitionedIndexedQueryBenchmarkTest.java | 3 +- .../PartitionedNonIndexedQueryBenchmarkTest.java | 3 +- .../tests/PartitionedPutBenchmarkTest.java | 3 +- .../ReplicatedFunctionExecutionBenchmarkTest.java | 4 +- ...unctionExecutionWithArgumentsBenchmarkTest.java | 4 +- ...dFunctionExecutionWithFiltersBenchmarkTest.java | 4 +- .../tests/ReplicatedGetBenchmarkTest.java | 3 +- .../tests/ReplicatedIndexedQueryBenchmarkTest.java | 3 +- .../ReplicatedNonIndexedQueryBenchmarkTest.java | 3 +- .../tests/ReplicatedPutBenchmarkTest.java | 3 +- .../java/org/apache/geode/benchmark/LongRange.java | 148 +++++++++++++++++++++ .../org/apache/geode/benchmark/LongRangeTest.java | 114 ++++++++++++++++ 49 files changed, 471 insertions(+), 401 deletions(-) diff --git a/geode-benchmarks/build.gradle b/geode-benchmarks/build.gradle index fad80d1..7fd5422 100644 --- a/geode-benchmarks/build.gradle +++ b/geode-benchmarks/build.gradle @@ -62,7 +62,6 @@ task benchmark(type: Test) { testLogging { exceptionFormat = 'full' } exclude "**/Replicated*QueryBenchmark.class" - exclude "**/ReplicatedFunctionExecution*Benchmark.class" exclude "**/PartitionedNonIndexedQueryBenchmark.class" exclude "**/*PutAllBenchmark.class" diff --git a/geode-benchmarks/src/main/java/benchmark/geode/data/BenchmarkFunction.java b/geode-benchmarks/src/main/java/benchmark/geode/data/BenchmarkFunction.java index b5157cd..29a74f6 100644 --- a/geode-benchmarks/src/main/java/benchmark/geode/data/BenchmarkFunction.java +++ b/geode-benchmarks/src/main/java/benchmark/geode/data/BenchmarkFunction.java @@ -12,44 +12,34 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ + package benchmark.geode.data; -import java.util.ArrayList; -import java.util.List; +import org.apache.geode.benchmark.LongRange; import org.apache.geode.cache.Region; import org.apache.geode.cache.execute.Function; import org.apache.geode.cache.execute.FunctionContext; import org.apache.geode.cache.execute.RegionFunctionContext; -public class BenchmarkFunction implements Function { - private long maxKey; - private long minKey; +public class BenchmarkFunction implements Function<Void> { + private final LongRange range; - public BenchmarkFunction(long minKey, long maxKey) { - this.maxKey = maxKey; - this.minKey = minKey; + public BenchmarkFunction(final LongRange range) { + this.range = range; } @Override - public void execute(FunctionContext context) { - RegionFunctionContext regionFunctionContext = (RegionFunctionContext) context; - Region region = regionFunctionContext.getDataSet(); - List<Long> results = new ArrayList<>(); - - for (long i = minKey; i <= maxKey; i++) { - Portfolio portfolio = (Portfolio) region.get(i); - if (portfolio != null) { - results.add(portfolio.getID()); - } - } - - context.getResultSender().lastResult(results); + public void execute(final FunctionContext<Void> context) { + final RegionFunctionContext regionFunctionContext = (RegionFunctionContext) context; + final Region<Long, Portfolio> region = regionFunctionContext.getDataSet(); + final Long key = range.random(); + context.getResultSender().lastResult(region.get(key)); } @Override public String getId() { - return "BenchmarkFunction"; + return BenchmarkFunction.class.getName(); } @Override diff --git a/geode-benchmarks/src/main/java/benchmark/geode/data/FunctionWithArguments.java b/geode-benchmarks/src/main/java/benchmark/geode/data/FunctionWithArguments.java index 2d53ab6..8a10f1d 100644 --- a/geode-benchmarks/src/main/java/benchmark/geode/data/FunctionWithArguments.java +++ b/geode-benchmarks/src/main/java/benchmark/geode/data/FunctionWithArguments.java @@ -14,9 +14,6 @@ */ package benchmark.geode.data; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; import org.apache.geode.cache.Region; import org.apache.geode.cache.execute.Function; @@ -24,29 +21,15 @@ import org.apache.geode.cache.execute.FunctionContext; import org.apache.geode.cache.execute.RegionFunctionContext; public class FunctionWithArguments implements Function { - private long maxKey; - private long minKey; public FunctionWithArguments() {} @Override - public void execute(FunctionContext context) { - RegionFunctionContext regionFunctionContext = (RegionFunctionContext) context; - Region region = regionFunctionContext.getDataSet(); - HashMap<String, Long> argumentsMap = - (HashMap<String, Long>) regionFunctionContext.getArguments(); - maxKey = argumentsMap.get("maxID"); - minKey = argumentsMap.get("minID"); - List<Long> results = new ArrayList<>(); - - for (long i = minKey; i <= maxKey; i++) { - Portfolio portfolio = (Portfolio) region.get(i); - if (portfolio != null) { - results.add(portfolio.getID()); - } - } - - context.getResultSender().lastResult(results); + public void execute(final FunctionContext context) { + final RegionFunctionContext regionFunctionContext = (RegionFunctionContext) context; + final Region region = regionFunctionContext.getDataSet(); + final Long key = (Long) regionFunctionContext.getArguments(); + context.getResultSender().lastResult(region.get(key)); } @Override diff --git a/geode-benchmarks/src/main/java/benchmark/geode/data/FunctionWithFilter.java b/geode-benchmarks/src/main/java/benchmark/geode/data/FunctionWithFilter.java index 4b0ff5e..ccc3888 100644 --- a/geode-benchmarks/src/main/java/benchmark/geode/data/FunctionWithFilter.java +++ b/geode-benchmarks/src/main/java/benchmark/geode/data/FunctionWithFilter.java @@ -14,8 +14,6 @@ */ package benchmark.geode.data; -import java.util.ArrayList; -import java.util.List; import java.util.Set; import org.apache.geode.cache.Region; @@ -28,20 +26,14 @@ public class FunctionWithFilter implements Function { public FunctionWithFilter() {} @Override - public void execute(FunctionContext context) { - RegionFunctionContext regionFunctionContext = (RegionFunctionContext) context; - Region region = regionFunctionContext.getDataSet(); - Set filterKeys = regionFunctionContext.getFilter(); - List<Long> results = new ArrayList<>(); - - filterKeys.stream().forEach(key -> { - Portfolio portfolio = (Portfolio) region.get(key); - if (portfolio != null) { - results.add(portfolio.getID()); - } - }); - - context.getResultSender().lastResult(results); + public void execute(final FunctionContext context) { + final RegionFunctionContext regionFunctionContext = (RegionFunctionContext) context; + final Region<Long, Portfolio> region = regionFunctionContext.getDataSet(); + @SuppressWarnings("unchecked") + final Set<Long> filterKeys = (Set<Long>) regionFunctionContext.getFilter(); + final Long key = filterKeys.iterator().next(); + + context.getResultSender().lastResult(region.get(key)); } @Override diff --git a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tasks/ExecuteFilteredFunction.java b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tasks/ExecuteFilteredFunction.java index 2bb7b17..746682f 100644 --- a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tasks/ExecuteFilteredFunction.java +++ b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tasks/ExecuteFilteredFunction.java @@ -15,38 +15,31 @@ package org.apache.geode.benchmark.tasks; import java.io.Serializable; -import java.rmi.UnexpectedException; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; +import java.util.Collections; import java.util.Map; import java.util.Set; -import java.util.concurrent.ThreadLocalRandom; import benchmark.geode.data.FunctionWithFilter; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import org.yardstickframework.BenchmarkConfiguration; import org.yardstickframework.BenchmarkDriverAdapter; +import org.apache.geode.benchmark.LongRange; import org.apache.geode.cache.Region; import org.apache.geode.cache.client.ClientCache; import org.apache.geode.cache.client.ClientCacheFactory; import org.apache.geode.cache.execute.Function; import org.apache.geode.cache.execute.FunctionService; import org.apache.geode.cache.execute.ResultCollector; -import org.apache.geode.perftest.jvms.RemoteJVMFactory; public class ExecuteFilteredFunction extends BenchmarkDriverAdapter implements Serializable { + + private final LongRange keyRange; + private final Function function; + private Region region; - long keyRange; - long filterRange; - private Function function; - private static final Logger logger = LoggerFactory.getLogger(RemoteJVMFactory.class); - public ExecuteFilteredFunction(long keyRange, long filterRange) { + public ExecuteFilteredFunction(final LongRange keyRange) { this.keyRange = keyRange; - this.filterRange = filterRange; this.function = new FunctionWithFilter(); } @@ -59,33 +52,15 @@ public class ExecuteFilteredFunction extends BenchmarkDriverAdapter implements S } @Override - public boolean test(Map<Object, Object> ctx) throws Exception { - long minId = ThreadLocalRandom.current().nextLong(0, this.keyRange - filterRange); - long maxId = minId + filterRange; - Set<Long> filterSet = new HashSet<>(); - for (long i = minId; i <= maxId; i++) { - filterSet.add(i); - } - ResultCollector resultCollector = FunctionService + public boolean test(Map<Object, Object> ctx) { + final Set<Long> filterSet = Collections.singleton(keyRange.random()); + final ResultCollector resultCollector = FunctionService .onRegion(region) .withFilter(filterSet) .execute(function); - List results = (List) resultCollector.getResult(); - validateResults(results, minId, maxId); + resultCollector.getResult(); return true; } - private void validateResults(List results, long minId, long maxId) - throws UnexpectedException { - for (Object result : results) { - ArrayList<Long> IDs = (ArrayList<Long>) result; - for (Long id : IDs) { - if (id < minId || id > maxId) { - throw new UnexpectedException("Invalid ID value received [minID = " + minId + " maxID = " - + maxId + " ] Portfolio ID received = " + id); - } - } - } - } } diff --git a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tasks/ExecuteFunction.java b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tasks/ExecuteFunction.java index 3106758..51c30de 100644 --- a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tasks/ExecuteFunction.java +++ b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tasks/ExecuteFunction.java @@ -15,11 +15,7 @@ package org.apache.geode.benchmark.tasks; import java.io.Serializable; -import java.rmi.UnexpectedException; -import java.util.ArrayList; -import java.util.List; import java.util.Map; -import java.util.concurrent.ThreadLocalRandom; import benchmark.geode.data.BenchmarkFunction; import org.yardstickframework.BenchmarkConfiguration; @@ -28,19 +24,13 @@ import org.yardstickframework.BenchmarkDriverAdapter; import org.apache.geode.cache.Region; import org.apache.geode.cache.client.ClientCache; import org.apache.geode.cache.client.ClientCacheFactory; -import org.apache.geode.cache.execute.Function; import org.apache.geode.cache.execute.FunctionService; -import org.apache.geode.cache.execute.ResultCollector; public class ExecuteFunction extends BenchmarkDriverAdapter implements Serializable { + private Region region; - long keyRange; - long functionIDRange; - public ExecuteFunction(long keyRange, long functionIDRange) { - this.keyRange = keyRange; - this.functionIDRange = functionIDRange; - } + public ExecuteFunction() {} @Override public void setUp(BenchmarkConfiguration cfg) throws Exception { @@ -50,26 +40,9 @@ public class ExecuteFunction extends BenchmarkDriverAdapter implements Serializa } @Override - public boolean test(Map<Object, Object> ctx) throws Exception { - long minId = ThreadLocalRandom.current().nextLong(0, this.keyRange - functionIDRange); - long maxId = minId + functionIDRange; - Function function = new BenchmarkFunction(minId, maxId); - FunctionService.registerFunction(function); - ResultCollector resultCollector = FunctionService.onRegion(region).execute(function); - List results = (List) resultCollector.getResult(); - validateResults(results, minId, maxId); + public boolean test(final Map<Object, Object> ctx) { + FunctionService.onRegion(region).execute(BenchmarkFunction.class.getName()).getResult(); return true; } - private void validateResults(List results, long minId, long maxId) throws UnexpectedException { - for (Object result : results) { - ArrayList<Long> IDs = (ArrayList<Long>) result; - for (Long id : IDs) { - if (id < minId || id > maxId) { - throw new UnexpectedException("Invalid ID values received [min ID=" + minId + ",max ID=" - + maxId + "] Portfolio ID received=" + id); - } - } - } - } } diff --git a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tasks/ExecuteParameterizedFunction.java b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tasks/ExecuteParameterizedFunction.java index a965eab..e2353f1 100644 --- a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tasks/ExecuteParameterizedFunction.java +++ b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tasks/ExecuteParameterizedFunction.java @@ -15,17 +15,13 @@ package org.apache.geode.benchmark.tasks; import java.io.Serializable; -import java.rmi.UnexpectedException; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; import java.util.Map; -import java.util.concurrent.ThreadLocalRandom; import benchmark.geode.data.FunctionWithArguments; import org.yardstickframework.BenchmarkConfiguration; import org.yardstickframework.BenchmarkDriverAdapter; +import org.apache.geode.benchmark.LongRange; import org.apache.geode.cache.Region; import org.apache.geode.cache.client.ClientCache; import org.apache.geode.cache.client.ClientCacheFactory; @@ -35,15 +31,14 @@ import org.apache.geode.cache.execute.ResultCollector; public class ExecuteParameterizedFunction extends BenchmarkDriverAdapter implements Serializable { + private final LongRange keyRange; + private final Function function; + private Region region; - long keyRange; - long functionIDRange; - private Function function; - public ExecuteParameterizedFunction(long keyRange, long functionIDRange) { + public ExecuteParameterizedFunction(final LongRange keyRange) { this.keyRange = keyRange; - this.functionIDRange = functionIDRange; - this.function = new FunctionWithArguments(); + function = new FunctionWithArguments(); } @Override @@ -55,32 +50,13 @@ public class ExecuteParameterizedFunction extends BenchmarkDriverAdapter impleme } @Override - public boolean test(Map<Object, Object> ctx) throws Exception { - long minId = ThreadLocalRandom.current().nextLong(0, this.keyRange - functionIDRange); - long maxId = minId + functionIDRange; - Map<String, Long> argumentMap = new HashMap<>(); - argumentMap.put("maxID", maxId); - argumentMap.put("minID", minId); + public boolean test(Map<Object, Object> ctx) { ResultCollector resultCollector = FunctionService .onRegion(region) - .setArguments(argumentMap) + .setArguments(keyRange.random()) .execute(function); - List results = (List) resultCollector.getResult(); - validateResults(results, minId, maxId); + resultCollector.getResult(); return true; } - - private void validateResults(List results, long minId, long maxId) - throws UnexpectedException { - for (Object result : results) { - ArrayList<Long> IDs = (ArrayList<Long>) result; - for (Long id : IDs) { - if (id < minId || id > maxId) { - throw new UnexpectedException("Invalid ID value received [minID= " + minId - + " maxID= " + maxId + " ] Portfolio ID received = " + id); - } - } - } - } } diff --git a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tasks/GetTask.java b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tasks/GetTask.java index 090dca6..ec55f40 100644 --- a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tasks/GetTask.java +++ b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tasks/GetTask.java @@ -19,11 +19,11 @@ package org.apache.geode.benchmark.tasks; import java.io.Serializable; import java.util.Map; -import java.util.concurrent.ThreadLocalRandom; import org.yardstickframework.BenchmarkConfiguration; import org.yardstickframework.BenchmarkDriverAdapter; +import org.apache.geode.benchmark.LongRange; import org.apache.geode.cache.Region; import org.apache.geode.cache.client.ClientCache; import org.apache.geode.cache.client.ClientCacheFactory; @@ -34,23 +34,25 @@ import org.apache.geode.cache.client.ClientCacheFactory; */ public class GetTask extends BenchmarkDriverAdapter implements Serializable { + private final LongRange keyRange; + private Region<Object, Object> region; - private long keyRange; - public GetTask(long keyRange) { + public GetTask(LongRange keyRange) { this.keyRange = keyRange; } @Override public void setUp(BenchmarkConfiguration cfg) throws Exception { super.setUp(cfg); - ClientCache cache = ClientCacheFactory.getAnyInstance(); + + final ClientCache cache = ClientCacheFactory.getAnyInstance(); region = cache.getRegion("region"); } @Override public boolean test(Map<Object, Object> ctx) throws Exception { - long key = ThreadLocalRandom.current().nextLong(0, this.keyRange); + final long key = keyRange.random(); region.get(key); return true; } diff --git a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tasks/OQLQuery.java b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tasks/OQLQuery.java index 3dc72e7..2a1a5a2 100644 --- a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tasks/OQLQuery.java +++ b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tasks/OQLQuery.java @@ -24,6 +24,7 @@ import org.slf4j.LoggerFactory; import org.yardstickframework.BenchmarkConfiguration; import org.yardstickframework.BenchmarkDriverAdapter; +import org.apache.geode.benchmark.LongRange; import org.apache.geode.cache.Region; import org.apache.geode.cache.client.ClientCache; import org.apache.geode.cache.client.ClientCacheFactory; @@ -38,11 +39,11 @@ import org.apache.geode.perftest.jvms.RemoteJVMFactory; public class OQLQuery extends BenchmarkDriverAdapter implements Serializable { private static final Logger logger = LoggerFactory.getLogger(RemoteJVMFactory.class); private Region<Object, Object> region; - private long keyRange; + private LongRange keyRange; private long queryRange; ClientCache cache; - public OQLQuery(long keyRange, long queryRange) { + public OQLQuery(LongRange keyRange, long queryRange) { this.keyRange = keyRange; this.queryRange = queryRange; } @@ -56,7 +57,8 @@ public class OQLQuery extends BenchmarkDriverAdapter implements Serializable { @Override public boolean test(Map<Object, Object> ctx) throws Exception { - long minId = ThreadLocalRandom.current().nextLong(0, this.keyRange - queryRange); + long minId = + ThreadLocalRandom.current().nextLong(keyRange.getMin(), keyRange.getMax() - queryRange); long maxId = minId + queryRange; SelectResults results = executeQuery(minId, maxId); diff --git a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tasks/PrePopulateRegion.java b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tasks/PrePopulateRegion.java index fd119c0..816fb1c 100644 --- a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tasks/PrePopulateRegion.java +++ b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tasks/PrePopulateRegion.java @@ -34,85 +34,57 @@ import benchmark.geode.data.Portfolio; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.apache.geode.benchmark.LongRange; import org.apache.geode.cache.Cache; import org.apache.geode.cache.Region; import org.apache.geode.perftest.Task; import org.apache.geode.perftest.TestContext; -import org.apache.geode.perftest.jvms.RemoteJVMFactory; public class PrePopulateRegion implements Task { - long keyRangeToPrepopulate = 10000; + private static final Logger logger = LoggerFactory.getLogger(PrePopulateRegion.class); + + private LongRange keyRangeToPrepopulate = new LongRange(0, 10000); private int batchSize = 1000; - private static final Logger logger = LoggerFactory.getLogger(RemoteJVMFactory.class); public PrePopulateRegion() {} - public PrePopulateRegion(long keyRangeToPrepopulate) { + public PrePopulateRegion(LongRange keyRangeToPrepopulate) { this.keyRangeToPrepopulate = keyRangeToPrepopulate; } /** - * This method prepopulates the region - * before the actual benchmark starts. - * + * This method prepopulates the region before the actual benchmark starts. */ @Override public void run(TestContext context) throws InterruptedException { - Cache serverCache = (Cache) context.getAttribute("SERVER_CACHE"); - Region<Long, Portfolio> region = serverCache.getRegion("region"); - int numLocators = context.getHostsIDsForRole(LOCATOR).size(); - int numServers = context.getHostsIDsForRole(SERVER).size(); - int jvmID = context.getJvmID(); + final Cache serverCache = (Cache) context.getAttribute("SERVER_CACHE"); + final Region<Long, Portfolio> region = serverCache.getRegion("region"); + final int numLocators = context.getHostsIDsForRole(LOCATOR).size(); + final int numServers = context.getHostsIDsForRole(SERVER).size(); + final int jvmID = context.getJvmID(); + final int serverIndex = jvmID - numLocators; - run(region, numLocators, numServers, jvmID); + run(region, keyRangeToPrepopulate.sliceFor(numServers, serverIndex)); } - void run(Map<Long, Portfolio> region, int numLocators, int numServers, int jvmID) - throws InterruptedException { - int serverIndex = jvmID - numLocators; - long numPutsPerServer = this.keyRangeToPrepopulate / numServers; - int numThreads = - numPutsPerServer < getBatchSize() ? 1 : Runtime.getRuntime().availableProcessors(); - - // calculate non-overlapping key ranges for each server - long lowBound = numPutsPerServer * serverIndex; - long highBound = numPutsPerServer * (serverIndex + 1); - if (serverIndex == (numServers - 1)) { - highBound += this.keyRangeToPrepopulate % (serverIndex + 1); - } - + void run(final Map<Long, Portfolio> region, final LongRange range) throws InterruptedException { logger.info("*******************************************"); logger.info(" Prepopulating the region "); logger.info("*******************************************"); - Instant start = Instant.now(); - - ExecutorService threadPool = Executors.newFixedThreadPool(numThreads); - List<CompletableFuture<Void>> futures = new ArrayList<>(); - - long range = highBound - lowBound; - long putsPerThread = range / numThreads; - - for (int i = 0; i < numThreads; i++) { - int threadNum = i; + final Instant start = Instant.now(); - Runnable putThread = () -> { - long low = lowBound + (putsPerThread * threadNum); - long high = low + putsPerThread; + final int numThreads = Runtime.getRuntime().availableProcessors(); + final ExecutorService threadPool = Executors.newFixedThreadPool(numThreads); + final List<CompletableFuture<Void>> futures = new ArrayList<>(); - if (threadNum == (numThreads - 1)) { - high += range % numThreads; - } - - doPuts(region, low, high); - }; - - futures.add(CompletableFuture.runAsync(putThread, threadPool)); + for (final LongRange slice : range.slice(numThreads)) { + futures.add(CompletableFuture.runAsync(() -> doPuts(region, slice), threadPool)); } futures.forEach(CompletableFuture::join); - Instant finish = Instant.now(); + final Instant finish = Instant.now(); logger.info("*******************************************"); logger.info(" Prepopulating the region completed"); logger.info(" Duration = " + Duration.between(start, finish).toMillis() + "ms."); @@ -122,20 +94,10 @@ public class PrePopulateRegion implements Task { threadPool.awaitTermination(5, TimeUnit.MINUTES); } - private void doPuts(Map<Long, Portfolio> region, long lowBound, long highBound) { - Map<Long, Portfolio> valueMap = new HashMap<>(); - for (long putIndex = lowBound; putIndex < highBound; putIndex++) { - // build a map of to put to the server - - valueMap.put(putIndex, new Portfolio(putIndex)); - - if (putIndex % getBatchSize() == 0) { - region.putAll(valueMap); - valueMap = new HashMap<>(); - } - } - - if (!valueMap.isEmpty()) { + private void doPuts(final Map<Long, Portfolio> region, final LongRange range) { + for (final LongRange slice : range.slicesOfSize(batchSize)) { + final Map<Long, Portfolio> valueMap = new HashMap<>(); + slice.forEach(i -> valueMap.put(i, new Portfolio(i))); region.putAll(valueMap); } } diff --git a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tasks/PutAllTask.java b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tasks/PutAllTask.java index 67b30c6..8b2b729 100644 --- a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tasks/PutAllTask.java +++ b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tasks/PutAllTask.java @@ -20,24 +20,24 @@ package org.apache.geode.benchmark.tasks; import java.io.Serializable; import java.util.HashMap; import java.util.Map; -import java.util.concurrent.ThreadLocalRandom; import benchmark.geode.data.Portfolio; import org.yardstickframework.BenchmarkConfiguration; import org.yardstickframework.BenchmarkDriverAdapter; +import org.apache.geode.benchmark.LongRange; import org.apache.geode.cache.Region; import org.apache.geode.cache.client.ClientCache; import org.apache.geode.cache.client.ClientCacheFactory; public class PutAllTask extends BenchmarkDriverAdapter implements Serializable { - private final long keyRange; + private final LongRange keyRange; private final int batchSize; private Region<Object, Object> region; - public PutAllTask(long keyRange, int batchSize) { + public PutAllTask(LongRange keyRange, int batchSize) { this.keyRange = keyRange; this.batchSize = batchSize; } @@ -51,8 +51,8 @@ public class PutAllTask extends BenchmarkDriverAdapter implements Serializable { @Override public boolean test(Map<Object, Object> ctx) { - long key = ThreadLocalRandom.current().nextLong(0, this.keyRange); - HashMap<Object, Object> batch = new HashMap<>(batchSize); + final long key = keyRange.random(); + final HashMap<Object, Object> batch = new HashMap<>(batchSize); for (int i = 0; i < batchSize; i++) { batch.put(key, new Portfolio(key)); } diff --git a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tasks/PutTask.java b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tasks/PutTask.java index b077767..ae3aa98 100644 --- a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tasks/PutTask.java +++ b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tasks/PutTask.java @@ -19,12 +19,12 @@ package org.apache.geode.benchmark.tasks; import java.io.Serializable; import java.util.Map; -import java.util.concurrent.ThreadLocalRandom; import benchmark.geode.data.Portfolio; import org.yardstickframework.BenchmarkConfiguration; import org.yardstickframework.BenchmarkDriverAdapter; +import org.apache.geode.benchmark.LongRange; import org.apache.geode.cache.Region; import org.apache.geode.cache.client.ClientCache; import org.apache.geode.cache.client.ClientCacheFactory; @@ -33,9 +33,9 @@ public class PutTask extends BenchmarkDriverAdapter implements Serializable { private Region<Object, Object> region; - private long keyRange; + private LongRange keyRange; - public PutTask(long keyRange) { + public PutTask(LongRange keyRange) { this.keyRange = keyRange; } @@ -47,8 +47,8 @@ public class PutTask extends BenchmarkDriverAdapter implements Serializable { } @Override - public boolean test(Map<Object, Object> ctx) throws Exception { - long key = ThreadLocalRandom.current().nextLong(0, this.keyRange); + public boolean test(Map<Object, Object> ctx) { + long key = keyRange.random(); region.put(key, new Portfolio(key)); return true; } diff --git a/geode-benchmarks/src/test/java/org/apache/geode/benchmark/tests/ReplicatedPutBenchmarkTest.java b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tasks/RegisterFunction.java similarity index 51% copy from geode-benchmarks/src/test/java/org/apache/geode/benchmark/tests/ReplicatedPutBenchmarkTest.java copy to geode-benchmarks/src/main/java/org/apache/geode/benchmark/tasks/RegisterFunction.java index 0421d53..1fe888e 100644 --- a/geode-benchmarks/src/test/java/org/apache/geode/benchmark/tests/ReplicatedPutBenchmarkTest.java +++ b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tasks/RegisterFunction.java @@ -15,34 +15,24 @@ * limitations under the License. */ -package org.apache.geode.benchmark.tests; +package org.apache.geode.benchmark.tasks; -import java.io.File; -import java.nio.file.Path; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.junitpioneer.jupiter.TempDirectory; +import org.apache.geode.cache.execute.Function; +import org.apache.geode.cache.execute.FunctionService; +import org.apache.geode.perftest.Task; +import org.apache.geode.perftest.TestContext; -import org.apache.geode.perftest.TestRunners; +public class RegisterFunction implements Task { -@ExtendWith(TempDirectory.class) -public class ReplicatedPutBenchmarkTest { + private final Function<?> function; - private File folder; - - @BeforeEach - void createTemporaryFolder(@TempDirectory.TempDir Path tempFolder) { - folder = tempFolder.toFile(); + public RegisterFunction(final Function<?> function) { + this.function = function; } - @Test - public void benchmarkRunsSuccessfully() - throws Exception { - ReplicatedPutBenchmark test = new ReplicatedPutBenchmark(); - test.setKeyRange(100); - TestRunners.minimalRunner(folder) - .runTest(test); + @Override + public void run(TestContext context) throws InterruptedException { + FunctionService.registerFunction(function); } } diff --git a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/AbstractPartitionedFunctionBenchmark.java b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/AbstractFunctionBenchmark.java similarity index 72% copy from geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/AbstractPartitionedFunctionBenchmark.java copy to geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/AbstractFunctionBenchmark.java index 22800e7..5dcad0f 100644 --- a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/AbstractPartitionedFunctionBenchmark.java +++ b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/AbstractFunctionBenchmark.java @@ -18,32 +18,38 @@ package org.apache.geode.benchmark.tests; import static org.apache.geode.benchmark.topology.ClientServerTopology.Roles.CLIENT; import static org.apache.geode.benchmark.topology.ClientServerTopology.Roles.SERVER; +import benchmark.geode.data.BenchmarkFunction; + +import org.apache.geode.benchmark.LongRange; import org.apache.geode.benchmark.tasks.CreateClientProxyRegion; -import org.apache.geode.benchmark.tasks.CreatePartitionedRegion; import org.apache.geode.benchmark.tasks.PrePopulateRegion; +import org.apache.geode.benchmark.tasks.RegisterFunction; import org.apache.geode.benchmark.topology.ClientServerTopology; import org.apache.geode.perftest.PerformanceTest; import org.apache.geode.perftest.TestConfig; -abstract class AbstractPartitionedFunctionBenchmark implements PerformanceTest { - private long keyRange = 1000000; +abstract class AbstractFunctionBenchmark implements PerformanceTest { + private LongRange keyRange = new LongRange(0, 1000000); - public final void setKeyRange(long keyRange) { + public final void setKeyRange(LongRange keyRange) { this.keyRange = keyRange; } - public final long getKeyRange() { + public final LongRange getKeyRange() { return keyRange; } @Override public TestConfig configure() { TestConfig config = GeodeBenchmark.createConfig(); - config.threads(Runtime.getRuntime().availableProcessors() * 4); + config.threads(Runtime.getRuntime().availableProcessors() * 3); ClientServerTopology.configure(config); - config.before(new CreatePartitionedRegion(), SERVER); + configureRegion(config); config.before(new CreateClientProxyRegion(), CLIENT); - config.before(new PrePopulateRegion(keyRange), SERVER); + config.before(new PrePopulateRegion(getKeyRange()), SERVER); + config.before(new RegisterFunction(new BenchmarkFunction(getKeyRange())), SERVER); return config; } + + protected abstract void configureRegion(TestConfig config); } diff --git a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/AbstractPartitionedFunctionBenchmark.java b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/AbstractPartitionedFunctionBenchmark.java index 22800e7..fdbd166 100644 --- a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/AbstractPartitionedFunctionBenchmark.java +++ b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/AbstractPartitionedFunctionBenchmark.java @@ -15,35 +15,14 @@ package org.apache.geode.benchmark.tests; -import static org.apache.geode.benchmark.topology.ClientServerTopology.Roles.CLIENT; import static org.apache.geode.benchmark.topology.ClientServerTopology.Roles.SERVER; -import org.apache.geode.benchmark.tasks.CreateClientProxyRegion; import org.apache.geode.benchmark.tasks.CreatePartitionedRegion; -import org.apache.geode.benchmark.tasks.PrePopulateRegion; -import org.apache.geode.benchmark.topology.ClientServerTopology; -import org.apache.geode.perftest.PerformanceTest; import org.apache.geode.perftest.TestConfig; -abstract class AbstractPartitionedFunctionBenchmark implements PerformanceTest { - private long keyRange = 1000000; - - public final void setKeyRange(long keyRange) { - this.keyRange = keyRange; - } - - public final long getKeyRange() { - return keyRange; - } - +abstract class AbstractPartitionedFunctionBenchmark extends AbstractFunctionBenchmark { @Override - public TestConfig configure() { - TestConfig config = GeodeBenchmark.createConfig(); - config.threads(Runtime.getRuntime().availableProcessors() * 4); - ClientServerTopology.configure(config); + protected void configureRegion(TestConfig config) { config.before(new CreatePartitionedRegion(), SERVER); - config.before(new CreateClientProxyRegion(), CLIENT); - config.before(new PrePopulateRegion(keyRange), SERVER); - return config; } } diff --git a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/AbstractReplicatedFunctionBenchmark.java b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/AbstractReplicatedFunctionBenchmark.java index 4fb2676..6a9fa17 100644 --- a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/AbstractReplicatedFunctionBenchmark.java +++ b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/AbstractReplicatedFunctionBenchmark.java @@ -15,35 +15,14 @@ package org.apache.geode.benchmark.tests; -import static org.apache.geode.benchmark.topology.ClientServerTopology.Roles.CLIENT; import static org.apache.geode.benchmark.topology.ClientServerTopology.Roles.SERVER; -import org.apache.geode.benchmark.tasks.CreateClientProxyRegion; import org.apache.geode.benchmark.tasks.CreateReplicatedRegion; -import org.apache.geode.benchmark.tasks.PrePopulateRegion; -import org.apache.geode.benchmark.topology.ClientServerTopology; -import org.apache.geode.perftest.PerformanceTest; import org.apache.geode.perftest.TestConfig; -abstract class AbstractReplicatedFunctionBenchmark implements PerformanceTest { - private long keyRange = 1000000; - - public final void setKeyRange(long keyRange) { - this.keyRange = keyRange; - } - - public final long getKeyRange() { - return keyRange; - } - +abstract class AbstractReplicatedFunctionBenchmark extends AbstractFunctionBenchmark { @Override - public TestConfig configure() { - TestConfig config = GeodeBenchmark.createConfig(); - config.threads(Runtime.getRuntime().availableProcessors() * 4); - ClientServerTopology.configure(config); + protected void configureRegion(TestConfig config) { config.before(new CreateReplicatedRegion(), SERVER); - config.before(new CreateClientProxyRegion(), CLIENT); - config.before(new PrePopulateRegion(keyRange), SERVER); - return config; } } diff --git a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/PartitionedFunctionExecutionBenchmark.java b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/PartitionedFunctionExecutionBenchmark.java index 42756e5..0b964b6 100644 --- a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/PartitionedFunctionExecutionBenchmark.java +++ b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/PartitionedFunctionExecutionBenchmark.java @@ -23,11 +23,6 @@ import org.apache.geode.perftest.TestConfig; import org.apache.geode.perftest.TestRunners; public class PartitionedFunctionExecutionBenchmark extends AbstractPartitionedFunctionBenchmark { - private long functionIDRange = 1000; - - public void setFunctionIDRange(long functionIDRange) { - this.functionIDRange = functionIDRange; - } @Test public void run() throws Exception { @@ -37,7 +32,7 @@ public class PartitionedFunctionExecutionBenchmark extends AbstractPartitionedFu @Override public TestConfig configure() { TestConfig config = super.configure(); - config.workload(new ExecuteFunction(getKeyRange(), functionIDRange), CLIENT); + config.workload(new ExecuteFunction(), CLIENT); return config; } } diff --git a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/PartitionedFunctionExecutionWithArgumentsBenchmark.java b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/PartitionedFunctionExecutionWithArgumentsBenchmark.java index fc7f1f5..e5605d7 100644 --- a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/PartitionedFunctionExecutionWithArgumentsBenchmark.java +++ b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/PartitionedFunctionExecutionWithArgumentsBenchmark.java @@ -24,11 +24,6 @@ import org.apache.geode.perftest.TestRunners; public class PartitionedFunctionExecutionWithArgumentsBenchmark extends AbstractPartitionedFunctionBenchmark { - private long functionIDRange = 1000; - - public void setFunctionIDRange(long functionIDRange) { - this.functionIDRange = functionIDRange; - } @Test public void run() throws Exception { @@ -39,7 +34,8 @@ public class PartitionedFunctionExecutionWithArgumentsBenchmark @Override public TestConfig configure() { TestConfig config = super.configure(); - config.workload(new ExecuteParameterizedFunction(getKeyRange(), functionIDRange), CLIENT); + config.threads(Runtime.getRuntime().availableProcessors() * 4); + config.workload(new ExecuteParameterizedFunction(getKeyRange()), CLIENT); return config; } diff --git a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/PartitionedFunctionExecutionWithFiltersBenchmark.java b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/PartitionedFunctionExecutionWithFiltersBenchmark.java index d6440ca..cad7f8a 100644 --- a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/PartitionedFunctionExecutionWithFiltersBenchmark.java +++ b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/PartitionedFunctionExecutionWithFiltersBenchmark.java @@ -24,11 +24,6 @@ import org.apache.geode.perftest.TestRunners; public class PartitionedFunctionExecutionWithFiltersBenchmark extends AbstractPartitionedFunctionBenchmark { - private long filterKeyRange = 1000; - - public void setFilterKeyRange(long filterKeyRange) { - this.filterKeyRange = filterKeyRange; - } @Test public void run() throws Exception { @@ -38,7 +33,8 @@ public class PartitionedFunctionExecutionWithFiltersBenchmark @Override public TestConfig configure() { TestConfig config = super.configure(); - config.workload(new ExecuteFilteredFunction(getKeyRange(), filterKeyRange), CLIENT); + config.threads(Runtime.getRuntime().availableProcessors() * 8); + config.workload(new ExecuteFilteredFunction(getKeyRange()), CLIENT); return config; } } diff --git a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/PartitionedGetBenchmark.java b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/PartitionedGetBenchmark.java index f958f0f..20dd8dd 100644 --- a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/PartitionedGetBenchmark.java +++ b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/PartitionedGetBenchmark.java @@ -23,6 +23,7 @@ import static org.apache.geode.benchmark.topology.ClientServerTopology.Roles.SER import org.junit.jupiter.api.Test; +import org.apache.geode.benchmark.LongRange; import org.apache.geode.benchmark.tasks.CreateClientProxyRegion; import org.apache.geode.benchmark.tasks.CreatePartitionedRegion; import org.apache.geode.benchmark.tasks.GetTask; @@ -37,7 +38,7 @@ import org.apache.geode.perftest.TestRunners; */ public class PartitionedGetBenchmark implements PerformanceTest { - private long keyRange = 1000000; + private LongRange keyRange = new LongRange(0, 1000000); @Test public void run() throws Exception { @@ -46,7 +47,7 @@ public class PartitionedGetBenchmark implements PerformanceTest { public PartitionedGetBenchmark() {} - public void setKeyRange(long keyRange) { + public void setKeyRange(final LongRange keyRange) { this.keyRange = keyRange; } diff --git a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/PartitionedIndexedQueryBenchmark.java b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/PartitionedIndexedQueryBenchmark.java index 378dfcb..d5ec82a 100644 --- a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/PartitionedIndexedQueryBenchmark.java +++ b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/PartitionedIndexedQueryBenchmark.java @@ -19,6 +19,7 @@ import static org.apache.geode.benchmark.topology.ClientServerTopology.Roles.SER import org.junit.jupiter.api.Test; +import org.apache.geode.benchmark.LongRange; import org.apache.geode.benchmark.tasks.CreateClientProxyRegion; import org.apache.geode.benchmark.tasks.CreateIndexOnID; import org.apache.geode.benchmark.tasks.CreatePartitionedRegion; @@ -30,16 +31,16 @@ import org.apache.geode.perftest.TestConfig; import org.apache.geode.perftest.TestRunners; public class PartitionedIndexedQueryBenchmark implements PerformanceTest { - private long keyRange = 500000; + private LongRange keyRange = new LongRange(0, 500000); private long queryRange = 1000; public PartitionedIndexedQueryBenchmark() {} - public void setKeyRange(long keyRange) { + public void setKeyRange(final LongRange keyRange) { this.keyRange = keyRange; } - public void setQueryRange(long queryRange) { + public void setQueryRange(final long queryRange) { this.queryRange = queryRange; } diff --git a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/PartitionedNonIndexedQueryBenchmark.java b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/PartitionedNonIndexedQueryBenchmark.java index a161326..c7e2177 100644 --- a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/PartitionedNonIndexedQueryBenchmark.java +++ b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/PartitionedNonIndexedQueryBenchmark.java @@ -19,6 +19,7 @@ import static org.apache.geode.benchmark.topology.ClientServerTopology.Roles.SER import org.junit.jupiter.api.Test; +import org.apache.geode.benchmark.LongRange; import org.apache.geode.benchmark.tasks.CreateClientProxyRegion; import org.apache.geode.benchmark.tasks.CreatePartitionedRegion; import org.apache.geode.benchmark.tasks.OQLQuery; @@ -29,16 +30,16 @@ import org.apache.geode.perftest.TestConfig; import org.apache.geode.perftest.TestRunners; public class PartitionedNonIndexedQueryBenchmark implements PerformanceTest { - private long keyRange = 500000; + private LongRange keyRange = new LongRange(0, 500000); private long queryRange = 1000; public PartitionedNonIndexedQueryBenchmark() {} - public void setKeyRange(long keyRange) { + public void setKeyRange(final LongRange keyRange) { this.keyRange = keyRange; } - public void setQueryRange(long queryRange) { + public void setQueryRange(final long queryRange) { this.queryRange = queryRange; } diff --git a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/PartitionedPutAllBenchmark.java b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/PartitionedPutAllBenchmark.java index 6fbc19c..f6d8e96 100644 --- a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/PartitionedPutAllBenchmark.java +++ b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/PartitionedPutAllBenchmark.java @@ -22,6 +22,7 @@ import static org.apache.geode.benchmark.topology.ClientServerTopology.Roles.SER import org.junit.jupiter.api.Test; +import org.apache.geode.benchmark.LongRange; import org.apache.geode.benchmark.tasks.CreateClientProxyRegion; import org.apache.geode.benchmark.tasks.CreatePartitionedRegion; import org.apache.geode.benchmark.tasks.PrePopulateRegion; @@ -36,13 +37,13 @@ import org.apache.geode.perftest.TestRunners; */ public class PartitionedPutAllBenchmark implements PerformanceTest { - private long keyRange = 1000000; + private LongRange keyRange = new LongRange(0, 1000000); private int batchSize = 1000; public PartitionedPutAllBenchmark() {} - public void setKeyRange(long keyRange) { + public void setKeyRange(final LongRange keyRange) { this.keyRange = keyRange; } diff --git a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/PartitionedPutBenchmark.java b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/PartitionedPutBenchmark.java index 3357a17..dd5fcf2 100644 --- a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/PartitionedPutBenchmark.java +++ b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/PartitionedPutBenchmark.java @@ -22,6 +22,7 @@ import static org.apache.geode.benchmark.topology.ClientServerTopology.Roles.SER import org.junit.jupiter.api.Test; +import org.apache.geode.benchmark.LongRange; import org.apache.geode.benchmark.tasks.CreateClientProxyRegion; import org.apache.geode.benchmark.tasks.CreatePartitionedRegion; import org.apache.geode.benchmark.tasks.PrePopulateRegion; @@ -36,11 +37,11 @@ import org.apache.geode.perftest.TestRunners; */ public class PartitionedPutBenchmark implements PerformanceTest { - private long keyRange = 1000000; + private LongRange keyRange = new LongRange(0, 1000000); public PartitionedPutBenchmark() {} - public void setKeyRange(long keyRange) { + public void setKeyRange(final LongRange keyRange) { this.keyRange = keyRange; } diff --git a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/ReplicatedFunctionExecutionBenchmark.java b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/ReplicatedFunctionExecutionBenchmark.java index 7a11138..e5b2cce 100644 --- a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/ReplicatedFunctionExecutionBenchmark.java +++ b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/ReplicatedFunctionExecutionBenchmark.java @@ -23,11 +23,6 @@ import org.apache.geode.perftest.TestConfig; import org.apache.geode.perftest.TestRunners; public class ReplicatedFunctionExecutionBenchmark extends AbstractReplicatedFunctionBenchmark { - private long functionIDRange = 1000; - - public void setFunctionIDRange(long functionIDRange) { - this.functionIDRange = functionIDRange; - } @Test public void run() throws Exception { @@ -37,7 +32,7 @@ public class ReplicatedFunctionExecutionBenchmark extends AbstractReplicatedFunc @Override public TestConfig configure() { TestConfig config = super.configure(); - config.workload(new ExecuteFunction(getKeyRange(), functionIDRange), CLIENT); + config.workload(new ExecuteFunction(), CLIENT); return config; } } diff --git a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/ReplicatedFunctionExecutionWithArgumentsBenchmark.java b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/ReplicatedFunctionExecutionWithArgumentsBenchmark.java index 25710c4..faf6cb2 100644 --- a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/ReplicatedFunctionExecutionWithArgumentsBenchmark.java +++ b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/ReplicatedFunctionExecutionWithArgumentsBenchmark.java @@ -24,11 +24,6 @@ import org.apache.geode.perftest.TestRunners; public class ReplicatedFunctionExecutionWithArgumentsBenchmark extends AbstractReplicatedFunctionBenchmark { - private long functionIDRange = 1000; - - public void setFunctionIDRange(long functionIDRange) { - this.functionIDRange = functionIDRange; - } @Test public void run() throws Exception { @@ -38,7 +33,8 @@ public class ReplicatedFunctionExecutionWithArgumentsBenchmark @Override public TestConfig configure() { TestConfig config = super.configure(); - config.workload(new ExecuteParameterizedFunction(getKeyRange(), functionIDRange), CLIENT); + config.threads(Runtime.getRuntime().availableProcessors() * 16); + config.workload(new ExecuteParameterizedFunction(getKeyRange()), CLIENT); return config; } } diff --git a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/ReplicatedFunctionExecutionWithFiltersBenchmark.java b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/ReplicatedFunctionExecutionWithFiltersBenchmark.java index f1e5be5..30aed9d 100644 --- a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/ReplicatedFunctionExecutionWithFiltersBenchmark.java +++ b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/ReplicatedFunctionExecutionWithFiltersBenchmark.java @@ -24,11 +24,6 @@ import org.apache.geode.perftest.TestRunners; public class ReplicatedFunctionExecutionWithFiltersBenchmark extends AbstractReplicatedFunctionBenchmark { - private long filterKeyRange = 1000; - - public void setFilterKeyRange(long filterKeyRange) { - this.filterKeyRange = filterKeyRange; - } @Test public void run() throws Exception { @@ -38,7 +33,8 @@ public class ReplicatedFunctionExecutionWithFiltersBenchmark @Override public TestConfig configure() { TestConfig config = super.configure(); - config.workload(new ExecuteFilteredFunction(getKeyRange(), filterKeyRange), CLIENT); + config.threads(Runtime.getRuntime().availableProcessors() * 10); + config.workload(new ExecuteFilteredFunction(getKeyRange()), CLIENT); return config; } } diff --git a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/ReplicatedGetBenchmark.java b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/ReplicatedGetBenchmark.java index 806c058..13cec98 100644 --- a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/ReplicatedGetBenchmark.java +++ b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/ReplicatedGetBenchmark.java @@ -23,6 +23,7 @@ import static org.apache.geode.benchmark.topology.ClientServerTopology.Roles.SER import org.junit.jupiter.api.Test; +import org.apache.geode.benchmark.LongRange; import org.apache.geode.benchmark.tasks.CreateClientProxyRegion; import org.apache.geode.benchmark.tasks.CreateReplicatedRegion; import org.apache.geode.benchmark.tasks.GetTask; @@ -37,7 +38,7 @@ import org.apache.geode.perftest.TestRunners; */ public class ReplicatedGetBenchmark implements PerformanceTest { - private long keyRange = 1000000; + private LongRange keyRange = new LongRange(0, 1000000); @Test public void run() throws Exception { @@ -46,7 +47,7 @@ public class ReplicatedGetBenchmark implements PerformanceTest { public ReplicatedGetBenchmark() {} - public void setKeyRange(long keyRange) { + public void setKeyRange(final LongRange keyRange) { this.keyRange = keyRange; } diff --git a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/ReplicatedIndexedQueryBenchmark.java b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/ReplicatedIndexedQueryBenchmark.java index 589babc..408a4c5 100644 --- a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/ReplicatedIndexedQueryBenchmark.java +++ b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/ReplicatedIndexedQueryBenchmark.java @@ -19,6 +19,7 @@ import static org.apache.geode.benchmark.topology.ClientServerTopology.Roles.SER import org.junit.jupiter.api.Test; +import org.apache.geode.benchmark.LongRange; import org.apache.geode.benchmark.tasks.CreateClientProxyRegion; import org.apache.geode.benchmark.tasks.CreateIndexOnID; import org.apache.geode.benchmark.tasks.CreateReplicatedRegion; @@ -30,16 +31,16 @@ import org.apache.geode.perftest.TestConfig; import org.apache.geode.perftest.TestRunners; public class ReplicatedIndexedQueryBenchmark implements PerformanceTest { - private long keyRange = 500000; + private LongRange keyRange = new LongRange(0, 500000); private long queryRange = 1000; public ReplicatedIndexedQueryBenchmark() {} - public void setKeyRange(long keyRange) { + public void setKeyRange(final LongRange keyRange) { this.keyRange = keyRange; } - public void setQueryRange(long queryRange) { + public void setQueryRange(final long queryRange) { this.queryRange = queryRange; } diff --git a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/ReplicatedNonIndexedQueryBenchmark.java b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/ReplicatedNonIndexedQueryBenchmark.java index 74884ba..827cbae 100644 --- a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/ReplicatedNonIndexedQueryBenchmark.java +++ b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/ReplicatedNonIndexedQueryBenchmark.java @@ -19,6 +19,7 @@ import static org.apache.geode.benchmark.topology.ClientServerTopology.Roles.SER import org.junit.jupiter.api.Test; +import org.apache.geode.benchmark.LongRange; import org.apache.geode.benchmark.tasks.CreateClientProxyRegion; import org.apache.geode.benchmark.tasks.CreateReplicatedRegion; import org.apache.geode.benchmark.tasks.OQLQuery; @@ -29,12 +30,12 @@ import org.apache.geode.perftest.TestConfig; import org.apache.geode.perftest.TestRunners; public class ReplicatedNonIndexedQueryBenchmark implements PerformanceTest { - private long keyRange = 500000; + private LongRange keyRange = new LongRange(0, 500000); private long queryRange = 1000; public ReplicatedNonIndexedQueryBenchmark() {} - public void setKeyRange(long keyRange) { + public void setKeyRange(LongRange keyRange) { this.keyRange = keyRange; } diff --git a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/ReplicatedPutAllBenchmark.java b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/ReplicatedPutAllBenchmark.java index 2a20717..abd461c 100644 --- a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/ReplicatedPutAllBenchmark.java +++ b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/ReplicatedPutAllBenchmark.java @@ -22,6 +22,7 @@ import static org.apache.geode.benchmark.topology.ClientServerTopology.Roles.SER import org.junit.jupiter.api.Test; +import org.apache.geode.benchmark.LongRange; import org.apache.geode.benchmark.tasks.CreateClientProxyRegion; import org.apache.geode.benchmark.tasks.CreateReplicatedRegion; import org.apache.geode.benchmark.tasks.PrePopulateRegion; @@ -36,13 +37,13 @@ import org.apache.geode.perftest.TestRunners; */ public class ReplicatedPutAllBenchmark implements PerformanceTest { - private long keyRange = 1000000; + private LongRange keyRange = new LongRange(0, 1000000); private int batchSize = 1000; public ReplicatedPutAllBenchmark() {} - public void setKeyRange(long keyRange) { + public void setKeyRange(final LongRange keyRange) { this.keyRange = keyRange; } diff --git a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/ReplicatedPutBenchmark.java b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/ReplicatedPutBenchmark.java index 40bc02f..4df50cd 100644 --- a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/ReplicatedPutBenchmark.java +++ b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/ReplicatedPutBenchmark.java @@ -22,6 +22,7 @@ import static org.apache.geode.benchmark.topology.ClientServerTopology.Roles.SER import org.junit.jupiter.api.Test; +import org.apache.geode.benchmark.LongRange; import org.apache.geode.benchmark.tasks.CreateClientProxyRegion; import org.apache.geode.benchmark.tasks.CreateReplicatedRegion; import org.apache.geode.benchmark.tasks.PrePopulateRegion; @@ -36,11 +37,11 @@ import org.apache.geode.perftest.TestRunners; */ public class ReplicatedPutBenchmark implements PerformanceTest { - private long keyRange = 1000000; + private LongRange keyRange = new LongRange(0, 1000000); public ReplicatedPutBenchmark() {} - public void setKeyRange(long keyRange) { + public void setKeyRange(LongRange keyRange) { this.keyRange = keyRange; } diff --git a/geode-benchmarks/src/test/java/org/apache/geode/benchmark/tasks/PrePopulateRegionTest.java b/geode-benchmarks/src/test/java/org/apache/geode/benchmark/tasks/PrePopulateRegionTest.java index 7770bad..4123fc6 100644 --- a/geode-benchmarks/src/test/java/org/apache/geode/benchmark/tasks/PrePopulateRegionTest.java +++ b/geode-benchmarks/src/test/java/org/apache/geode/benchmark/tasks/PrePopulateRegionTest.java @@ -25,15 +25,18 @@ import java.util.stream.LongStream; import benchmark.geode.data.Portfolio; import org.junit.jupiter.api.Test; +import org.apache.geode.benchmark.LongRange; + class PrePopulateRegionTest { @Test public void putsEntriesForServer() throws InterruptedException { - PrePopulateRegion prePopulateRegion = new PrePopulateRegion(100); + final LongRange range = new LongRange(0, 100); + PrePopulateRegion prePopulateRegion = new PrePopulateRegion(range); Map<Long, Portfolio> region = new ConcurrentHashMap<>(); - prePopulateRegion.run(region, 1, 2, 2); + prePopulateRegion.run(region, range.sliceFor(2, 1)); // verify that we put the last 50 keys verifyKeys(region, 50, 100); @@ -41,12 +44,13 @@ class PrePopulateRegionTest { @Test public void putsEntriesForServerWithSmallBatches() throws InterruptedException { - PrePopulateRegion prePopulateRegion = new PrePopulateRegion(100); + final LongRange range = new LongRange(0, 100); + PrePopulateRegion prePopulateRegion = new PrePopulateRegion(range); prePopulateRegion.setBatchSize(2); Map<Long, Portfolio> region = new ConcurrentHashMap<>(); - prePopulateRegion.run(region, 1, 2, 2); + prePopulateRegion.run(region, range.sliceFor(2, 1)); // verify that we put the last 50 keys verifyKeys(region, 50, 100); diff --git a/geode-benchmarks/src/test/java/org/apache/geode/benchmark/tests/PartitionedFunctionExecutionBenchmarkTest.java b/geode-benchmarks/src/test/java/org/apache/geode/benchmark/tests/PartitionedFunctionExecutionBenchmarkTest.java index ad30de3..6ebf461 100644 --- a/geode-benchmarks/src/test/java/org/apache/geode/benchmark/tests/PartitionedFunctionExecutionBenchmarkTest.java +++ b/geode-benchmarks/src/test/java/org/apache/geode/benchmark/tests/PartitionedFunctionExecutionBenchmarkTest.java @@ -21,6 +21,7 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.extension.ExtendWith; import org.junitpioneer.jupiter.TempDirectory; +import org.apache.geode.benchmark.LongRange; import org.apache.geode.perftest.TestRunners; @ExtendWith(TempDirectory.class) @@ -35,8 +36,7 @@ public class PartitionedFunctionExecutionBenchmarkTest { public void benchmarkRunsSuccessfully() throws Exception { PartitionedFunctionExecutionBenchmark test = new PartitionedFunctionExecutionBenchmark(); - test.setKeyRange(100); - test.setFunctionIDRange(5); + test.setKeyRange(new LongRange(0, 100)); TestRunners.minimalRunner(folder).runTest(test); } } diff --git a/geode-benchmarks/src/test/java/org/apache/geode/benchmark/tests/PartitionedFunctionExecutionWithArgumentsBenchmarkTest.java b/geode-benchmarks/src/test/java/org/apache/geode/benchmark/tests/PartitionedFunctionExecutionWithArgumentsBenchmarkTest.java index 58a4490..f6b067a 100644 --- a/geode-benchmarks/src/test/java/org/apache/geode/benchmark/tests/PartitionedFunctionExecutionWithArgumentsBenchmarkTest.java +++ b/geode-benchmarks/src/test/java/org/apache/geode/benchmark/tests/PartitionedFunctionExecutionWithArgumentsBenchmarkTest.java @@ -22,6 +22,7 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.junitpioneer.jupiter.TempDirectory; +import org.apache.geode.benchmark.LongRange; import org.apache.geode.perftest.TestRunners; @ExtendWith(TempDirectory.class) @@ -38,8 +39,7 @@ public class PartitionedFunctionExecutionWithArgumentsBenchmarkTest { public void benchmarkRunsSuccessfully() throws Exception { PartitionedFunctionExecutionWithArgumentsBenchmark test = new PartitionedFunctionExecutionWithArgumentsBenchmark(); - test.setKeyRange(100); - test.setFunctionIDRange(5); + test.setKeyRange(new LongRange(0, 100)); TestRunners.minimalRunner(folder).runTest(test); } } diff --git a/geode-benchmarks/src/test/java/org/apache/geode/benchmark/tests/PartitionedFunctionExecutionWithFiltersBenchmarkTest.java b/geode-benchmarks/src/test/java/org/apache/geode/benchmark/tests/PartitionedFunctionExecutionWithFiltersBenchmarkTest.java index 7a9f446..4fb759a 100644 --- a/geode-benchmarks/src/test/java/org/apache/geode/benchmark/tests/PartitionedFunctionExecutionWithFiltersBenchmarkTest.java +++ b/geode-benchmarks/src/test/java/org/apache/geode/benchmark/tests/PartitionedFunctionExecutionWithFiltersBenchmarkTest.java @@ -22,6 +22,9 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.junitpioneer.jupiter.TempDirectory; +import org.apache.geode.benchmark.LongRange; +import org.apache.geode.perftest.TestRunners; + @ExtendWith(TempDirectory.class) public class PartitionedFunctionExecutionWithFiltersBenchmarkTest { @@ -36,7 +39,8 @@ public class PartitionedFunctionExecutionWithFiltersBenchmarkTest { public void benchmarkRunsSuccessfully() throws Exception { PartitionedFunctionExecutionWithFiltersBenchmark test = new PartitionedFunctionExecutionWithFiltersBenchmark(); - test.setKeyRange(100); - test.setFilterKeyRange(5); + test.setKeyRange(new LongRange(0, 100)); + TestRunners.minimalRunner(folder) + .runTest(test); } } diff --git a/geode-benchmarks/src/test/java/org/apache/geode/benchmark/tests/PartitionedGetBenchmarkTest.java b/geode-benchmarks/src/test/java/org/apache/geode/benchmark/tests/PartitionedGetBenchmarkTest.java index f228131..01b6d5c 100644 --- a/geode-benchmarks/src/test/java/org/apache/geode/benchmark/tests/PartitionedGetBenchmarkTest.java +++ b/geode-benchmarks/src/test/java/org/apache/geode/benchmark/tests/PartitionedGetBenchmarkTest.java @@ -23,6 +23,7 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.junitpioneer.jupiter.TempDirectory; +import org.apache.geode.benchmark.LongRange; import org.apache.geode.perftest.TestRunners; @ExtendWith(TempDirectory.class) @@ -39,7 +40,7 @@ public class PartitionedGetBenchmarkTest { public void benchmarkRunsSuccessfully() throws Exception { PartitionedGetBenchmark test = new PartitionedGetBenchmark(); - test.setKeyRange(100); + test.setKeyRange(new LongRange(0, 100)); TestRunners.minimalRunner(folder) .runTest(test); } diff --git a/geode-benchmarks/src/test/java/org/apache/geode/benchmark/tests/PartitionedIndexedQueryBenchmarkTest.java b/geode-benchmarks/src/test/java/org/apache/geode/benchmark/tests/PartitionedIndexedQueryBenchmarkTest.java index 552cc2f..75eff61 100644 --- a/geode-benchmarks/src/test/java/org/apache/geode/benchmark/tests/PartitionedIndexedQueryBenchmarkTest.java +++ b/geode-benchmarks/src/test/java/org/apache/geode/benchmark/tests/PartitionedIndexedQueryBenchmarkTest.java @@ -22,6 +22,7 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.junitpioneer.jupiter.TempDirectory; +import org.apache.geode.benchmark.LongRange; import org.apache.geode.perftest.TestRunners; @ExtendWith(TempDirectory.class) @@ -36,7 +37,7 @@ public class PartitionedIndexedQueryBenchmarkTest { @Test public void benchmarkRunsSuccessfully() throws Exception { PartitionedIndexedQueryBenchmark test = new PartitionedIndexedQueryBenchmark(); - test.setKeyRange(100); + test.setKeyRange(new LongRange(0, 100)); test.setQueryRange(10); TestRunners.minimalRunner(folder).runTest(test); } diff --git a/geode-benchmarks/src/test/java/org/apache/geode/benchmark/tests/PartitionedNonIndexedQueryBenchmarkTest.java b/geode-benchmarks/src/test/java/org/apache/geode/benchmark/tests/PartitionedNonIndexedQueryBenchmarkTest.java index cceab9e..253f8c2 100644 --- a/geode-benchmarks/src/test/java/org/apache/geode/benchmark/tests/PartitionedNonIndexedQueryBenchmarkTest.java +++ b/geode-benchmarks/src/test/java/org/apache/geode/benchmark/tests/PartitionedNonIndexedQueryBenchmarkTest.java @@ -22,6 +22,7 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.junitpioneer.jupiter.TempDirectory; +import org.apache.geode.benchmark.LongRange; import org.apache.geode.perftest.TestRunners; @ExtendWith(TempDirectory.class) @@ -36,7 +37,7 @@ public class PartitionedNonIndexedQueryBenchmarkTest { @Test public void benchmarkRunsSuccessfully() throws Exception { PartitionedNonIndexedQueryBenchmark test = new PartitionedNonIndexedQueryBenchmark(); - test.setKeyRange(100); + test.setKeyRange(new LongRange(0, 100)); test.setQueryRange(10); TestRunners.minimalRunner(folder).runTest(test); } diff --git a/geode-benchmarks/src/test/java/org/apache/geode/benchmark/tests/PartitionedPutBenchmarkTest.java b/geode-benchmarks/src/test/java/org/apache/geode/benchmark/tests/PartitionedPutBenchmarkTest.java index d724508..194a9bc 100644 --- a/geode-benchmarks/src/test/java/org/apache/geode/benchmark/tests/PartitionedPutBenchmarkTest.java +++ b/geode-benchmarks/src/test/java/org/apache/geode/benchmark/tests/PartitionedPutBenchmarkTest.java @@ -27,6 +27,7 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.junitpioneer.jupiter.TempDirectory; +import org.apache.geode.benchmark.LongRange; import org.apache.geode.perftest.TestRunners; @ExtendWith(TempDirectory.class) @@ -43,7 +44,7 @@ public class PartitionedPutBenchmarkTest { public void benchmarkRunsSuccessfully() throws Exception { PartitionedPutBenchmark test = new PartitionedPutBenchmark(); - test.setKeyRange(100); + test.setKeyRange(new LongRange(0, 100)); TestRunners.minimalRunner(folder) .runTest(test); } diff --git a/geode-benchmarks/src/test/java/org/apache/geode/benchmark/tests/ReplicatedFunctionExecutionBenchmarkTest.java b/geode-benchmarks/src/test/java/org/apache/geode/benchmark/tests/ReplicatedFunctionExecutionBenchmarkTest.java index 56d210f..4f9dc01 100644 --- a/geode-benchmarks/src/test/java/org/apache/geode/benchmark/tests/ReplicatedFunctionExecutionBenchmarkTest.java +++ b/geode-benchmarks/src/test/java/org/apache/geode/benchmark/tests/ReplicatedFunctionExecutionBenchmarkTest.java @@ -22,6 +22,7 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.junitpioneer.jupiter.TempDirectory; +import org.apache.geode.benchmark.LongRange; import org.apache.geode.perftest.TestRunners; @ExtendWith(TempDirectory.class) @@ -37,8 +38,7 @@ public class ReplicatedFunctionExecutionBenchmarkTest { @Test void benchmarkRunsSuccessfully() throws Exception { ReplicatedFunctionExecutionBenchmark test = new ReplicatedFunctionExecutionBenchmark(); - test.setKeyRange(100); - test.setFunctionIDRange(5); + test.setKeyRange(new LongRange(0, 100)); TestRunners.minimalRunner(folder).runTest(test); } } diff --git a/geode-benchmarks/src/test/java/org/apache/geode/benchmark/tests/ReplicatedFunctionExecutionWithArgumentsBenchmarkTest.java b/geode-benchmarks/src/test/java/org/apache/geode/benchmark/tests/ReplicatedFunctionExecutionWithArgumentsBenchmarkTest.java index d4df73c..f86bb63 100644 --- a/geode-benchmarks/src/test/java/org/apache/geode/benchmark/tests/ReplicatedFunctionExecutionWithArgumentsBenchmarkTest.java +++ b/geode-benchmarks/src/test/java/org/apache/geode/benchmark/tests/ReplicatedFunctionExecutionWithArgumentsBenchmarkTest.java @@ -22,6 +22,7 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.junitpioneer.jupiter.TempDirectory; +import org.apache.geode.benchmark.LongRange; import org.apache.geode.perftest.TestRunners; @ExtendWith(TempDirectory.class) @@ -37,8 +38,7 @@ public class ReplicatedFunctionExecutionWithArgumentsBenchmarkTest { public void benchmarkRunsSuccessfully() throws Exception { ReplicatedFunctionExecutionWithArgumentsBenchmark test = new ReplicatedFunctionExecutionWithArgumentsBenchmark(); - test.setKeyRange(100); - test.setFunctionIDRange(5); + test.setKeyRange(new LongRange(0, 100)); TestRunners.minimalRunner(folder).runTest(test); } } diff --git a/geode-benchmarks/src/test/java/org/apache/geode/benchmark/tests/ReplicatedFunctionExecutionWithFiltersBenchmarkTest.java b/geode-benchmarks/src/test/java/org/apache/geode/benchmark/tests/ReplicatedFunctionExecutionWithFiltersBenchmarkTest.java index 283a849..4a4e47e 100644 --- a/geode-benchmarks/src/test/java/org/apache/geode/benchmark/tests/ReplicatedFunctionExecutionWithFiltersBenchmarkTest.java +++ b/geode-benchmarks/src/test/java/org/apache/geode/benchmark/tests/ReplicatedFunctionExecutionWithFiltersBenchmarkTest.java @@ -22,6 +22,7 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.junitpioneer.jupiter.TempDirectory; +import org.apache.geode.benchmark.LongRange; import org.apache.geode.perftest.TestRunners; @ExtendWith(TempDirectory.class) @@ -37,8 +38,7 @@ public class ReplicatedFunctionExecutionWithFiltersBenchmarkTest { public void benchmarkRunsSuccessfully() throws Exception { ReplicatedFunctionExecutionWithFiltersBenchmark test = new ReplicatedFunctionExecutionWithFiltersBenchmark(); - test.setKeyRange(100); - test.setFilterKeyRange(5); + test.setKeyRange(new LongRange(0, 100)); TestRunners.minimalRunner(folder).runTest(test); } } diff --git a/geode-benchmarks/src/test/java/org/apache/geode/benchmark/tests/ReplicatedGetBenchmarkTest.java b/geode-benchmarks/src/test/java/org/apache/geode/benchmark/tests/ReplicatedGetBenchmarkTest.java index 1b35746..f97181d 100644 --- a/geode-benchmarks/src/test/java/org/apache/geode/benchmark/tests/ReplicatedGetBenchmarkTest.java +++ b/geode-benchmarks/src/test/java/org/apache/geode/benchmark/tests/ReplicatedGetBenchmarkTest.java @@ -23,6 +23,7 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.junitpioneer.jupiter.TempDirectory; +import org.apache.geode.benchmark.LongRange; import org.apache.geode.perftest.TestRunners; @ExtendWith(TempDirectory.class) @@ -39,7 +40,7 @@ public class ReplicatedGetBenchmarkTest { public void benchmarkRunsSuccessfully() throws Exception { ReplicatedGetBenchmark test = new ReplicatedGetBenchmark(); - test.setKeyRange(100); + test.setKeyRange(new LongRange(0, 100)); TestRunners.minimalRunner(folder) .runTest(test); } diff --git a/geode-benchmarks/src/test/java/org/apache/geode/benchmark/tests/ReplicatedIndexedQueryBenchmarkTest.java b/geode-benchmarks/src/test/java/org/apache/geode/benchmark/tests/ReplicatedIndexedQueryBenchmarkTest.java index 3b39f24..edcebf7 100644 --- a/geode-benchmarks/src/test/java/org/apache/geode/benchmark/tests/ReplicatedIndexedQueryBenchmarkTest.java +++ b/geode-benchmarks/src/test/java/org/apache/geode/benchmark/tests/ReplicatedIndexedQueryBenchmarkTest.java @@ -22,6 +22,7 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.junitpioneer.jupiter.TempDirectory; +import org.apache.geode.benchmark.LongRange; import org.apache.geode.perftest.TestRunners; @ExtendWith(TempDirectory.class) @@ -36,7 +37,7 @@ public class ReplicatedIndexedQueryBenchmarkTest { @Test public void benchmarkRunsSuccessfully() throws Exception { ReplicatedIndexedQueryBenchmark test = new ReplicatedIndexedQueryBenchmark(); - test.setKeyRange(100); + test.setKeyRange(new LongRange(0, 100)); test.setQueryRange(10); TestRunners.minimalRunner(folder).runTest(test); } diff --git a/geode-benchmarks/src/test/java/org/apache/geode/benchmark/tests/ReplicatedNonIndexedQueryBenchmarkTest.java b/geode-benchmarks/src/test/java/org/apache/geode/benchmark/tests/ReplicatedNonIndexedQueryBenchmarkTest.java index 416bdb3..2f5ecfe 100644 --- a/geode-benchmarks/src/test/java/org/apache/geode/benchmark/tests/ReplicatedNonIndexedQueryBenchmarkTest.java +++ b/geode-benchmarks/src/test/java/org/apache/geode/benchmark/tests/ReplicatedNonIndexedQueryBenchmarkTest.java @@ -22,6 +22,7 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.junitpioneer.jupiter.TempDirectory; +import org.apache.geode.benchmark.LongRange; import org.apache.geode.perftest.TestRunners; @ExtendWith(TempDirectory.class) @@ -36,7 +37,7 @@ public class ReplicatedNonIndexedQueryBenchmarkTest { @Test public void benchmarkRunsSuccessfully() throws Exception { ReplicatedNonIndexedQueryBenchmark test = new ReplicatedNonIndexedQueryBenchmark(); - test.setKeyRange(100); + test.setKeyRange(new LongRange(0, 100)); test.setQueryRange(10); TestRunners.minimalRunner(folder).runTest(test); } diff --git a/geode-benchmarks/src/test/java/org/apache/geode/benchmark/tests/ReplicatedPutBenchmarkTest.java b/geode-benchmarks/src/test/java/org/apache/geode/benchmark/tests/ReplicatedPutBenchmarkTest.java index 0421d53..fee0bd1 100644 --- a/geode-benchmarks/src/test/java/org/apache/geode/benchmark/tests/ReplicatedPutBenchmarkTest.java +++ b/geode-benchmarks/src/test/java/org/apache/geode/benchmark/tests/ReplicatedPutBenchmarkTest.java @@ -25,6 +25,7 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.junitpioneer.jupiter.TempDirectory; +import org.apache.geode.benchmark.LongRange; import org.apache.geode.perftest.TestRunners; @ExtendWith(TempDirectory.class) @@ -41,7 +42,7 @@ public class ReplicatedPutBenchmarkTest { public void benchmarkRunsSuccessfully() throws Exception { ReplicatedPutBenchmark test = new ReplicatedPutBenchmark(); - test.setKeyRange(100); + test.setKeyRange(new LongRange(0, 100)); TestRunners.minimalRunner(folder) .runTest(test); } diff --git a/harness/src/main/java/org/apache/geode/benchmark/LongRange.java b/harness/src/main/java/org/apache/geode/benchmark/LongRange.java new file mode 100644 index 0000000..bf48276 --- /dev/null +++ b/harness/src/main/java/org/apache/geode/benchmark/LongRange.java @@ -0,0 +1,148 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.geode.benchmark; + +import static java.lang.Long.max; +import static java.lang.Long.min; + +import java.io.Serializable; +import java.util.Objects; +import java.util.concurrent.ThreadLocalRandom; +import java.util.function.LongConsumer; + +/** + * Describes a range [min, max) in long values between min inclusive and max exclusive. + */ +public class LongRange implements Serializable { + private static final long serialVersionUID = 1L; + + private final long min; + private final long max; + + public LongRange(long min, long max) { + try { + if (Math.subtractExact(max, min) <= 0) { + throw new IllegalArgumentException(); + } + } catch (ArithmeticException e) { + throw new IllegalArgumentException(e); + } + + this.min = min; + this.max = max; + } + + public long getMin() { + return min; + } + + public long getMax() { + return max; + } + + public long size() { + return max - min; + } + + /** + * Slices the range in relatively equal ranges in each slice with the remainder distributed across + * the slices. + * + * @param count of slices + * @return array of {@code count} slices + */ + public LongRange[] slice(final int count) { + final LongRange[] slices = new LongRange[count]; + + for (int i = 0; i < slices.length; i++) { + slices[i] = sliceFor(count, i); + } + + return slices; + } + + /** + * Get a single slice for {@code count} slices at {@code index} + * + * @param count of slices + * @param index of slice + * @return Single slice at index. + * @throws IndexOutOfBoundsException if index is less than 0 or greater than slices. + */ + public LongRange sliceFor(final int count, final int index) throws IndexOutOfBoundsException { + if (index < 0 || index >= count) { + throw new IndexOutOfBoundsException(); + } + + final long size = max - min; + final long increment = size / count; + final long remainder = size % count; + final long sliceMin = + min + ((increment + 1) * min(remainder, index)) + (increment * max(0, index - remainder)); + final long sliceMax = sliceMin + increment + (index < remainder ? 1 : 0); + return new LongRange(sliceMin, sliceMax); + } + + public LongRange[] slicesOfSize(final long sliceSize) { + final int count = (int) Math.ceil((double) size() / sliceSize); + return slice(count); + } + + /** + * Iterates over each value in the range. + * + * @param consumer to invoke with current value. + */ + public void forEach(LongConsumer consumer) { + for (long i = min; i < max; i++) { + consumer.accept(i); + } + } + + /** + * Randomly select a value withing range. + * + * @return a random value within range. + */ + public long random() { + return ThreadLocalRandom.current().nextLong(min, max); + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + final LongRange longRange = (LongRange) o; + return min == longRange.min && + max == longRange.max; + } + + @Override + public int hashCode() { + return Objects.hash(min, max); + } + + @Override + public String toString() { + return "LongRange{" + "min=" + min + ", max=" + max + '}'; + } +} diff --git a/harness/src/test/java/org/apache/geode/benchmark/LongRangeTest.java b/harness/src/test/java/org/apache/geode/benchmark/LongRangeTest.java new file mode 100644 index 0000000..96b780b --- /dev/null +++ b/harness/src/test/java/org/apache/geode/benchmark/LongRangeTest.java @@ -0,0 +1,114 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.geode.benchmark; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +import org.junit.jupiter.api.Test; + +class LongRangeTest { + + @Test + public void constructValidRanges() { + new LongRange(0, 1); + new LongRange(0, Long.MAX_VALUE); + new LongRange(-1, 0); + new LongRange(Long.MIN_VALUE, -1); + } + + @Test + public void constructInvalidRangesThrowsException() { + assertThatThrownBy(() -> new LongRange(0, 0)).isInstanceOf(IllegalArgumentException.class); + assertThatThrownBy(() -> new LongRange(1, 0)).isInstanceOf(IllegalArgumentException.class); + assertThatThrownBy(() -> new LongRange(Long.MIN_VALUE, Long.MAX_VALUE)) + .isInstanceOf(IllegalArgumentException.class); + assertThatThrownBy(() -> new LongRange(-1, Long.MAX_VALUE)) + .isInstanceOf(IllegalArgumentException.class); + assertThatThrownBy(() -> new LongRange(Long.MIN_VALUE, 0)) + .isInstanceOf(IllegalArgumentException.class); + } + + @Test + public void getMin() { + assertThat(new LongRange(1, 2).getMin()).isEqualTo(1); + } + + @Test + public void getMax() { + assertThat(new LongRange(1, 2).getMax()).isEqualTo(2); + } + + @Test + public void size() { + assertThat(new LongRange(1, 2).size()).isEqualTo(1); + assertThat(new LongRange(0, Long.MAX_VALUE).size()).isEqualTo(Long.MAX_VALUE); + } + + @Test + void sliceWhole() { + final LongRange[] slices = new LongRange(0, 50).slice(5); + assertThat(slices).hasSize(5); + assertThat(slices).containsExactly(new LongRange(0, 10), new LongRange(10, 20), + new LongRange(20, 30), new LongRange(30, 40), new LongRange(40, 50)); + } + + @Test + void sliceWithRemainder() { + final LongRange[] slices = new LongRange(0, 53).slice(5); + assertThat(slices).hasSize(5); + assertThat(slices).containsExactly(new LongRange(0, 11), new LongRange(11, 22), + new LongRange(22, 33), new LongRange(33, 43), new LongRange(43, 53)); + } + + @Test + void sliceFor() { + assertThat(new LongRange(0, 50).sliceFor(5, 2)).isEqualTo(new LongRange(20, 30)); + } + + @Test + void sliceForWithRemainder() { + assertThat(new LongRange(0, 53).sliceFor(5, 2)).isEqualTo(new LongRange(22, 33)); + assertThat(new LongRange(10000, Long.MAX_VALUE).sliceFor(2, 0)) + .isEqualTo(new LongRange(10000, 4611686018427392904L)); + } + + @Test + void sliceForThrowsIndexOutOfBoundsException() { + final LongRange range = new LongRange(0, 50); + assertThatThrownBy(() -> range.sliceFor(5, -1)).isInstanceOf(IndexOutOfBoundsException.class); + assertThatThrownBy(() -> range.sliceFor(5, 10)).isInstanceOf(IndexOutOfBoundsException.class); + } + + @Test + void slicesOfSize() { + final LongRange[] slices = new LongRange(0, 50).slicesOfSize(10); + assertThat(slices).hasSize(5); + assertThat(slices).containsExactly(new LongRange(0, 10), new LongRange(10, 20), + new LongRange(20, 30), new LongRange(30, 40), new LongRange(40, 50)); + } + + @Test + void slicesOfSizeWithRemainer() { + final LongRange[] slices = new LongRange(0, 53).slicesOfSize(10); + assertThat(slices).hasSize(6); + assertThat(slices).containsExactly(new LongRange(0, 9), new LongRange(9, 18), + new LongRange(18, 27), new LongRange(27, 36), new LongRange(36, 45), new LongRange(45, 53)); + } + +}