You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@geode.apache.org by up...@apache.org on 2021/03/16 18:54:59 UTC
[geode] 26/36: Add function to show secondary bucket distribution
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 <jd...@vmware.com>
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;
+ }
+
+}