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