This is an automated email from the ASF dual-hosted git repository.
roryqi pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/gravitino.git
The following commit(s) were added to refs/heads/main by this push:
new 7d0a8282fa [#10055] fix(authz): Fix `NoSuchEntityException` caused by
unimported schema entity (#10059)
7d0a8282fa is described below
commit 7d0a8282faee4d4760abdf7bc4c46d5271891cf3
Author: roryqi <[email protected]>
AuthorDate: Fri Feb 27 19:07:17 2026 +0800
[#10055] fix(authz): Fix `NoSuchEntityException` caused by unimported
schema entity (#10059)
### What changes were proposed in this pull request?
Fix `NoSuchEntityException` caused by unimported schema entity
### Why are the changes needed?
Fix: #10055
### Does this PR introduce _any_ user-facing change?
No.
### How was this patch tested?
Added cache IT.
---
.../TableAuthorizationCacheEnabledIT.java | 42 ++++++++++++++++++++++
.../test/authorization/TableAuthorizationIT.java | 9 +++++
.../server/authorization/MetadataAuthzHelper.java | 29 ++++++++++++++-
3 files changed, 79 insertions(+), 1 deletion(-)
diff --git
a/clients/client-java/src/test/java/org/apache/gravitino/client/integration/test/authorization/TableAuthorizationCacheEnabledIT.java
b/clients/client-java/src/test/java/org/apache/gravitino/client/integration/test/authorization/TableAuthorizationCacheEnabledIT.java
new file mode 100644
index 0000000000..06586f3f2e
--- /dev/null
+++
b/clients/client-java/src/test/java/org/apache/gravitino/client/integration/test/authorization/TableAuthorizationCacheEnabledIT.java
@@ -0,0 +1,42 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.gravitino.client.integration.test.authorization;
+
+import org.apache.gravitino.Configs;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.MethodOrderer;
+import org.junit.jupiter.api.Tag;
+import org.junit.jupiter.api.TestMethodOrder;
+
+/**
+ * Integration tests for table authorization with cache enabled. This test
class runs the same tests
+ * as {@link TableAuthorizationIT} but with the cache enabled to ensure
authorization works
+ * correctly with caching.
+ */
+@Tag("gravitino-docker-test")
+@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
+public class TableAuthorizationCacheEnabledIT extends TableAuthorizationIT {
+
+ @BeforeAll
+ @Override
+ public void startIntegrationTest() throws Exception {
+ customConfigs.put(Configs.CACHE_ENABLED.getKey(), "true");
+ super.startIntegrationTest();
+ }
+}
diff --git
a/clients/client-java/src/test/java/org/apache/gravitino/client/integration/test/authorization/TableAuthorizationIT.java
b/clients/client-java/src/test/java/org/apache/gravitino/client/integration/test/authorization/TableAuthorizationIT.java
index 64a7662683..af12862609 100644
---
a/clients/client-java/src/test/java/org/apache/gravitino/client/integration/test/authorization/TableAuthorizationIT.java
+++
b/clients/client-java/src/test/java/org/apache/gravitino/client/integration/test/authorization/TableAuthorizationIT.java
@@ -20,6 +20,7 @@ package
org.apache.gravitino.client.integration.test.authorization;
import static org.junit.Assert.assertThrows;
import static org.junit.jupiter.api.Assertions.assertArrayEquals;
+import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
import static org.junit.jupiter.api.Assertions.assertEquals;
import com.google.common.collect.ImmutableList;
@@ -132,12 +133,20 @@ public class TableAuthorizationIT extends
BaseRestApiAuthorizationIT {
public void testCreateTable() {
// owner can create table
TableCatalog tableCatalog =
client.loadMetalake(METALAKE).loadCatalog(CATALOG).asTableCatalog();
+
+ // ISSUE-10005: Fix NoSuchEntityException caused by unimported schema
entity
+ assertDoesNotThrow(
+ () -> {
+ tableCatalog.listTables(Namespace.of("default"));
+ });
+
tableCatalog.createTable(
NameIdentifier.of(SCHEMA, "table1"), createColumns(), "test", new
HashMap<>());
// ISSUE-9982: Schema default isn't imported before
tableCatalog.createTable(
NameIdentifier.of("default", "table2"), createColumns(), "test", new
HashMap<>());
+ tableCatalog.dropTable(NameIdentifier.of("default", "table2"));
// normal user cannot create table
TableCatalog tableCatalogNormalUser =
diff --git
a/server-common/src/main/java/org/apache/gravitino/server/authorization/MetadataAuthzHelper.java
b/server-common/src/main/java/org/apache/gravitino/server/authorization/MetadataAuthzHelper.java
index fedf1698ed..5a0f1ee8bf 100644
---
a/server-common/src/main/java/org/apache/gravitino/server/authorization/MetadataAuthzHelper.java
+++
b/server-common/src/main/java/org/apache/gravitino/server/authorization/MetadataAuthzHelper.java
@@ -17,6 +17,7 @@
package org.apache.gravitino.server.authorization;
+import com.google.common.base.Preconditions;
import java.lang.reflect.Array;
import java.security.Principal;
import java.util.ArrayList;
@@ -36,6 +37,7 @@ import org.apache.gravitino.GravitinoEnv;
import org.apache.gravitino.MetadataObject;
import org.apache.gravitino.Metalake;
import org.apache.gravitino.NameIdentifier;
+import org.apache.gravitino.Namespace;
import org.apache.gravitino.authorization.AuthorizationRequestContext;
import org.apache.gravitino.authorization.GravitinoAuthorizer;
import org.apache.gravitino.dto.tag.MetadataObjectDTO;
@@ -76,6 +78,13 @@ public class MetadataAuthzHelper {
Entity.EntityType.JOB,
Entity.EntityType.JOB_TEMPLATE);
+ /**
+ * Topic and Table may be from the external system and the schema may not
exist in Gravitino, so
+ * we need to import the schema first
+ */
+ private static final List<Entity.EntityType> REQUIRE_SCHEMA_EXISTS =
+ Arrays.asList(Entity.EntityType.TABLE, Entity.EntityType.TOPIC);
+
private MetadataAuthzHelper() {}
public static Metalake[] filterMetalakes(Metalake[] metalakes, String
expression) {
@@ -347,7 +356,10 @@ public class MetadataAuthzHelper {
private static void preloadToCache(
Entity.EntityType entityType, NameIdentifier[] nameIdentifiers) {
- if (!GravitinoEnv.getInstance().cacheEnabled()) {
+ // If cache is not enabled or access control dispatcher is not set, skip
preloading to cache
+ if (!GravitinoEnv.getInstance().cacheEnabled()
+ || GravitinoEnv.getInstance().accessControlDispatcher() == null
+ || nameIdentifiers.length == 0) {
return;
}
@@ -356,6 +368,21 @@ public class MetadataAuthzHelper {
return;
}
+ if (REQUIRE_SCHEMA_EXISTS.contains(entityType)) {
+ // For entity types that require schema existence, check if the schema
exists before
+ // preloading to cache
+ Namespace firstNamespace = nameIdentifiers[0].namespace();
+ Preconditions.checkArgument(
+ Arrays.stream(nameIdentifiers).allMatch(id ->
id.namespace().equals(firstNamespace)),
+ "All identifiers must have the same schema");
+
+ if (!GravitinoEnv.getInstance()
+ .schemaDispatcher()
+ .schemaExists(NameIdentifier.parse(firstNamespace.toString()))) {
+ return;
+ }
+ }
+
GravitinoEnv.getInstance()
.entityStore()
.batchGet(