Skip to content

Commit 2644c83

Browse files
committed
Disable negative cache for table metadata
1 parent 63cf2c2 commit 2644c83

File tree

6 files changed

+262
-41
lines changed

6 files changed

+262
-41
lines changed

build.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ subprojects {
4343
alloyDbJdbcConnectorVersion = '1.2.8'
4444
picocliVersion = '4.7.7'
4545
commonsTextVersion = '1.14.0'
46+
caffeineVersion = '2.9.3'
4647
junitVersion = '5.14.1'
4748
commonsLangVersion = '3.20.0'
4849
assertjVersion = '3.27.6'

core/build.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -194,6 +194,7 @@ dependencies {
194194
exclude group: 'org.slf4j', module: 'slf4j-api'
195195
}
196196
implementation "org.apache.commons:commons-text:${commonsTextVersion}"
197+
implementation "com.github.ben-manes.caffeine:caffeine:${caffeineVersion}"
197198
testImplementation platform("org.junit:junit-bom:${junitVersion}")
198199
testImplementation 'org.junit.jupiter:junit-jupiter'
199200
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'

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

Lines changed: 20 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,45 +1,45 @@
11
package com.scalar.db.common;
22

3-
import com.google.common.cache.CacheBuilder;
4-
import com.google.common.cache.CacheLoader;
5-
import com.google.common.cache.LoadingCache;
3+
import com.github.benmanes.caffeine.cache.CacheLoader;
4+
import com.github.benmanes.caffeine.cache.Caffeine;
5+
import com.github.benmanes.caffeine.cache.LoadingCache;
6+
import com.google.common.annotations.VisibleForTesting;
67
import com.scalar.db.api.Admin;
78
import com.scalar.db.api.Operation;
89
import com.scalar.db.api.TableMetadata;
910
import com.scalar.db.exception.storage.ExecutionException;
1011
import com.scalar.db.util.ScalarDbUtils;
1112
import com.scalar.db.util.ThrowableFunction;
1213
import java.util.Objects;
13-
import java.util.Optional;
14+
import java.util.concurrent.CompletionException;
1415
import java.util.concurrent.TimeUnit;
1516
import javax.annotation.Nonnull;
17+
import javax.annotation.Nullable;
1618
import javax.annotation.concurrent.ThreadSafe;
1719

1820
/** A class that manages and caches table metadata */
1921
@ThreadSafe
2022
public class TableMetadataManager {
2123

22-
private final LoadingCache<TableKey, Optional<TableMetadata>> tableMetadataCache;
24+
private final LoadingCache<TableKey, TableMetadata> tableMetadataCache;
2325

2426
public TableMetadataManager(Admin admin, long cacheExpirationTimeSecs) {
25-
this(
26-
key -> Optional.ofNullable(admin.getTableMetadata(key.namespace, key.table)),
27-
cacheExpirationTimeSecs);
27+
this(key -> admin.getTableMetadata(key.namespace, key.table), cacheExpirationTimeSecs);
2828
}
2929

3030
public TableMetadataManager(
31-
ThrowableFunction<TableKey, Optional<TableMetadata>, Exception> getTableMetadataFunc,
31+
ThrowableFunction<TableKey, TableMetadata, Exception> getTableMetadataFunc,
3232
long cacheExpirationTimeSecs) {
33-
CacheBuilder<Object, Object> builder = CacheBuilder.newBuilder();
33+
Caffeine<Object, Object> builder = Caffeine.newBuilder();
3434
if (cacheExpirationTimeSecs >= 0) {
3535
builder.expireAfterWrite(cacheExpirationTimeSecs, TimeUnit.SECONDS);
3636
}
3737
tableMetadataCache =
3838
builder.build(
39-
new CacheLoader<TableKey, Optional<TableMetadata>>() {
40-
@Nonnull
39+
new CacheLoader<TableKey, TableMetadata>() {
40+
@Nullable
4141
@Override
42-
public Optional<TableMetadata> load(@Nonnull TableKey key) throws Exception {
42+
public TableMetadata load(@Nonnull TableKey key) throws Exception {
4343
return getTableMetadataFunc.apply(key);
4444
}
4545
});
@@ -61,26 +61,28 @@ public TableMetadata getTableMetadata(Operation operation) throws ExecutionExcep
6161
}
6262

6363
/**
64-
* Returns a table metadata corresponding to the specified operation.
64+
* Returns a table metadata corresponding to the specified namespace and table.
6565
*
6666
* @param namespace a namespace to retrieve
6767
* @param table a table to retrieve
6868
* @return a table metadata. null if the table is not found.
6969
* @throws ExecutionException if the operation fails
7070
*/
71+
@Nullable
7172
public TableMetadata getTableMetadata(String namespace, String table) throws ExecutionException {
7273
try {
7374
TableKey key = new TableKey(namespace, table);
74-
return tableMetadataCache.get(key).orElse(null);
75-
} catch (java.util.concurrent.ExecutionException e) {
75+
return tableMetadataCache.get(key);
76+
} catch (CompletionException e) {
7677
throw new ExecutionException(
7778
CoreError.GETTING_TABLE_METADATA_FAILED.buildMessage(
7879
ScalarDbUtils.getFullTableName(namespace, table)),
79-
e);
80+
e.getCause());
8081
}
8182
}
8283

83-
public static class TableKey {
84+
@VisibleForTesting
85+
static class TableKey {
8486
public final String namespace;
8587
public final String table;
8688

core/src/main/java/com/scalar/db/transaction/consensuscommit/TransactionTableMetadataManager.java

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
11
package com.scalar.db.transaction.consensuscommit;
22

3-
import com.google.common.cache.CacheBuilder;
4-
import com.google.common.cache.CacheLoader;
5-
import com.google.common.cache.LoadingCache;
3+
import com.github.benmanes.caffeine.cache.CacheLoader;
4+
import com.github.benmanes.caffeine.cache.Caffeine;
5+
import com.github.benmanes.caffeine.cache.LoadingCache;
66
import com.scalar.db.api.DistributedStorageAdmin;
77
import com.scalar.db.api.Operation;
88
import com.scalar.db.api.TableMetadata;
99
import com.scalar.db.common.CoreError;
1010
import com.scalar.db.exception.storage.ExecutionException;
1111
import com.scalar.db.util.ScalarDbUtils;
1212
import java.util.Objects;
13-
import java.util.Optional;
13+
import java.util.concurrent.CompletionException;
1414
import java.util.concurrent.TimeUnit;
1515
import javax.annotation.Nonnull;
1616
import javax.annotation.Nullable;
@@ -19,27 +19,27 @@
1919
@ThreadSafe
2020
public class TransactionTableMetadataManager {
2121

22-
private final LoadingCache<TableKey, Optional<TransactionTableMetadata>> tableMetadataCache;
22+
private final LoadingCache<TableKey, TransactionTableMetadata> tableMetadataCache;
2323

2424
public TransactionTableMetadataManager(
2525
DistributedStorageAdmin admin, long cacheExpirationTimeSecs) {
2626

27-
CacheBuilder<Object, Object> builder = CacheBuilder.newBuilder();
27+
Caffeine<Object, Object> builder = Caffeine.newBuilder();
2828
if (cacheExpirationTimeSecs >= 0) {
2929
builder.expireAfterWrite(cacheExpirationTimeSecs, TimeUnit.SECONDS);
3030
}
3131
tableMetadataCache =
3232
builder.build(
33-
new CacheLoader<TableKey, Optional<TransactionTableMetadata>>() {
34-
@Nonnull
33+
new CacheLoader<TableKey, TransactionTableMetadata>() {
34+
@Nullable
3535
@Override
36-
public Optional<TransactionTableMetadata> load(@Nonnull TableKey key)
36+
public TransactionTableMetadata load(@Nonnull TableKey key)
3737
throws ExecutionException {
3838
TableMetadata tableMetadata = admin.getTableMetadata(key.namespace, key.table);
3939
if (tableMetadata == null) {
40-
return Optional.empty();
40+
return null;
4141
}
42-
return Optional.of(new TransactionTableMetadata(tableMetadata));
42+
return new TransactionTableMetadata(tableMetadata);
4343
}
4444
});
4545
}
@@ -74,12 +74,12 @@ public TransactionTableMetadata getTransactionTableMetadata(String namespace, St
7474
throws ExecutionException {
7575
try {
7676
TableKey key = new TableKey(namespace, table);
77-
return tableMetadataCache.get(key).orElse(null);
78-
} catch (java.util.concurrent.ExecutionException e) {
77+
return tableMetadataCache.get(key);
78+
} catch (CompletionException e) {
7979
throw new ExecutionException(
8080
CoreError.GETTING_TABLE_METADATA_FAILED.buildMessage(
8181
ScalarDbUtils.getFullTableName(namespace, table)),
82-
e);
82+
e.getCause());
8383
}
8484
}
8585

0 commit comments

Comments
 (0)