Skip to content

Commit c24b16d

Browse files
committed
Enable negative cache in VirtualTableInfoManager to improve performance
1 parent e03a522 commit c24b16d

File tree

2 files changed

+10
-7
lines changed

2 files changed

+10
-7
lines changed

core/src/main/java/com/scalar/db/common/VirtualTableInfoManager.java

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,24 +9,25 @@
99
import com.scalar.db.exception.storage.ExecutionException;
1010
import com.scalar.db.util.ScalarDbUtils;
1111
import java.util.Objects;
12+
import java.util.Optional;
1213
import java.util.concurrent.CompletionException;
1314
import java.util.concurrent.TimeUnit;
1415
import javax.annotation.Nullable;
1516
import javax.annotation.concurrent.ThreadSafe;
1617

17-
/** A class that manages and caches virtual table information */
18+
/** A class that manages and caches virtual table information. */
1819
@ThreadSafe
1920
public class VirtualTableInfoManager {
2021

21-
private final LoadingCache<TableKey, VirtualTableInfo> virtualTableInfoCache;
22+
private final LoadingCache<TableKey, Optional<VirtualTableInfo>> virtualTableInfoCache;
2223

2324
public VirtualTableInfoManager(DistributedStorageAdmin admin, long cacheExpirationTimeSecs) {
2425
Caffeine<Object, Object> builder = Caffeine.newBuilder();
2526
if (cacheExpirationTimeSecs >= 0) {
2627
builder.expireAfterWrite(cacheExpirationTimeSecs, TimeUnit.SECONDS);
2728
}
2829
virtualTableInfoCache =
29-
builder.build(key -> admin.getVirtualTableInfo(key.namespace, key.table).orElse(null));
30+
builder.build(key -> admin.getVirtualTableInfo(key.namespace, key.table));
3031
}
3132

3233
/**
@@ -60,7 +61,9 @@ public VirtualTableInfo getVirtualTableInfo(String namespace, String table)
6061
throws ExecutionException {
6162
try {
6263
TableKey key = new TableKey(namespace, table);
63-
return virtualTableInfoCache.get(key);
64+
Optional<VirtualTableInfo> virtualTableInfo = virtualTableInfoCache.get(key);
65+
assert virtualTableInfo != null;
66+
return virtualTableInfo.orElse(null);
6467
} catch (CompletionException e) {
6568
throw new ExecutionException(
6669
CoreError.GETTING_VIRTUAL_TABLE_INFO_FAILED.buildMessage(

core/src/test/java/com/scalar/db/common/VirtualTableInfoManagerTest.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -157,7 +157,7 @@ public void getVirtualTableInfo_WithCacheExpiration_ShouldExpireCache() throws E
157157
}
158158

159159
@Test
160-
public void getVirtualTableInfo_VirtualTableDoesNotExist_ShouldNotCacheNullResult()
160+
public void getVirtualTableInfo_VirtualTableDoesNotExist_ShouldCacheEmptyResult()
161161
throws Exception {
162162
// Arrange
163163
manager = new VirtualTableInfoManager(admin, -1);
@@ -168,8 +168,8 @@ public void getVirtualTableInfo_VirtualTableDoesNotExist_ShouldNotCacheNullResul
168168
manager.getVirtualTableInfo("ns", "table");
169169
manager.getVirtualTableInfo("ns", "table");
170170

171-
// Assert - admin should be called multiple times because null is not cached
172-
verify(admin, times(3)).getVirtualTableInfo("ns", "table");
171+
// Assert - admin should be called only once because Optional.empty() is cached
172+
verify(admin, times(1)).getVirtualTableInfo("ns", "table");
173173
}
174174

175175
@Test

0 commit comments

Comments
 (0)