henrib commented on code in PR #6441:
URL: https://github.com/apache/hive/pull/6441#discussion_r3791973475
##########
standalone-metastore/metastore-rest-catalog/src/main/java/org/apache/iceberg/rest/HMSCachingCatalog.java:
##########
@@ -33,65 +51,423 @@
import org.apache.iceberg.exceptions.NamespaceNotEmptyException;
import org.apache.iceberg.exceptions.NoSuchNamespaceException;
import org.apache.iceberg.hive.HiveCatalog;
+import org.apache.iceberg.hive.MetadataLocator;
import org.apache.iceberg.view.View;
import org.apache.iceberg.view.ViewBuilder;
+import org.jetbrains.annotations.TestOnly;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import com.github.benmanes.caffeine.cache.Ticker;
/**
* Class that wraps an Iceberg Catalog to cache tables.
*/
-public class HMSCachingCatalog extends CachingCatalog implements
SupportsNamespaces, ViewCatalog {
+public class HMSCachingCatalog extends CachingCatalog
+ implements SupportsNamespaces, ViewCatalog, HMSCachingCatalogMXBean,
Closeable {
+ protected static final Logger LOG =
LoggerFactory.getLogger(HMSCachingCatalog.class);
+
+ @TestOnly
+ private static SoftReference<HMSCachingCatalog> cacheRef = new
SoftReference<>(null);
+
+ @TestOnly
+ @SuppressWarnings("unchecked")
+ public static <C extends Catalog> C
getLatestCache(Function<HMSCachingCatalog, C> extractor) {
+ HMSCachingCatalog cache = cacheRef.get();
+ if (cache == null) {
+ return null;
+ }
+ return extractor == null ? (C) cache : extractor.apply(cache);
+ }
+
+ @TestOnly
+ public HiveCatalog getCatalog() {
+ return hiveCatalog;
+ }
+
+ // The underlying HiveCatalog instance.
private final HiveCatalog hiveCatalog;
-
- public HMSCachingCatalog(HiveCatalog catalog, long expiration) {
- super(catalog, true, expiration, Ticker.systemTicker());
+ // Duplicate because CachingCatalog doesn't expose the case sensitivity of
the underlying catalog,
+ // which is needed for canonicalizing identifiers before caching.
+ private final boolean caseSensitive;
+ // The locator.
+ private final MetadataLocator metadataLocator;
+ // An L1 small latency cache.
+ // This is used to cache the last cached time for each table identifier,
+ // so that we can skip location check for repeated access to the same table
within a short period of time,
+ // which can significantly reduce the latency for repeated access to the
same table.
+ private final Map<TableIdentifier, Long> l1Cache;
+ // The TTL for L1 cache (3s).
+ private final int l1Ttl;
+ // The L1 cache size.
+ private final int l1CacheSize;
+
+ // Metrics counters.
+ private final AtomicLong cacheHitCount = new AtomicLong(0);
Review Comment:
Adopted — switched all seven cache counters to LongAdder. The debug log
reads sum() only under isDebugEnabled() so the increment path stays
contention-free.
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]