This is an automated email from the ASF dual-hosted git repository. upthewaterspout pushed a commit to branch feature/redis-performance-testing in repository https://gitbox.apache.org/repos/asf/geode.git
commit 50defdd631934cfe4edf28c26e8ccd8f498d79b1 Author: Jens Deppe <[email protected]> AuthorDate: Tue Mar 2 14:35:20 2021 -0800 Bypass function execution completely --- .../executor/SingleResultRedisFunction.java | 15 ++++++++++ .../hash/RedisHashCommandsFunctionInvoker.java | 10 +++++++ .../string/RedisStringCommandsFunctionInvoker.java | 34 ++++++++++------------ 3 files changed, 40 insertions(+), 19 deletions(-) diff --git a/geode-redis/src/main/java/org/apache/geode/redis/internal/executor/SingleResultRedisFunction.java b/geode-redis/src/main/java/org/apache/geode/redis/internal/executor/SingleResultRedisFunction.java index 4888d4f..713c442 100644 --- a/geode-redis/src/main/java/org/apache/geode/redis/internal/executor/SingleResultRedisFunction.java +++ b/geode-redis/src/main/java/org/apache/geode/redis/internal/executor/SingleResultRedisFunction.java @@ -15,6 +15,8 @@ package org.apache.geode.redis.internal.executor; +import java.util.concurrent.atomic.AtomicReference; + import org.apache.geode.cache.Region; import org.apache.geode.cache.execute.FunctionContext; import org.apache.geode.internal.cache.PartitionedRegion; @@ -50,6 +52,19 @@ public abstract class SingleResultRedisFunction implements InternalFunction<Obje partitionedRegion.computeWithPrimaryLocked(key, computation); } + @SuppressWarnings("unchecked") + public <T> T hackedExecute(RedisKey key, Object[] args) { + AtomicReference<Object> result = new AtomicReference<>(); + + Runnable computation = () -> { + result.set(compute(key, args)); + }; + + partitionedRegion.computeWithPrimaryLocked(key, computation); + + return (T) result.get(); + } + @Override public boolean optimizeForWrite() { return true; diff --git a/geode-redis/src/main/java/org/apache/geode/redis/internal/executor/hash/RedisHashCommandsFunctionInvoker.java b/geode-redis/src/main/java/org/apache/geode/redis/internal/executor/hash/RedisHashCommandsFunctionInvoker.java index bfdfa54..aeda9b6 100644 --- a/geode-redis/src/main/java/org/apache/geode/redis/internal/executor/hash/RedisHashCommandsFunctionInvoker.java +++ b/geode-redis/src/main/java/org/apache/geode/redis/internal/executor/hash/RedisHashCommandsFunctionInvoker.java @@ -38,9 +38,11 @@ import java.util.regex.Pattern; import org.apache.commons.lang3.tuple.Pair; import org.apache.geode.cache.Region; +import org.apache.geode.cache.execute.FunctionService; import org.apache.geode.redis.internal.data.ByteArrayWrapper; import org.apache.geode.redis.internal.data.RedisData; import org.apache.geode.redis.internal.data.RedisKey; +import org.apache.geode.redis.internal.executor.CommandFunction; import org.apache.geode.redis.internal.executor.RedisCommandsFunctionInvoker; /** @@ -51,8 +53,12 @@ import org.apache.geode.redis.internal.executor.RedisCommandsFunctionInvoker; public class RedisHashCommandsFunctionInvoker extends RedisCommandsFunctionInvoker implements RedisHashCommands { + private final CommandFunction function; + public RedisHashCommandsFunctionInvoker(Region<RedisKey, RedisData> region) { super(region); + + function = (CommandFunction) FunctionService.getFunction(CommandFunction.ID); } @Override @@ -121,4 +127,8 @@ public class RedisHashCommandsFunctionInvoker extends RedisCommandsFunctionInvok public BigDecimal hincrbyfloat(RedisKey key, ByteArrayWrapper field, BigDecimal increment) { return invokeCommandFunction(key, HINCRBYFLOAT, field, increment); } + + protected <T> T invokeCommandFunction(RedisKey key, Object... arguments) { + return function.hackedExecute(key, arguments); + } } diff --git a/geode-redis/src/main/java/org/apache/geode/redis/internal/executor/string/RedisStringCommandsFunctionInvoker.java b/geode-redis/src/main/java/org/apache/geode/redis/internal/executor/string/RedisStringCommandsFunctionInvoker.java index cb5725a..e8a8cf0 100644 --- a/geode-redis/src/main/java/org/apache/geode/redis/internal/executor/string/RedisStringCommandsFunctionInvoker.java +++ b/geode-redis/src/main/java/org/apache/geode/redis/internal/executor/string/RedisStringCommandsFunctionInvoker.java @@ -39,15 +39,11 @@ import java.util.concurrent.atomic.AtomicInteger; import org.apache.logging.log4j.Logger; -import org.apache.geode.cache.EntryNotFoundException; import org.apache.geode.cache.Region; -import org.apache.geode.internal.cache.PartitionedRegion; -import org.apache.geode.internal.cache.VMCachedDeserializable; import org.apache.geode.logging.internal.log4j.api.LogService; import org.apache.geode.redis.internal.data.ByteArrayWrapper; import org.apache.geode.redis.internal.data.RedisData; import org.apache.geode.redis.internal.data.RedisKey; -import org.apache.geode.redis.internal.data.RedisString; import org.apache.geode.redis.internal.executor.RedisCommandsFunctionInvoker; /** @@ -72,21 +68,21 @@ public class RedisStringCommandsFunctionInvoker extends RedisCommandsFunctionInv @Override public ByteArrayWrapper get(RedisKey key) { - Object v = null; - try { - v = ((PartitionedRegion) region).getValueInVM(key); - } catch (EntryNotFoundException ignored) { - logger.info("--->>> getValueInVM miss for: {}", key); - } - - if (v != null) { - Object cached = ((VMCachedDeserializable) v).getDeserializedForReading(); - int x = getInVmCount.incrementAndGet(); - if (x % 10000 == 0) { - logger.info("--->>> getValueInVM hits: {}", x); - } - return ((RedisString) cached).get(); - } + // Object v = null; + // try { + // v = ((PartitionedRegion) region).getValueInVM(key); + // } catch (EntryNotFoundException ignored) { + // logger.info("--->>> getValueInVM miss for: {}", key); + // } + // + // if (v != null) { + // Object cached = ((VMCachedDeserializable) v).getDeserializedForReading(); + // int x = getInVmCount.incrementAndGet(); + // if (x % 10000 == 0) { + // logger.info("--->>> getValueInVM hits: {}", x); + // } + // return ((RedisString) cached).get(); + // } return invokeCommandFunction(key, GET); }
