This is an automated email from the ASF dual-hosted git repository.

kturner pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/accumulo.git


The following commit(s) were added to refs/heads/main by this push:
     new 2c54f9f2c9 avoids uneeded object allocation on ServiceLocksPath (#4944)
2c54f9f2c9 is described below

commit 2c54f9f2c9c98d0f83905aa08dd98de61d7cd946
Author: Keith Turner <ktur...@apache.org>
AuthorDate: Fri Oct 4 13:27:08 2024 -0400

    avoids uneeded object allocation on ServiceLocksPath (#4944)
    
    ServiceLockPaths allows filtering hosts using a predicate.  In the case
    where a predicate was passed in that always returned true a HostPort
    object needlessly allocated to pass to the predicate.  These changes
    refactor the predicate to only allocate the HostAndPort object when
    needed.  Before the changes in #4943 this was the behavior, that when
    all host were wanted no objects were allocated.
---
 .../core/clientImpl/ZookeeperLockChecker.java      |  7 +++---
 .../accumulo/core/lock/ServiceLockPaths.java       | 21 +++++++++++-----
 .../accumulo/core/rpc/clients/TServerClient.java   |  9 +++----
 .../accumulo/core/lock/ServiceLockPathsTest.java   | 28 +++++++++++-----------
 .../accumulo/server/manager/LiveTServerSet.java    |  7 ++----
 .../org/apache/accumulo/server/util/Admin.java     |  5 ++--
 .../accumulo/server/util/TabletServerLocks.java    |  3 ++-
 7 files changed, 45 insertions(+), 35 deletions(-)

diff --git 
a/core/src/main/java/org/apache/accumulo/core/clientImpl/ZookeeperLockChecker.java
 
b/core/src/main/java/org/apache/accumulo/core/clientImpl/ZookeeperLockChecker.java
index 72e4e15d77..2f0367c102 100644
--- 
a/core/src/main/java/org/apache/accumulo/core/clientImpl/ZookeeperLockChecker.java
+++ 
b/core/src/main/java/org/apache/accumulo/core/clientImpl/ZookeeperLockChecker.java
@@ -22,6 +22,7 @@ import java.util.Set;
 
 import 
org.apache.accumulo.core.clientImpl.ClientTabletCacheImpl.TabletServerLockChecker;
 import org.apache.accumulo.core.lock.ServiceLock;
+import org.apache.accumulo.core.lock.ServiceLockPaths.AddressPredicate;
 import org.apache.accumulo.core.lock.ServiceLockPaths.ServiceLockPath;
 
 import com.google.common.net.HostAndPort;
@@ -38,7 +39,7 @@ public class ZookeeperLockChecker implements 
TabletServerLockChecker {
     // ServiceLockPaths only returns items that have a lock
     var hostAndPort = HostAndPort.fromString(server);
     Set<ServiceLockPath> tservers =
-        ctx.getServerPaths().getTabletServer(rg -> true, addr -> 
addr.equals(hostAndPort), true);
+        ctx.getServerPaths().getTabletServer(rg -> true, 
AddressPredicate.exact(hostAndPort), true);
     return !tservers.isEmpty();
   }
 
@@ -47,7 +48,7 @@ public class ZookeeperLockChecker implements 
TabletServerLockChecker {
     // ServiceLockPaths only returns items that have a lock
     var hostAndPort = HostAndPort.fromString(server);
     Set<ServiceLockPath> tservers =
-        ctx.getServerPaths().getTabletServer(rg -> true, addr -> 
addr.equals(hostAndPort), true);
+        ctx.getServerPaths().getTabletServer(rg -> true, 
AddressPredicate.exact(hostAndPort), true);
     for (ServiceLockPath slp : tservers) {
       if (ServiceLock.getSessionId(ctx.getZooCache(), slp) == 
Long.parseLong(session, 16)) {
         return true;
@@ -59,7 +60,7 @@ public class ZookeeperLockChecker implements 
TabletServerLockChecker {
   @Override
   public void invalidateCache(String tserver) {
     var hostAndPort = HostAndPort.fromString(tserver);
-    ctx.getServerPaths().getTabletServer(rg -> true, addr -> 
addr.equals(hostAndPort), false)
+    ctx.getServerPaths().getTabletServer(rg -> true, 
AddressPredicate.exact(hostAndPort), false)
         .forEach(slp -> {
           ctx.getZooCache().clear(slp.toString());
         });
diff --git 
a/core/src/main/java/org/apache/accumulo/core/lock/ServiceLockPaths.java 
b/core/src/main/java/org/apache/accumulo/core/lock/ServiceLockPaths.java
index 30c94e9ab4..b60712e92b 100644
--- a/core/src/main/java/org/apache/accumulo/core/lock/ServiceLockPaths.java
+++ b/core/src/main/java/org/apache/accumulo/core/lock/ServiceLockPaths.java
@@ -284,7 +284,7 @@ public class ServiceLockPaths {
   }
 
   public Set<ServiceLockPath> getCompactor(ResourceGroupPredicate 
resourceGroupPredicate,
-      Predicate<HostAndPort> address, boolean withLock) {
+      AddressPredicate address, boolean withLock) {
     return get(Constants.ZCOMPACTORS, resourceGroupPredicate, address, 
withLock);
   }
 
@@ -316,17 +316,17 @@ public class ServiceLockPaths {
   }
 
   public Set<ServiceLockPath> getScanServer(ResourceGroupPredicate 
resourceGroupPredicate,
-      Predicate<HostAndPort> address, boolean withLock) {
+      AddressPredicate address, boolean withLock) {
     return get(Constants.ZSSERVERS, resourceGroupPredicate, address, withLock);
   }
 
   public Set<ServiceLockPath> getTabletServer(ResourceGroupPredicate 
resourceGroupPredicate,
-      Predicate<HostAndPort> address, boolean withLock) {
+      AddressPredicate address, boolean withLock) {
     return get(Constants.ZTSERVERS, resourceGroupPredicate, address, withLock);
   }
 
   public Set<ServiceLockPath> getDeadTabletServer(ResourceGroupPredicate 
resourceGroupPredicate,
-      Predicate<HostAndPort> address, boolean withLock) {
+      AddressPredicate address, boolean withLock) {
     return get(Constants.ZDEADTSERVERS, resourceGroupPredicate, address, 
withLock);
   }
 
@@ -334,6 +334,15 @@ public class ServiceLockPaths {
 
   }
 
+  public interface AddressPredicate extends Predicate<String> {
+
+    static AddressPredicate exact(HostAndPort hostAndPort) {
+      Objects.requireNonNull(hostAndPort);
+      AddressPredicate predicate = addr -> 
hostAndPort.equals(HostAndPort.fromString(addr));
+      return predicate;
+    }
+  }
+
   /**
    * Find paths in ZooKeeper based on the input arguments and return a set of 
ServiceLockPath
    * objects.
@@ -347,7 +356,7 @@ public class ServiceLockPaths {
    * @return set of ServiceLockPath objects for the paths found based on the 
search criteria
    */
   private Set<ServiceLockPath> get(final String serverType,
-      ResourceGroupPredicate resourceGroupPredicate, Predicate<HostAndPort> 
addressPredicate,
+      ResourceGroupPredicate resourceGroupPredicate, AddressPredicate 
addressPredicate,
       boolean withLock) {
 
     Objects.requireNonNull(serverType);
@@ -380,7 +389,7 @@ public class ServiceLockPaths {
             final ZcStat stat = new ZcStat();
             final ServiceLockPath slp =
                 parse(Optional.of(serverType), typePath + "/" + group + "/" + 
server);
-            if (addressPredicate.test(HostAndPort.fromString(server))) {
+            if (addressPredicate.test(server)) {
               if (!withLock || slp.getType().equals(Constants.ZDEADTSERVERS)) {
                 // Dead TServers don't have lock data
                 results.add(slp);
diff --git 
a/core/src/main/java/org/apache/accumulo/core/rpc/clients/TServerClient.java 
b/core/src/main/java/org/apache/accumulo/core/rpc/clients/TServerClient.java
index e875536ff2..213e8ffec3 100644
--- a/core/src/main/java/org/apache/accumulo/core/rpc/clients/TServerClient.java
+++ b/core/src/main/java/org/apache/accumulo/core/rpc/clients/TServerClient.java
@@ -39,6 +39,7 @@ import 
org.apache.accumulo.core.clientImpl.thrift.ThriftSecurityException;
 import org.apache.accumulo.core.fate.zookeeper.ZooCache;
 import org.apache.accumulo.core.lock.ServiceLockData;
 import org.apache.accumulo.core.lock.ServiceLockData.ThriftService;
+import org.apache.accumulo.core.lock.ServiceLockPaths.AddressPredicate;
 import org.apache.accumulo.core.lock.ServiceLockPaths.ServiceLockPath;
 import org.apache.accumulo.core.rpc.ThriftUtil;
 import org.apache.accumulo.core.rpc.clients.ThriftClientTypes.Exec;
@@ -86,12 +87,12 @@ public interface TServerClient<C extends TServiceClient> {
       // that the path is correct and the lock is held and will return the
       // correct one.
       HostAndPort hp = HostAndPort.fromString(debugHost);
-      serverPaths
-          .addAll(context.getServerPaths().getCompactor(rg -> true, addr -> 
addr.equals(hp), true));
       serverPaths.addAll(
-          context.getServerPaths().getScanServer(rg -> true, addr -> 
addr.equals(hp), true));
+          context.getServerPaths().getCompactor(rg -> true, 
AddressPredicate.exact(hp), true));
       serverPaths.addAll(
-          context.getServerPaths().getTabletServer(rg -> true, addr -> 
addr.equals(hp), true));
+          context.getServerPaths().getScanServer(rg -> true, 
AddressPredicate.exact(hp), true));
+      serverPaths.addAll(
+          context.getServerPaths().getTabletServer(rg -> true, 
AddressPredicate.exact(hp), true));
     } else {
       serverPaths.addAll(context.getServerPaths().getTabletServer(rg -> true, 
addr -> true, true));
       if (type == ThriftClientTypes.CLIENT) {
diff --git 
a/core/src/test/java/org/apache/accumulo/core/lock/ServiceLockPathsTest.java 
b/core/src/test/java/org/apache/accumulo/core/lock/ServiceLockPathsTest.java
index 3f91c756b7..27e1e795a2 100644
--- a/core/src/test/java/org/apache/accumulo/core/lock/ServiceLockPathsTest.java
+++ b/core/src/test/java/org/apache/accumulo/core/lock/ServiceLockPathsTest.java
@@ -45,6 +45,7 @@ import org.apache.accumulo.core.clientImpl.ClientContext;
 import org.apache.accumulo.core.fate.zookeeper.ZooCache;
 import org.apache.accumulo.core.fate.zookeeper.ZooCache.ZcStat;
 import org.apache.accumulo.core.lock.ServiceLockData.ThriftService;
+import org.apache.accumulo.core.lock.ServiceLockPaths.AddressPredicate;
 import org.apache.accumulo.core.lock.ServiceLockPaths.ServiceLockPath;
 import org.easymock.EasyMock;
 import org.junit.jupiter.api.Test;
@@ -385,7 +386,7 @@ public class ServiceLockPathsTest {
     assertTrue(ctx.getServerPaths()
         .getCompactor(rg -> rg.equals(TEST_RESOURCE_GROUP), addr -> true, 
true).isEmpty());
     assertTrue(ctx.getServerPaths()
-        .getCompactor(rg -> rg.equals(TEST_RESOURCE_GROUP), addr -> 
addr.equals(hp), true)
+        .getCompactor(rg -> rg.equals(TEST_RESOURCE_GROUP), 
AddressPredicate.exact(hp), true)
         .isEmpty());
 
     EasyMock.verify(ctx, zc);
@@ -504,7 +505,7 @@ public class ServiceLockPathsTest {
 
     // query for a specific server
     results = ctx.getServerPaths().getCompactor(rg -> 
rg.equals(TEST_RESOURCE_GROUP),
-        addr -> addr.equals(hp), true);
+        AddressPredicate.exact(hp), true);
     assertEquals(1, results.size());
     iter = results.iterator();
     slp1 = iter.next();
@@ -515,7 +516,7 @@ public class ServiceLockPathsTest {
 
     // query for a wrong server
     results = ctx.getServerPaths().getCompactor(rg -> 
rg.equals(TEST_RESOURCE_GROUP),
-        addr -> addr.equals(HostAndPort.fromString("localhost:1234")), true);
+        AddressPredicate.exact(HostAndPort.fromString("localhost:1234")), 
true);
     assertEquals(0, results.size());
 
     EasyMock.verify(ctx, zc);
@@ -542,7 +543,7 @@ public class ServiceLockPathsTest {
     assertTrue(ctx.getServerPaths()
         .getScanServer(rg -> rg.equals(TEST_RESOURCE_GROUP), addr -> true, 
true).isEmpty());
     assertTrue(ctx.getServerPaths()
-        .getScanServer(rg -> rg.equals(TEST_RESOURCE_GROUP), addr -> 
addr.equals(hp), true)
+        .getScanServer(rg -> rg.equals(TEST_RESOURCE_GROUP), 
AddressPredicate.exact(hp), true)
         .isEmpty());
 
     EasyMock.verify(ctx, zc);
@@ -658,7 +659,7 @@ public class ServiceLockPathsTest {
 
     // query for a specific server
     results = ctx.getServerPaths().getScanServer(rg -> 
rg.equals(TEST_RESOURCE_GROUP),
-        addr -> addr.equals(hp), true);
+        AddressPredicate.exact(hp), true);
     assertEquals(1, results.size());
     iter = results.iterator();
     slp1 = iter.next();
@@ -669,7 +670,7 @@ public class ServiceLockPathsTest {
 
     // query for a wrong server
     results = ctx.getServerPaths().getScanServer(rg -> 
rg.equals(TEST_RESOURCE_GROUP),
-        addr -> addr.equals(HostAndPort.fromString("localhost:1234")), true);
+        AddressPredicate.exact(HostAndPort.fromString("localhost:1234")), 
true);
     assertEquals(0, results.size());
 
     EasyMock.verify(ctx, zc);
@@ -696,7 +697,7 @@ public class ServiceLockPathsTest {
     assertTrue(ctx.getServerPaths()
         .getTabletServer(rg -> rg.equals(TEST_RESOURCE_GROUP), addr -> true, 
true).isEmpty());
     assertTrue(ctx.getServerPaths()
-        .getTabletServer(rg -> rg.equals(TEST_RESOURCE_GROUP), addr -> 
addr.equals(hp), true)
+        .getTabletServer(rg -> rg.equals(TEST_RESOURCE_GROUP), 
AddressPredicate.exact(hp), true)
         .isEmpty());
 
     EasyMock.verify(ctx, zc);
@@ -812,7 +813,7 @@ public class ServiceLockPathsTest {
 
     // query for a specific server
     results = ctx.getServerPaths().getTabletServer(rg -> 
rg.equals(TEST_RESOURCE_GROUP),
-        addr -> addr.equals(hp), true);
+        AddressPredicate.exact(hp), true);
     assertEquals(1, results.size());
     iter = results.iterator();
     slp1 = iter.next();
@@ -823,7 +824,7 @@ public class ServiceLockPathsTest {
 
     // query for a wrong server
     results = ctx.getServerPaths().getTabletServer(rg -> 
rg.equals(TEST_RESOURCE_GROUP),
-        addr -> addr.equals(HostAndPort.fromString("localhost:1234")), true);
+        AddressPredicate.exact(HostAndPort.fromString("localhost:1234")), 
true);
     assertEquals(0, results.size());
 
     EasyMock.verify(ctx, zc);
@@ -849,9 +850,8 @@ public class ServiceLockPathsTest {
     assertTrue(ctx.getServerPaths().getDeadTabletServer(rg -> true, addr -> 
true, false).isEmpty());
     assertTrue(ctx.getServerPaths()
         .getDeadTabletServer(rg -> rg.equals(TEST_RESOURCE_GROUP), addr -> 
true, false).isEmpty());
-    assertTrue(ctx.getServerPaths()
-        .getDeadTabletServer(rg -> rg.equals(TEST_RESOURCE_GROUP), addr -> 
addr.equals(hp), false)
-        .isEmpty());
+    assertTrue(ctx.getServerPaths().getDeadTabletServer(rg -> 
rg.equals(TEST_RESOURCE_GROUP),
+        AddressPredicate.exact(hp), false).isEmpty());
 
     EasyMock.verify(ctx, zc);
 
@@ -946,7 +946,7 @@ public class ServiceLockPathsTest {
 
     // query for a specific server
     results = ctx.getServerPaths().getDeadTabletServer(rg -> 
rg.equals(TEST_RESOURCE_GROUP),
-        addr -> addr.equals(hp), false);
+        AddressPredicate.exact(hp), false);
     assertEquals(1, results.size());
     iter = results.iterator();
     slp1 = iter.next();
@@ -958,7 +958,7 @@ public class ServiceLockPathsTest {
 
     // query for a wrong server
     results = ctx.getServerPaths().getDeadTabletServer(rg -> 
rg.equals(TEST_RESOURCE_GROUP),
-        addr -> addr.equals(HostAndPort.fromString("localhost:1234")), false);
+        AddressPredicate.exact(HostAndPort.fromString("localhost:1234")), 
false);
     assertEquals(0, results.size());
 
     EasyMock.verify(ctx, zc);
diff --git 
a/server/base/src/main/java/org/apache/accumulo/server/manager/LiveTServerSet.java
 
b/server/base/src/main/java/org/apache/accumulo/server/manager/LiveTServerSet.java
index e5ed27b6c7..302e1b1161 100644
--- 
a/server/base/src/main/java/org/apache/accumulo/server/manager/LiveTServerSet.java
+++ 
b/server/base/src/main/java/org/apache/accumulo/server/manager/LiveTServerSet.java
@@ -30,7 +30,6 @@ import java.util.Map.Entry;
 import java.util.Optional;
 import java.util.Set;
 import java.util.concurrent.TimeUnit;
-import java.util.function.Predicate;
 
 import org.apache.accumulo.core.Constants;
 import org.apache.accumulo.core.clientImpl.thrift.ThriftSecurityException;
@@ -41,6 +40,7 @@ import 
org.apache.accumulo.core.fate.zookeeper.ZooCache.ZcStat;
 import org.apache.accumulo.core.lock.ServiceLock;
 import org.apache.accumulo.core.lock.ServiceLockData;
 import org.apache.accumulo.core.lock.ServiceLockPaths;
+import org.apache.accumulo.core.lock.ServiceLockPaths.AddressPredicate;
 import org.apache.accumulo.core.lock.ServiceLockPaths.ResourceGroupPredicate;
 import org.apache.accumulo.core.lock.ServiceLockPaths.ServiceLockPath;
 import org.apache.accumulo.core.manager.thrift.TabletServerStatus;
@@ -465,10 +465,7 @@ public class LiveTServerSet implements Watcher {
       ResourceGroupPredicate rgp = rg2 -> rg.equals(rg2);
       return rgp;
     }).orElse(rg -> true);
-    Predicate<HostAndPort> addrPredicate = address.map(addr -> {
-      Predicate<HostAndPort> ap = addr2 -> addr.equals(addr2);
-      return ap;
-    }).orElse(addr -> true);
+    AddressPredicate addrPredicate = 
address.map(AddressPredicate::exact).orElse(addr -> true);
     Set<ServiceLockPath> paths =
         context.getServerPaths().getTabletServer(rgPredicate, addrPredicate, 
false);
     if (paths.isEmpty() || paths.size() > 1) {
diff --git 
a/server/base/src/main/java/org/apache/accumulo/server/util/Admin.java 
b/server/base/src/main/java/org/apache/accumulo/server/util/Admin.java
index f1a6c492d4..7290a53669 100644
--- a/server/base/src/main/java/org/apache/accumulo/server/util/Admin.java
+++ b/server/base/src/main/java/org/apache/accumulo/server/util/Admin.java
@@ -77,6 +77,7 @@ import org.apache.accumulo.core.fate.zookeeper.MetaFateStore;
 import org.apache.accumulo.core.fate.zookeeper.ZooCache;
 import org.apache.accumulo.core.fate.zookeeper.ZooReaderWriter;
 import org.apache.accumulo.core.lock.ServiceLock;
+import org.apache.accumulo.core.lock.ServiceLockPaths;
 import org.apache.accumulo.core.lock.ServiceLockPaths.ServiceLockPath;
 import org.apache.accumulo.core.manager.thrift.FateService;
 import org.apache.accumulo.core.manager.thrift.TFateId;
@@ -679,8 +680,8 @@ public class Admin implements KeywordExecutable {
   static String qualifyWithZooKeeperSessionId(ClientContext context, ZooCache 
zooCache,
       String hostAndPort) {
     var hpObj = HostAndPort.fromString(hostAndPort);
-    Set<ServiceLockPath> paths =
-        context.getServerPaths().getTabletServer(rg -> true, addr -> 
addr.equals(hpObj), true);
+    Set<ServiceLockPath> paths = context.getServerPaths().getTabletServer(rg 
-> true,
+        ServiceLockPaths.AddressPredicate.exact(hpObj), true);
     if (paths.size() != 1) {
       return hostAndPort;
     }
diff --git 
a/server/base/src/main/java/org/apache/accumulo/server/util/TabletServerLocks.java
 
b/server/base/src/main/java/org/apache/accumulo/server/util/TabletServerLocks.java
index 32255b1e19..d46ffdb840 100644
--- 
a/server/base/src/main/java/org/apache/accumulo/server/util/TabletServerLocks.java
+++ 
b/server/base/src/main/java/org/apache/accumulo/server/util/TabletServerLocks.java
@@ -26,6 +26,7 @@ import 
org.apache.accumulo.core.fate.zookeeper.ZooReaderWriter;
 import org.apache.accumulo.core.lock.ServiceLock;
 import org.apache.accumulo.core.lock.ServiceLockData;
 import org.apache.accumulo.core.lock.ServiceLockData.ThriftService;
+import org.apache.accumulo.core.lock.ServiceLockPaths;
 import org.apache.accumulo.core.lock.ServiceLockPaths.ServiceLockPath;
 import org.apache.accumulo.server.ServerContext;
 
@@ -64,7 +65,7 @@ public class TabletServerLocks {
       } else {
         var hostAndPort = HostAndPort.fromString(lock);
         Set<ServiceLockPath> paths = 
context.getServerPaths().getTabletServer(rg -> true,
-            addr -> addr.equals(hostAndPort), true);
+            ServiceLockPaths.AddressPredicate.exact(hostAndPort), true);
         Preconditions.checkArgument(paths.size() == 1,
             lock + " does not match a single ZooKeeper TabletServer lock. 
matches=" + paths);
         ServiceLockPath path = paths.iterator().next();

Reply via email to