Skip to content

Commit 95fb89a

Browse files
committed
metadata.catalogs should only list loaded catalogs
1 parent 0c5f6c8 commit 95fb89a

File tree

7 files changed

+113
-10
lines changed

7 files changed

+113
-10
lines changed

core/trino-main/src/main/java/io/trino/connector/CatalogConnector.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,8 @@ public CatalogConnector(
5555
connectorName,
5656
catalogConnector,
5757
informationSchemaConnector,
58-
systemConnector);
58+
systemConnector,
59+
true);
5960
}
6061

6162
public CatalogHandle getCatalogHandle()

core/trino-main/src/main/java/io/trino/connector/system/CatalogSystemTable.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,9 @@
2929
import io.trino.spi.connector.SystemTable;
3030
import io.trino.spi.predicate.TupleDomain;
3131

32+
import java.util.List;
33+
34+
import static com.google.common.collect.ImmutableList.toImmutableList;
3235
import static io.trino.metadata.MetadataListing.listCatalogs;
3336
import static io.trino.metadata.MetadataUtil.TableMetadataBuilder.tableMetadataBuilder;
3437
import static io.trino.spi.connector.SystemTable.Distribution.SINGLE_COORDINATOR;
@@ -72,7 +75,10 @@ public RecordCursor cursor(ConnectorTransactionHandle transactionHandle, Connect
7275
{
7376
Session session = ((FullConnectorSession) connectorSession).getSession();
7477
Builder table = InMemoryRecordSet.builder(CATALOG_TABLE);
75-
for (CatalogInfo catalogInfo : listCatalogs(session, metadata, accessControl)) {
78+
List<CatalogInfo> catalogInfos = listCatalogs(session, metadata, accessControl).stream()
79+
.filter(CatalogInfo::loaded)
80+
.collect(toImmutableList());
81+
for (CatalogInfo catalogInfo : catalogInfos) {
7682
table.addRow(
7783
catalogInfo.catalogName(),
7884
catalogInfo.catalogName(),

core/trino-main/src/main/java/io/trino/metadata/Catalog.java

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,14 +38,16 @@ public class Catalog
3838
private final ConnectorServices catalogConnector;
3939
private final ConnectorServices informationSchemaConnector;
4040
private final ConnectorServices systemConnector;
41+
private final boolean loaded;
4142

4243
public Catalog(
4344
CatalogName catalogName,
4445
CatalogHandle catalogHandle,
4546
ConnectorName connectorName,
4647
ConnectorServices catalogConnector,
4748
ConnectorServices informationSchemaConnector,
48-
ConnectorServices systemConnector)
49+
ConnectorServices systemConnector,
50+
boolean loaded)
4951
{
5052
this.catalogName = requireNonNull(catalogName, "catalogName is null");
5153
this.catalogHandle = requireNonNull(catalogHandle, "catalogHandle is null");
@@ -54,21 +56,23 @@ public Catalog(
5456
this.catalogConnector = requireNonNull(catalogConnector, "catalogConnector is null");
5557
this.informationSchemaConnector = requireNonNull(informationSchemaConnector, "informationSchemaConnector is null");
5658
this.systemConnector = requireNonNull(systemConnector, "systemConnector is null");
59+
this.loaded = loaded;
5760
}
5861

5962
public static Catalog failedCatalog(CatalogName catalogName, CatalogHandle catalogHandle, ConnectorName connectorName)
6063
{
61-
return new Catalog(catalogName, catalogHandle, connectorName);
64+
return new Catalog(catalogName, catalogHandle, connectorName, false);
6265
}
6366

64-
private Catalog(CatalogName catalogName, CatalogHandle catalogHandle, ConnectorName connectorName)
67+
private Catalog(CatalogName catalogName, CatalogHandle catalogHandle, ConnectorName connectorName, boolean loaded)
6568
{
6669
this.catalogName = catalogName;
6770
this.catalogHandle = catalogHandle;
6871
this.connectorName = connectorName;
6972
this.catalogConnector = null;
7073
this.informationSchemaConnector = null;
7174
this.systemConnector = null;
75+
this.loaded = loaded;
7276
}
7377

7478
public CatalogName getCatalogName()
@@ -86,6 +90,11 @@ public ConnectorName getConnectorName()
8690
return connectorName;
8791
}
8892

93+
public boolean isLoaded()
94+
{
95+
return loaded;
96+
}
97+
8998
public boolean isFailed()
9099
{
91100
return catalogConnector == null;

core/trino-main/src/main/java/io/trino/metadata/CatalogInfo.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,11 @@
1818

1919
import static java.util.Objects.requireNonNull;
2020

21-
public record CatalogInfo(String catalogName, CatalogHandle catalogHandle, ConnectorName connectorName)
21+
public record CatalogInfo(
22+
String catalogName,
23+
CatalogHandle catalogHandle,
24+
ConnectorName connectorName,
25+
boolean loaded)
2226
{
2327
public CatalogInfo
2428
{

core/trino-main/src/main/java/io/trino/transaction/InMemoryTransactionManager.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -423,7 +423,7 @@ private synchronized List<CatalogInfo> getActiveCatalogs()
423423
.distinct()
424424
.map(key -> registeredCatalogs.getOrDefault(key, Optional.empty()))
425425
.flatMap(Optional::stream)
426-
.map(catalog -> new CatalogInfo(catalog.getCatalogName().toString(), catalog.getCatalogHandle(), catalog.getConnectorName()))
426+
.map(catalog -> new CatalogInfo(catalog.getCatalogName().toString(), catalog.getCatalogHandle(), catalog.getConnectorName(), catalog.isLoaded()))
427427
.collect(toImmutableList());
428428
}
429429

@@ -436,7 +436,7 @@ private synchronized List<CatalogInfo> listCatalogs()
436436
return registeredCatalogs.values().stream()
437437
.filter(Optional::isPresent)
438438
.map(Optional::get)
439-
.map(catalog -> new CatalogInfo(catalog.getCatalogName().toString(), catalog.getCatalogHandle(), catalog.getConnectorName()))
439+
.map(catalog -> new CatalogInfo(catalog.getCatalogName().toString(), catalog.getCatalogHandle(), catalog.getConnectorName(), catalog.isLoaded()))
440440
.collect(toImmutableList());
441441
}
442442

testing/trino-product-tests/src/main/java/io/trino/tests/product/TestConfiguredFeatures.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,13 @@ public void selectConfiguredConnectors()
4747
throw new SkipException("Skip checking configured connectors since none were set in Tempto configuration");
4848
}
4949
String sql = "SELECT DISTINCT connector_name FROM system.metadata.catalogs";
50-
List<String> loadedCatalogs = onTrino().executeQuery(sql).column(1).stream().map(Object::toString).collect(toImmutableList());
51-
assertThat(configuredConnectors).containsExactlyInAnyOrder(loadedCatalogs.toArray(new String[0]));
50+
List<String> loadedCatalogs = onTrino().executeQuery(sql).column(1).stream()
51+
.map(Object::toString)
52+
.collect(toImmutableList());
53+
// TODO https://github.com/trinodb/trino/issues/26500
54+
// for now loki connector is not properly loaded, when this is fixed this test will fail
55+
List<String> filtered = configuredConnectors.stream().filter(connector -> !connector.equals("loki")).collect(toImmutableList());
56+
assertThat(filtered)
57+
.containsExactlyInAnyOrder(loadedCatalogs.toArray(new String[0]));
5258
}
5359
}
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
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.connector.system;
15+
16+
import com.google.common.collect.ImmutableMap;
17+
import com.google.inject.Key;
18+
import io.trino.Session;
19+
import io.trino.connector.ConnectorServicesProvider;
20+
import io.trino.plugin.memory.MemoryPlugin;
21+
import io.trino.spi.catalog.CatalogName;
22+
import io.trino.spi.catalog.CatalogProperties;
23+
import io.trino.spi.catalog.CatalogStore;
24+
import io.trino.spi.connector.ConnectorName;
25+
import io.trino.testing.AbstractTestQueryFramework;
26+
import io.trino.testing.DistributedQueryRunner;
27+
import io.trino.testing.QueryRunner;
28+
import org.junit.jupiter.api.Test;
29+
import org.junit.jupiter.api.parallel.Execution;
30+
31+
import static io.trino.testing.TestingSession.testSessionBuilder;
32+
import static org.junit.jupiter.api.parallel.ExecutionMode.SAME_THREAD;
33+
34+
@Execution(SAME_THREAD)
35+
public class TestSystemMetadataCatalogTable
36+
extends AbstractTestQueryFramework
37+
{
38+
private CatalogStore catalogStore;
39+
private ConnectorServicesProvider catalogManager;
40+
41+
@Override
42+
protected QueryRunner createQueryRunner()
43+
throws Exception
44+
{
45+
Session session = testSessionBuilder().build();
46+
QueryRunner queryRunner = DistributedQueryRunner.builder(session)
47+
.setWorkerCount(0)
48+
.build();
49+
queryRunner.installPlugin(new MemoryPlugin());
50+
queryRunner.createCatalog("healthy_catalog", "memory", ImmutableMap.of("memory.max-data-per-node", "128MB"));
51+
catalogStore = queryRunner.getCoordinator().getInstance(new Key<>() {});
52+
catalogManager = queryRunner.getCoordinator().getInstance(new Key<>() {});
53+
return queryRunner;
54+
}
55+
56+
@Test
57+
public void testCatalogTableShowsOnlyLoadedCatalogs()
58+
{
59+
assertQuery("SELECT * FROM system.metadata.catalogs", "VALUES" +
60+
"('healthy_catalog', 'healthy_catalog', 'memory'), " +
61+
"('system', 'system', 'system')");
62+
63+
assertUpdate("CREATE CATALOG brain USING memory WITH (\"memory.max-data-per-node\" = '128MB')");
64+
assertQuery("SELECT * FROM system.metadata.catalogs", "VALUES" +
65+
"('healthy_catalog', 'healthy_catalog', 'memory'), " +
66+
"('brain', 'brain', 'memory'), " +
67+
"('system', 'system', 'system')");
68+
CatalogProperties catalogProperties = catalogStore.createCatalogProperties(new CatalogName("broken"), new ConnectorName("memory"), ImmutableMap.of("memory.max-data-per-n", "128MB"));
69+
catalogStore.addOrReplaceCatalog(catalogProperties);
70+
catalogManager.loadInitialCatalogs();
71+
72+
assertQuery("SELECT * FROM system.metadata.catalogs", "VALUES" +
73+
"('healthy_catalog', 'healthy_catalog', 'memory'), " +
74+
"('brain', 'brain', 'memory'), " +
75+
"('system', 'system', 'system')");
76+
}
77+
}

0 commit comments

Comments
 (0)