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));
+  }
+
+}

Reply via email to