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