Skip to content

Commit 9eba7cd

Browse files
Refactor IcebergMetadata credential cache into separate class
Moves the cred cache and related methods to a separate IcebergTableCredentialsProvider class to simplify credential handling.
1 parent 3c08065 commit 9eba7cd

2 files changed

Lines changed: 53 additions & 29 deletions

File tree

plugin/trino-iceberg/src/main/java/io/trino/plugin/iceberg/IcebergMetadata.java

Lines changed: 6 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -18,22 +18,19 @@
1818
import com.google.common.base.Splitter.MapSplitter;
1919
import com.google.common.base.Suppliers;
2020
import com.google.common.base.VerifyException;
21-
import com.google.common.cache.CacheBuilder;
2221
import com.google.common.collect.ImmutableList;
2322
import com.google.common.collect.ImmutableMap;
2423
import com.google.common.collect.ImmutableSet;
2524
import com.google.common.collect.Iterables;
2625
import com.google.common.collect.Lists;
2726
import com.google.common.collect.Sets;
2827
import com.google.common.collect.Streams;
29-
import com.google.common.util.concurrent.UncheckedExecutionException;
3028
import io.airlift.json.JsonCodec;
3129
import io.airlift.log.Logger;
3230
import io.airlift.slice.Slice;
3331
import io.airlift.slice.Slices;
3432
import io.airlift.units.DataSize;
3533
import io.airlift.units.Duration;
36-
import io.trino.cache.NonEvictableCache;
3734
import io.trino.filesystem.Location;
3835
import io.trino.filesystem.TrinoFileSystem;
3936
import io.trino.metastore.Column;
@@ -247,7 +244,6 @@
247244

248245
import static com.google.common.base.Preconditions.checkArgument;
249246
import static com.google.common.base.Preconditions.checkState;
250-
import static com.google.common.base.Throwables.throwIfUnchecked;
251247
import static com.google.common.base.Verify.verify;
252248
import static com.google.common.base.Verify.verifyNotNull;
253249
import static com.google.common.collect.ImmutableList.toImmutableList;
@@ -258,8 +254,6 @@
258254
import static com.google.common.collect.Maps.transformValues;
259255
import static com.google.common.collect.Sets.difference;
260256
import static io.airlift.units.Duration.ZERO;
261-
import static io.trino.cache.CacheUtils.uncheckedCacheGet;
262-
import static io.trino.cache.SafeCaches.buildNonEvictableCache;
263257
import static io.trino.filesystem.Locations.isS3Tables;
264258
import static io.trino.plugin.base.filter.UtcConstraintExtractor.extractTupleDomain;
265259
import static io.trino.plugin.base.projection.ApplyProjectionUtil.extractSupportedProjectedColumns;
@@ -512,7 +506,7 @@ public class IcebergMetadata
512506
private final int materializedViewRefreshMaxSnapshotsToExpire;
513507
private final Duration materializedViewRefreshSnapshotRetentionPeriod;
514508
private final Map<IcebergTableHandle, AtomicReference<TableStatistics>> tableStatisticsCache = new ConcurrentHashMap<>();
515-
private final NonEvictableCache<SchemaTableName, IcebergTableCredentials> tableCredentialsCache;
509+
private final IcebergTableCredentialsProvider tableCredentialsProvider;
516510
private final DeletionVectorWriter deletionVectorWriter;
517511

518512
private Transaction transaction;
@@ -552,42 +546,25 @@ public IcebergMetadata(
552546
this.deletionVectorWriter = requireNonNull(deletionVectorWriter, "deletionVectorWriter is null");
553547
this.materializedViewRefreshMaxSnapshotsToExpire = materializedViewRefreshMaxSnapshotsToExpire;
554548
this.materializedViewRefreshSnapshotRetentionPeriod = materializedViewRefreshSnapshotRetentionPeriod;
555-
this.tableCredentialsCache = buildNonEvictableCache(CacheBuilder.newBuilder());
549+
this.tableCredentialsProvider = new IcebergTableCredentialsProvider(catalog);
556550
}
557551

558552
@Override
559553
public Optional<ConnectorTableCredentials> getTableCredentials(ConnectorSession session, ConnectorTableHandle tableHandle)
560554
{
561-
return getOrLoadTableCredentials(session, getSchemaTableName(tableHandle));
555+
return tableCredentialsProvider.getTableCredentials(session, getSchemaTableName(tableHandle));
562556
}
563557

564558
@Override
565559
public Optional<ConnectorTableCredentials> getTableCredentials(ConnectorSession session, ConnectorWritableTableHandle tableHandle)
566560
{
567-
return getOrLoadTableCredentials(session, getSchemaTableName(tableHandle));
561+
return tableCredentialsProvider.getTableCredentials(session, getSchemaTableName(tableHandle));
568562
}
569563

570564
@Override
571565
public Optional<ConnectorTableCredentials> getTableCredentials(ConnectorSession session, ConnectorTableFunctionHandle tableFunctionHandle)
572566
{
573-
return getOrLoadTableCredentials(session, getSchemaTableName(tableFunctionHandle));
574-
}
575-
576-
private Optional<ConnectorTableCredentials> getOrLoadTableCredentials(ConnectorSession session, SchemaTableName schemaTableName)
577-
{
578-
try {
579-
return Optional.of(uncheckedCacheGet(
580-
tableCredentialsCache,
581-
schemaTableName,
582-
() -> {
583-
BaseTable baseTable = catalog.loadTable(session, schemaTableName);
584-
return new IcebergTableCredentials(baseTable.io().properties());
585-
}));
586-
}
587-
catch (UncheckedExecutionException e) {
588-
throwIfUnchecked(e.getCause());
589-
throw e;
590-
}
567+
return tableCredentialsProvider.getTableCredentials(session, getSchemaTableName(tableFunctionHandle));
591568
}
592569

593570
private static SchemaTableName getSchemaTableName(ConnectorTableHandle tableHandle)
@@ -1599,7 +1576,7 @@ private List<String> getChildNamespaces(ConnectorSession session, String parentN
15991576

16001577
private IcebergWritableTableHandle newWritableTableHandle(SchemaTableName name, Table table)
16011578
{
1602-
tableCredentialsCache.put(name, IcebergTableCredentials.forFileIO(table.io()));
1579+
tableCredentialsProvider.putTableCredentials(name, IcebergTableCredentials.forFileIO(table.io()));
16031580
SortFieldInfo sortInfo = getSupportedSortFields(table.schema(), table.sortOrder());
16041581
return new IcebergWritableTableHandle(
16051582
name,
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
/*
2+
* Licensed under the Apache License, Version 2.0 (the "License");
3+
* you may not use this file except in compliance with the License.
4+
* You may obtain a copy of the License at
5+
*
6+
* http://www.apache.org/licenses/LICENSE-2.0
7+
*
8+
* Unless required by applicable law or agreed to in writing, software
9+
* distributed under the License is distributed on an "AS IS" BASIS,
10+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11+
* See the License for the specific language governing permissions and
12+
* limitations under the License.
13+
*/
14+
package io.trino.plugin.iceberg;
15+
16+
import io.trino.plugin.iceberg.catalog.TrinoCatalog;
17+
import io.trino.spi.connector.ConnectorSession;
18+
import io.trino.spi.connector.ConnectorTableCredentials;
19+
import io.trino.spi.connector.SchemaTableName;
20+
21+
import java.util.Map;
22+
import java.util.Optional;
23+
import java.util.concurrent.ConcurrentHashMap;
24+
25+
import static java.util.Objects.requireNonNull;
26+
27+
public class IcebergTableCredentialsProvider
28+
{
29+
private final TrinoCatalog catalog;
30+
private final Map<SchemaTableName, IcebergTableCredentials> tableCredentials = new ConcurrentHashMap<>();
31+
32+
public IcebergTableCredentialsProvider(TrinoCatalog catalog)
33+
{
34+
this.catalog = requireNonNull(catalog, "catalog is null");
35+
}
36+
37+
public Optional<ConnectorTableCredentials> getTableCredentials(ConnectorSession session, SchemaTableName schemaTableName)
38+
{
39+
return Optional.of(tableCredentials.computeIfAbsent(schemaTableName, key ->
40+
new IcebergTableCredentials(catalog.loadTable(session, key).io().properties())));
41+
}
42+
43+
public void putTableCredentials(SchemaTableName schemaTableName, IcebergTableCredentials credentials)
44+
{
45+
tableCredentials.put(schemaTableName, credentials);
46+
}
47+
}

0 commit comments

Comments
 (0)