diff --git a/core/src/main/java/com/scalar/db/common/VirtualTableInfoManager.java b/core/src/main/java/com/scalar/db/common/VirtualTableInfoManager.java index 96a6fae0d4..23fe36085b 100644 --- a/core/src/main/java/com/scalar/db/common/VirtualTableInfoManager.java +++ b/core/src/main/java/com/scalar/db/common/VirtualTableInfoManager.java @@ -9,16 +9,17 @@ import com.scalar.db.exception.storage.ExecutionException; import com.scalar.db.util.ScalarDbUtils; import java.util.Objects; +import java.util.Optional; import java.util.concurrent.CompletionException; import java.util.concurrent.TimeUnit; import javax.annotation.Nullable; import javax.annotation.concurrent.ThreadSafe; -/** A class that manages and caches virtual table information */ +/** A class that manages and caches virtual table information. */ @ThreadSafe public class VirtualTableInfoManager { - private final LoadingCache virtualTableInfoCache; + private final LoadingCache> virtualTableInfoCache; public VirtualTableInfoManager(DistributedStorageAdmin admin, long cacheExpirationTimeSecs) { Caffeine builder = Caffeine.newBuilder(); @@ -26,7 +27,7 @@ public VirtualTableInfoManager(DistributedStorageAdmin admin, long cacheExpirati builder.expireAfterWrite(cacheExpirationTimeSecs, TimeUnit.SECONDS); } virtualTableInfoCache = - builder.build(key -> admin.getVirtualTableInfo(key.namespace, key.table).orElse(null)); + builder.build(key -> admin.getVirtualTableInfo(key.namespace, key.table)); } /** @@ -60,7 +61,9 @@ public VirtualTableInfo getVirtualTableInfo(String namespace, String table) throws ExecutionException { try { TableKey key = new TableKey(namespace, table); - return virtualTableInfoCache.get(key); + Optional virtualTableInfo = virtualTableInfoCache.get(key); + assert virtualTableInfo != null; + return virtualTableInfo.orElse(null); } catch (CompletionException e) { throw new ExecutionException( CoreError.GETTING_VIRTUAL_TABLE_INFO_FAILED.buildMessage( diff --git a/core/src/test/java/com/scalar/db/common/VirtualTableInfoManagerTest.java b/core/src/test/java/com/scalar/db/common/VirtualTableInfoManagerTest.java index f67997bbc2..b45d870dd6 100644 --- a/core/src/test/java/com/scalar/db/common/VirtualTableInfoManagerTest.java +++ b/core/src/test/java/com/scalar/db/common/VirtualTableInfoManagerTest.java @@ -157,7 +157,7 @@ public void getVirtualTableInfo_WithCacheExpiration_ShouldExpireCache() throws E } @Test - public void getVirtualTableInfo_VirtualTableDoesNotExist_ShouldNotCacheNullResult() + public void getVirtualTableInfo_VirtualTableDoesNotExist_ShouldCacheEmptyResult() throws Exception { // Arrange manager = new VirtualTableInfoManager(admin, -1); @@ -168,8 +168,8 @@ public void getVirtualTableInfo_VirtualTableDoesNotExist_ShouldNotCacheNullResul manager.getVirtualTableInfo("ns", "table"); manager.getVirtualTableInfo("ns", "table"); - // Assert - admin should be called multiple times because null is not cached - verify(admin, times(3)).getVirtualTableInfo("ns", "table"); + // Assert - admin should be called only once because Optional.empty() is cached + verify(admin, times(1)).getVirtualTableInfo("ns", "table"); } @Test