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

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

commit 23ff6460c0e5479f4738219829ce2de6fd3a0951
Merge: c54d544758 f5885481e3
Author: Keith Turner <ktur...@apache.org>
AuthorDate: Tue May 28 19:54:57 2024 +0000

    Merge commit 'f5885481e32f6e7ffc41d391530654156e1a8522' into elasticity

 .../org/apache/accumulo/core/conf/Property.java    | 11 +++-
 .../org/apache/accumulo/tserver/ScanServer.java    | 36 ++++++++++-
 .../test/ScanServerConcurrentTabletScanIT.java     | 69 ++++++++++++++++++++--
 3 files changed, 107 insertions(+), 9 deletions(-)

diff --cc core/src/main/java/org/apache/accumulo/core/conf/Property.java
index 17226fcbf8,aa6533bb53..6dce260fc2
--- a/core/src/main/java/org/apache/accumulo/core/conf/Property.java
+++ b/core/src/main/java/org/apache/accumulo/core/conf/Property.java
@@@ -480,12 -436,20 +480,21 @@@ public enum Property 
        "3.0.0"),
    @Experimental
    
SSERV_CACHED_TABLET_METADATA_EXPIRATION("sserver.cache.metadata.expiration", 
"5m",
-       PropertyType.TIMEDURATION, "The time after which cached tablet metadata 
will be refreshed.",
+       PropertyType.TIMEDURATION,
+       "The time after which cached tablet metadata will be expired if not 
previously refreshed.",
        "2.1.0"),
    @Experimental
+   
SSERV_CACHED_TABLET_METADATA_REFRESH_PERCENT("sserver.cache.metadata.refresh.percent",
 ".75",
+       PropertyType.FRACTION,
+       "The time after which cached tablet metadata will be refreshed, 
expressed as a "
+           + "percentage of the expiration time. Cache hits after this time, 
but before the "
+           + "expiration time, will trigger a background refresh for future 
hits. "
+           + "Value must be less than 100%. Set to 0 will disable refresh.",
+       "2.1.3"),
+   @Experimental
    SSERV_PORTSEARCH("sserver.port.search", "true", PropertyType.BOOLEAN,
 -      "if the ports above are in use, search higher ports until one is 
available.", "2.1.0"),
 +      "if the sserver.port.client ports are in use, search higher ports until 
one is available.",
 +      "2.1.0"),
    @Experimental
    SSERV_CLIENTPORT("sserver.port.client", "9996", PropertyType.PORT,
        "The port used for handling client connections on the tablet servers.", 
"2.1.0"),
diff --cc 
server/tserver/src/main/java/org/apache/accumulo/tserver/ScanServer.java
index 323117c0c3,201bfada4f..3b652aee87
--- a/server/tserver/src/main/java/org/apache/accumulo/tserver/ScanServer.java
+++ b/server/tserver/src/main/java/org/apache/accumulo/tserver/ScanServer.java
@@@ -241,10 -247,32 +244,34 @@@ public class ScanServer extends Abstrac
          LOG.warn(
              "Tablet metadata caching less than one minute, may cause 
excessive scans on metadata table.");
        }
-       tabletMetadataCache =
+ 
+       // Get the cache refresh percentage property
+       // Value must be less than 100% as 100 or over would effectively 
disable it
+       double cacheRefreshPercentage =
+           
getConfiguration().getFraction(Property.SSERV_CACHED_TABLET_METADATA_REFRESH_PERCENT);
+       Preconditions.checkArgument(cacheRefreshPercentage < cacheExpiration,
+           "Tablet metadata cache refresh percentage is '%s' but must be less 
than 1",
+           cacheRefreshPercentage);
+ 
+       tmCacheExecutor = 
context.threadPools().getPoolBuilder("scanServerTmCache").numCoreThreads(8)
+           .enableThreadPoolMetrics().build();
 -      var builder = Caffeine.newBuilder().expireAfterWrite(cacheExpiration, 
TimeUnit.MILLISECONDS)
 -          
.scheduler(Scheduler.systemScheduler()).executor(tmCacheExecutor).recordStats();
++      var builder =
 +          
context.getCaches().createNewBuilder(CacheName.SCAN_SERVER_TABLET_METADATA, 
true)
 +              .expireAfterWrite(cacheExpiration, TimeUnit.MILLISECONDS)
-               
.scheduler(Scheduler.systemScheduler()).recordStats().build(tabletMetadataLoader);
++              
.scheduler(Scheduler.systemScheduler()).executor(tmCacheExecutor).recordStats();
+       if (cacheRefreshPercentage > 0) {
+         // Compute the refresh time as a percentage of the expiration time
+         // Cache hits after this time, but before expiration, will trigger a 
background
+         // non-blocking refresh of the entry so future cache hits get an 
updated entry
+         // without having to block for a refresh
+         long cacheRefresh = (long) (cacheExpiration * cacheRefreshPercentage);
+         LOG.debug("Tablet metadata refresh percentage set to {}, refresh time 
set to {} ms",
+             cacheRefreshPercentage, cacheRefresh);
+         builder.refreshAfterWrite(cacheRefresh, TimeUnit.MILLISECONDS);
+       } else {
+         LOG.warn("Tablet metadata cache refresh disabled, may cause blocking 
on cache expiration.");
+       }
+       tabletMetadataCache = builder.build(tabletMetadataLoader);
      }
  
      delegate = newThriftScanClientHandler(new WriteTracker());
diff --cc 
test/src/main/java/org/apache/accumulo/test/ScanServerConcurrentTabletScanIT.java
index 0a9009a8df,8e22b9e203..96ed262b31
--- 
a/test/src/main/java/org/apache/accumulo/test/ScanServerConcurrentTabletScanIT.java
+++ 
b/test/src/main/java/org/apache/accumulo/test/ScanServerConcurrentTabletScanIT.java
@@@ -91,10 -92,10 +92,10 @@@ public class ScanServerConcurrentTablet
      
SharedMiniClusterBase.getCluster().getClusterControl().stop(ServerType.SCAN_SERVER);
  
      Map<String,String> overrides = new HashMap<>();
-     overrides.put(Property.SSERV_CACHED_TABLET_METADATA_EXPIRATION.getKey(),
-         cacheEnabled ? "300m" : "0m");
+     overrides.put(Property.SSERV_CACHED_TABLET_METADATA_EXPIRATION.getKey(), 
cacheExpiration);
+     
overrides.put(Property.SSERV_CACHED_TABLET_METADATA_REFRESH_PERCENT.getKey(), 
cacheRefresh);
      
SharedMiniClusterBase.getCluster().getClusterControl().start(ServerType.SCAN_SERVER,
 overrides,
 -        1);
 +        1, null);
      while (zrw.getChildren(scanServerRoot).size() == 0) {
        Thread.sleep(500);
      }

Reply via email to