Skip to content

Commit e964783

Browse files
authored
[#9429] improvement(core): Use join to improve query performance on table, topic and so on. (#9430)
### What changes were proposed in this pull request? This pull request introduces major performance and functionality improvements to the Metalake and table metadata management system. The most significant change is the addition of a Caffeine-based cache for Metalake entities, which reduces redundant storage access and improves efficiency. Additionally, it adds a new method for querying tables by their fully qualified names and optimizes database schema indexing for faster lookups. ### Metalake caching and management improvements * Introduced a static Caffeine cache (`metalakeCache`) in `MetalakeManager` to store `BaseMetalake` objects, with automatic expiry and scheduled cleanup. This cache is now used in `metalakeInUse`, `loadMetalake`, and is invalidated on alter, drop, enable, and disable operations to ensure consistency. [[1]](diffhunk://#diff-21ed56786d4199a9ebee9969aae3195dff5037135c738ff4b8ba2072fa72d6a0R23-R36) [[2]](diffhunk://#diff-21ed56786d4199a9ebee9969aae3195dff5037135c738ff4b8ba2072fa72d6a0R74-R86) [[3]](diffhunk://#diff-21ed56786d4199a9ebee9969aae3195dff5037135c738ff4b8ba2072fa72d6a0L87-R107) [[4]](diffhunk://#diff-21ed56786d4199a9ebee9969aae3195dff5037135c738ff4b8ba2072fa72d6a0R138-R155) [[5]](diffhunk://#diff-21ed56786d4199a9ebee9969aae3195dff5037135c738ff4b8ba2072fa72d6a0R194-R209) [[6]](diffhunk://#diff-21ed56786d4199a9ebee9969aae3195dff5037135c738ff4b8ba2072fa72d6a0R301-R302) [[7]](diffhunk://#diff-21ed56786d4199a9ebee9969aae3195dff5037135c738ff4b8ba2072fa72d6a0R353-R354) [[8]](diffhunk://#diff-21ed56786d4199a9ebee9969aae3195dff5037135c738ff4b8ba2072fa72d6a0R381) [[9]](diffhunk://#diff-21ed56786d4199a9ebee9969aae3195dff5037135c738ff4b8ba2072fa72d6a0R416) ### Table metadata querying enhancements * Added a new method `selectTableByFullQualifiedName` to `TableMetaMapper`, its SQL provider, and the service layer, allowing retrieval of table metadata using metalake, catalog, schema, and table names directly, improving query flexibility and performance. [[1]](diffhunk://#diff-464816dcd4652ac061d317d0ed9ab3a98db358f2db517ce70bbf61fa35624db9R59-R67) [[2]](diffhunk://#diff-e160fd550934e3ac047abde64991c6ab5edc44602bf8cfd8587596f10b0b58efR72-R80) [[3]](diffhunk://#diff-19aff10a8b33dded8f085dc93250ba296ca800b5a68630a22537e83b0bd9b730R236-R292) [[4]](diffhunk://#diff-c0bc429f18cd462c3a3c1fe65c7da0966c338a96737d69b6e32b17257d97a52cL88-L92) [[5]](diffhunk://#diff-c0bc429f18cd462c3a3c1fe65c7da0966c338a96737d69b6e32b17257d97a52cR347-R363) ### Database schema and indexing optimizations * Added composite indexes (`idx_name_da`) on the `metalake_name`, `catalog_name`, `schema_name`, and `table_name` columns (with `deleted_at`) in both H2 and MySQL schema scripts, significantly improving query performance for lookups by name. [[1]](diffhunk://#diff-3ca2c363f5538fb4838a31233c4c858b4928e9ec65b5b86bf35a8c5f653133bfR31) [[2]](diffhunk://#diff-3ca2c363f5538fb4838a31233c4c858b4928e9ec65b5b86bf35a8c5f653133bfR49) [[3]](diffhunk://#diff-3ca2c363f5538fb4838a31233c4c858b4928e9ec65b5b86bf35a8c5f653133bfR66) [[4]](diffhunk://#diff-3ca2c363f5538fb4838a31233c4c858b4928e9ec65b5b86bf35a8c5f653133bfR83) [[5]](diffhunk://#diff-6fac45e3da22ec7d24ca5ec0b78c5a03d653fabd65dd8040b2c59404fc49fb21R33-R38) [[6]](diffhunk://#diff-ac6c56c7547bd70d3951716f2b543beea23964b906792b527b833e6229404f70R31) [[7]](diffhunk://#diff-ac6c56c7547bd70d3951716f2b543beea23964b906792b527b833e6229404f70R48) [[8]](diffhunk://#diff-ac6c56c7547bd70d3951716f2b543beea23964b906792b527b833e6229404f70R64) [[9]](diffhunk://#diff-ac6c56c7547bd70d3951716f2b543beea23964b906792b527b833e6229404f70R83) ### Why are the changes needed? To improve performance Fix: #9429 ### Does this PR introduce _any_ user-facing change? N/A ### How was this patch tested? Existing test
1 parent 0c28d77 commit e964783

File tree

66 files changed

+1291
-178
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

66 files changed

+1291
-178
lines changed

authorizations/authorization-chain/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ dependencies {
6060
testImplementation(project(":integration-test-common", "testArtifacts"))
6161
testImplementation(project(":authorizations:authorization-ranger"))
6262
testImplementation(project(":authorizations:authorization-ranger", "testArtifacts"))
63+
testImplementation(libs.awaitility)
6364
testImplementation(libs.junit.jupiter.api)
6465
testImplementation(libs.mockito.core)
6566
testImplementation(libs.testcontainers)

authorizations/authorization-ranger/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@ dependencies {
8080
testImplementation(project(":clients:client-java"))
8181
testImplementation(project(":server"))
8282
testImplementation(project(":integration-test-common", "testArtifacts"))
83+
testImplementation(libs.awaitility)
8384
testImplementation(libs.junit.jupiter.api)
8485
testImplementation(libs.mockito.core)
8586
testImplementation(libs.mockito.inline)

build.gradle.kts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,11 @@ allprojects {
154154
"import\\s+.*\\.(Logger|LoggerFactory);",
155155
"import org.slf4j.${'$'}1;"
156156
)
157+
replaceRegex(
158+
"Remove Testcontainers shading",
159+
"import\\s+org\\.testcontainers\\.shaded\\.([^;]+);",
160+
"import $1;"
161+
)
157162

158163
targetExclude("**/build/**", "**/.pnpm/***")
159164
}

catalogs/catalog-fileset/src/test/java/org/apache/gravitino/catalog/fileset/TestFilesetCatalogOperations.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,7 @@
111111
import org.apache.hadoop.fs.FileSystem;
112112
import org.apache.hadoop.fs.LocalFileSystem;
113113
import org.apache.hadoop.fs.Path;
114+
import org.awaitility.Awaitility;
114115
import org.junit.jupiter.api.AfterAll;
115116
import org.junit.jupiter.api.Assertions;
116117
import org.junit.jupiter.api.BeforeAll;
@@ -121,7 +122,6 @@
121122
import org.junit.jupiter.params.provider.MethodSource;
122123
import org.mockito.MockedStatic;
123124
import org.mockito.Mockito;
124-
import org.testcontainers.shaded.org.awaitility.Awaitility;
125125

126126
public class TestFilesetCatalogOperations {
127127

@@ -216,7 +216,7 @@ private static CatalogInfo randomCatalogInfo(
216216
}
217217

218218
@BeforeAll
219-
public static void setUp() {
219+
public static void setUp() throws IllegalAccessException {
220220
Config config = Mockito.mock(Config.class);
221221
when(config.get(ENTITY_STORE)).thenReturn(RELATIONAL_ENTITY_STORE);
222222
when(config.get(ENTITY_RELATIONAL_STORE)).thenReturn(DEFAULT_ENTITY_RELATIONAL_STORE);
@@ -336,6 +336,8 @@ public static void setUp() {
336336
schemaMetaServiceMockedStatic
337337
.when(SchemaMetaService::getInstance)
338338
.thenReturn(spySchemaMetaService);
339+
340+
FieldUtils.writeField(GravitinoEnv.getInstance(), "config", config, true);
339341
}
340342

341343
@AfterAll

catalogs/catalog-fileset/src/test/java/org/apache/gravitino/catalog/fileset/integration/test/FilesetS3CatalogIT.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
import org.apache.hadoop.conf.Configuration;
3939
import org.apache.hadoop.fs.FileSystem;
4040
import org.apache.hadoop.fs.Path;
41+
import org.awaitility.Awaitility;
4142
import org.junit.jupiter.api.AfterAll;
4243
import org.junit.jupiter.api.Assertions;
4344
import org.junit.jupiter.api.BeforeAll;
@@ -46,7 +47,6 @@
4647
import org.slf4j.Logger;
4748
import org.slf4j.LoggerFactory;
4849
import org.testcontainers.containers.Container;
49-
import org.testcontainers.shaded.org.awaitility.Awaitility;
5050

5151
@Tag("gravitino-docker-test")
5252
public class FilesetS3CatalogIT extends FilesetCatalogIT {

catalogs/catalog-hive/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ dependencies {
6565
annotationProcessor(libs.immutables.value)
6666
annotationProcessor(libs.lombok)
6767

68+
testImplementation(libs.awaitility)
6869
testImplementation(project(":catalogs:hive-metastore-common", "testArtifacts"))
6970
testImplementation(project(":common"))
7071
testImplementation(project(":clients:client-java"))

catalogs/catalog-hive/src/test/java/org/apache/gravitino/catalog/hive/integration/test/CatalogHiveS3IT.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,11 +29,11 @@
2929
import org.apache.hadoop.conf.Configuration;
3030
import org.apache.hadoop.fs.FileSystem;
3131
import org.apache.spark.sql.SparkSession;
32+
import org.awaitility.Awaitility;
3233
import org.junit.jupiter.api.TestInstance;
3334
import org.slf4j.Logger;
3435
import org.slf4j.LoggerFactory;
3536
import org.testcontainers.containers.Container;
36-
import org.testcontainers.shaded.org.awaitility.Awaitility;
3737

3838
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
3939
public class CatalogHiveS3IT extends CatalogHive3IT {

catalogs/catalog-jdbc-doris/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ dependencies {
4949
testImplementation(project(":server"))
5050
testImplementation(project(":server-common"))
5151

52+
testImplementation(libs.awaitility)
5253
testImplementation(libs.junit.jupiter.api)
5354
testImplementation(libs.junit.jupiter.params)
5455
testImplementation(libs.mysql.driver)

catalogs/catalog-jdbc-doris/src/test/java/org/apache/gravitino/catalog/doris/integration/test/CatalogDorisIT.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,13 +78,13 @@
7878
import org.apache.gravitino.rel.partitions.RangePartition;
7979
import org.apache.gravitino.rel.types.Types;
8080
import org.apache.gravitino.utils.RandomNameUtils;
81+
import org.awaitility.Awaitility;
8182
import org.junit.jupiter.api.AfterAll;
8283
import org.junit.jupiter.api.AfterEach;
8384
import org.junit.jupiter.api.Assertions;
8485
import org.junit.jupiter.api.BeforeAll;
8586
import org.junit.jupiter.api.Tag;
8687
import org.junit.jupiter.api.Test;
87-
import org.testcontainers.shaded.org.awaitility.Awaitility;
8888

8989
@Tag("gravitino-docker-test")
9090
public class CatalogDorisIT extends BaseIT {

catalogs/catalog-jdbc-doris/src/test/java/org/apache/gravitino/catalog/doris/operation/TestDorisTableOperations.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,11 +55,11 @@
5555
import org.apache.gravitino.rel.types.Type;
5656
import org.apache.gravitino.rel.types.Types;
5757
import org.apache.gravitino.utils.RandomNameUtils;
58+
import org.awaitility.Awaitility;
5859
import org.junit.jupiter.api.Assertions;
5960
import org.junit.jupiter.api.BeforeAll;
6061
import org.junit.jupiter.api.Tag;
6162
import org.junit.jupiter.api.Test;
62-
import org.testcontainers.shaded.org.awaitility.Awaitility;
6363

6464
@Tag("gravitino-docker-test")
6565
public class TestDorisTableOperations extends TestDoris {

0 commit comments

Comments
 (0)