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 8a56e898cac64a32b18886259e5b7f7f3229f974 Author: Jens Deppe <[email protected]> AuthorDate: Fri Mar 12 07:46:47 2021 -0800 Add function to show secondary bucket distribution --- .../geode/redis/internal/GeodeRedisServer.java | 2 + .../cluster/ShowSecondaryBucketsFunction.java | 75 ++++++++++++++++++++++ 2 files changed, 77 insertions(+) diff --git a/geode-redis/src/main/java/org/apache/geode/redis/internal/GeodeRedisServer.java b/geode-redis/src/main/java/org/apache/geode/redis/internal/GeodeRedisServer.java index 4535dd7..4699e1c 100644 --- a/geode-redis/src/main/java/org/apache/geode/redis/internal/GeodeRedisServer.java +++ b/geode-redis/src/main/java/org/apache/geode/redis/internal/GeodeRedisServer.java @@ -28,6 +28,7 @@ import org.apache.geode.internal.statistics.StatisticsClockFactory; import org.apache.geode.logging.internal.executors.LoggingExecutors; import org.apache.geode.logging.internal.log4j.api.LogService; import org.apache.geode.redis.internal.cluster.BucketRetrievalFunction; +import org.apache.geode.redis.internal.cluster.ShowSecondaryBucketsFunction; import org.apache.geode.redis.internal.executor.CommandFunction; import org.apache.geode.redis.internal.executor.StripedExecutor; import org.apache.geode.redis.internal.executor.SynchronizedStripedExecutor; @@ -105,6 +106,7 @@ public class GeodeRedisServer { redisCommandExecutor); BucketRetrievalFunction.register(bindAddress, nettyRedisServer.getPort()); + ShowSecondaryBucketsFunction.register(); } @VisibleForTesting diff --git a/geode-redis/src/main/java/org/apache/geode/redis/internal/cluster/ShowSecondaryBucketsFunction.java b/geode-redis/src/main/java/org/apache/geode/redis/internal/cluster/ShowSecondaryBucketsFunction.java new file mode 100644 index 0000000..25a42f6 --- /dev/null +++ b/geode-redis/src/main/java/org/apache/geode/redis/internal/cluster/ShowSecondaryBucketsFunction.java @@ -0,0 +1,75 @@ +/* + * 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.redis.internal.cluster; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import org.apache.geode.cache.Region; +import org.apache.geode.cache.execute.FunctionContext; +import org.apache.geode.cache.execute.FunctionService; +import org.apache.geode.cache.partition.PartitionRegionHelper; +import org.apache.geode.distributed.internal.membership.InternalDistributedMember; +import org.apache.geode.internal.cache.LocalDataSet; +import org.apache.geode.internal.cache.PartitionedRegion; +import org.apache.geode.internal.cache.execute.InternalFunction; +import org.apache.geode.internal.cache.partitioned.RegionAdvisor; +import org.apache.geode.redis.internal.RegionProvider; +import org.apache.geode.redis.internal.data.ByteArrayWrapper; +import org.apache.geode.redis.internal.data.RedisKey; + +/** + * Helper function to show the distribution of secondary buckets for a given member. + */ +public class ShowSecondaryBucketsFunction implements InternalFunction<Void> { + + public static final String ID = "redis-secondary-buckets"; + + public static void register() { + FunctionService.registerFunction(new ShowSecondaryBucketsFunction()); + } + + @Override + public void execute(FunctionContext<Void> context) { + Region<RedisKey, ByteArrayWrapper> region = + context.getCache().getRegion(RegionProvider.REDIS_DATA_REGION); + + String memberId = + context.getCache().getDistributedSystem().getDistributedMember().getUniqueId(); + LocalDataSet localPrimary = (LocalDataSet) PartitionRegionHelper.getLocalPrimaryData(region); + RegionAdvisor advisor = ((PartitionedRegion) region).getRegionAdvisor(); + Map<String, Integer> secondariesBucketCount = new HashMap<>(); + + for (Integer bucketId : localPrimary.getBucketSet()) { + List<String> a = advisor.getBucketOwners(bucketId).stream() + .map(InternalDistributedMember::getId) + .filter(x -> !x.equals(memberId)) + .collect(Collectors.toList()); + + a.forEach(x -> secondariesBucketCount.compute(x, (k, v) -> (v == null) ? 1 : v + 1)); + } + + context.getResultSender().lastResult(secondariesBucketCount); + } + + @Override + public String getId() { + return ID; + } + +}
