bharos opened a new issue, #10766:
URL: https://github.com/apache/gravitino/issues/10766

   ### Version
   
   main branch
   
   ### Describe what's wrong
   
   Tested this from Trino, with 
`iceberg.rest-catalog.vended-credentials-enabled=true`
   
   
   When credential vending is enabled ,Trino sends CREATE TABLE requests with 
stageCreate=true. In the Iceberg REST protocol, this means the table metadata 
is built in memory and returned to the client along with vended credentials — 
the table is not committed to the catalog at this point.
   
   However, IcebergTableHookDispatcher.createTable() unconditionally calls 
importTable(), which attempts to load the table from the Gravitino catalog via 
TableDispatcher.loadTable(). Since the table was only staged (not committed), 
this fails with NoSuchTableException.
   
   The table should only be imported into Gravitino's entity store when it is 
actually committed — which happens later via updateTable().
   
   
   ### Error message and/or stacktrace
   
   
   
   2026-04-13 19:45:47 INFO  [iceberg-rest-36] IcebergNamespaceOperations:173 - 
Check Iceberg namespace exists, catalog: RokuIcebergCatalog, namespace: 
gravitino_test_schema77
   2026-04-13 19:45:47 INFO  [iceberg-rest-38] IcebergTableOperations:160 - 
Create Iceberg table, catalog: RokuIcebergCatalog, namespace: 
gravitino_test_schema77, create table request: 
CreateTableRequest{name=sample_events, 
location=gs://roku-dea-dev/sand-box/gravitino/sandbox/gravitino_test_schema/sample_events,
 properties={write.format.default=PARQUET, format-version=2, 
write.parquet.compression-codec=}, schema=table {
     1: event_id: optional long
     2: user_id: optional long
     3: event_type: optional string
     4: event_value: optional double
     5: created_at: optional timestamp
     6: date_key: optional date
   }, partitionSpec=org.apache.iceberg.UnboundPartitionSpec@6b47e212, 
writeOrder=org.apache.iceberg.UnboundSortOrder@13691dc, stageCreate=true}, 
accessDelegation: vended-credentials, isCredentialVending: true
   2026-04-13 19:45:47 INFO  [iceberg-rest-38] IcebergCatalogWrapper:200 - 
Generate credential: gcs-token for Iceberg table: 
gravitino_test_schema77.sample_events
   2026-04-13 19:45:47 WARN  [iceberg-rest-38] IcebergExceptionMapper:84 - 
Iceberg REST server unexpected exception:
   org.apache.gravitino.exceptions.NoSuchTableException: Iceberg table does not 
exist: sample_events
     at 
org.apache.gravitino.catalog.lakehouse.iceberg.IcebergCatalogOperations.loadTable(IcebergCatalogOperations.java:393)
 ~[?:?]
     at 
org.apache.gravitino.catalog.TableOperationDispatcher.lambda$internalLoadTable$20(TableOperationDispatcher.java:502)
 ~[gravitino-core-1.2.0.jar:?]
     at 
org.apache.gravitino.catalog.CatalogManager$CatalogWrapper.lambda$doWithTableOps$1(CatalogManager.java:153)
 ~[gravitino-core-1.2.0.jar:?]
     at 
org.apache.gravitino.utils.IsolatedClassLoader.withClassLoader(IsolatedClassLoader.java:86)
 ~[gravitino-core-1.2.0.jar:?]
     at 
org.apache.gravitino.catalog.CatalogManager$CatalogWrapper.doWithTableOps(CatalogManager.java:148)
 ~[gravitino-core-1.2.0.jar:?]
     at 
org.apache.gravitino.catalog.TableOperationDispatcher.lambda$internalLoadTable$21(TableOperationDispatcher.java:502)
 ~[gravitino-core-1.2.0.jar:?]
     at 
org.apache.gravitino.catalog.OperationDispatcher.doWithCatalog(OperationDispatcher.java:97)
 ~[gravitino-core-1.2.0.jar:?]
     at 
org.apache.gravitino.catalog.TableOperationDispatcher.internalLoadTable(TableOperationDispatcher.java:500)
 ~[gravitino-core-1.2.0.jar:?]
     at 
org.apache.gravitino.catalog.TableOperationDispatcher.lambda$loadTable$3(TableOperationDispatcher.java:117)
 ~[gravitino-core-1.2.0.jar:?]
     at 
org.apache.gravitino.lock.TreeLockUtils.doWithTreeLock(TreeLockUtils.java:49) 
~[gravitino-core-1.2.0.jar:?]
     at 
org.apache.gravitino.catalog.TableOperationDispatcher.loadTable(TableOperationDispatcher.java:117)
 ~[gravitino-core-1.2.0.jar:?]
     at 
org.apache.gravitino.hook.TableHookDispatcher.loadTable(TableHookDispatcher.java:63)
 ~[gravitino-core-1.2.0.jar:?]
     at 
org.apache.gravitino.catalog.TableNormalizeDispatcher.loadTable(TableNormalizeDispatcher.java:63)
 ~[gravitino-core-1.2.0.jar:?]
     at 
org.apache.gravitino.listener.TableEventDispatcher.loadTable(TableEventDispatcher.java:99)
 ~[gravitino-core-1.2.0.jar:?]
     at 
org.apache.gravitino.iceberg.service.dispatcher.IcebergTableHookDispatcher.importTable(IcebergTableHookDispatcher.java:185)
 ~[gravitino-iceberg-rest-server-1.2.0.jar:?]
     at 
org.apache.gravitino.iceberg.service.dispatcher.IcebergTableHookDispatcher.createTable(IcebergTableHookDispatcher.java:60)
 ~[gravitino-iceberg-rest-server-1.2.0.jar:?]
     at 
org.apache.gravitino.iceberg.service.dispatcher.IcebergTableEventDispatcher.createTable(IcebergTableEventDispatcher.java:101)
 ~[gravitino-iceberg-rest-server-1.2.0.jar:?]
     at 
org.apache.gravitino.iceberg.service.rest.IcebergTableOperations.lambda$createTable$1(IcebergTableOperations.java:175)
 ~[gravitino-iceberg-rest-server-1.2.0.jar:?]
     at java.base/java.security.AccessController.doPrivileged(Unknown Source) 
~[?:?]
     at java.base/javax.security.auth.Subject.doAs(Unknown Source) ~[?:?]
     at org.apache.gravitino.utils.PrincipalUtils.doAs(PrincipalUtils.java:44) 
~[gravitino-core-1.2.0.jar:?]
     at org.apache.gravitino.server.web.Utils.doAs(Utils.java:202) 
~[gravitino-server-common-1.2.0.jar:?]
     at 
org.apache.gravitino.iceberg.service.rest.IcebergTableOperations.createTable(IcebergTableOperations.java:169)
 ~[gravitino-iceberg-rest-server-1.2.0.jar:?]
     at 
org.apache.gravitino.iceberg.service.rest.IcebergTableOperations_$$_jvst446_1._d2createTable(IcebergTableOperations_$$_jvst446_1.java)
 ~[gravitino-iceberg-rest-server-1.2.0.jar:?]
     at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native 
Method) ~[?:?]
     at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(Unknown 
Source) ~[?:?]
     at 
java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown 
Source) ~[?:?]
     at java.base/java.lang.reflect.Method.invoke(Unknown Source) ~[?:?]
     at 
org.glassfish.hk2.utilities.reflection.ReflectionHelper.invoke(ReflectionHelper.java:1268)
 ~[hk2-utils-2.6.1.jar:?]
     at 
org.jvnet.hk2.internal.MethodInterceptorHandler$MethodInvocationImpl.proceed(MethodInterceptorHandler.java:164)
 ~[hk2-locator-2.6.1.jar:?]
     at 
org.apache.gravitino.server.web.filter.BaseMetadataAuthorizationMethodInterceptor.invoke(BaseMetadataAuthorizationMethodInterceptor.java:203)
 ~[gravitino-iceberg-rest-server-1.2.0.jar:?]
     at 
org.jvnet.hk2.internal.MethodInterceptorHandler.invoke(MethodInterceptorHandler.java:97)
 ~[hk2-locator-2.6.1.jar:?]
     at 
org.apache.gravitino.iceberg.service.rest.IcebergTableOperations_$$_jvst446_1.createTable(IcebergTableOperations_$$_jvst446_1.java)
 ~[gravitino-iceberg-rest-server-1.2.0.jar:?]
     at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native 
Method) ~[?:?]
     at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(Unknown 
Source) ~[?:?]
     at 
java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown 
Source) ~[?:?]
     at java.base/java.lang.reflect.Method.invoke(Unknown Source) ~[?:?]
     at 
org.glassfish.jersey.server.model.internal.ResourceMethodInvocationHandlerFactory.lambda$static$0(ResourceMethodInvocationHandlerFactory.java:52)
 ~[jersey-server-2.41.jar:?]
     at 
org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher$1.run(AbstractJavaResourceMethodDispatcher.java:146)
 ~[jersey-server-2.41.jar:?]
     at 
org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.invoke(AbstractJavaResourceMethodDispatcher.java:189)
 ~[jersey-server-2.41.jar:?]
     at 
org.glassfish.jersey.server.model.internal.JavaResourceMethodDispatcherProvider$ResponseOutInvoker.doDispatch(JavaResourceMethodDispatcherProvider.java:176)
 ~[jersey-server-2.41.jar:?]
     at 
org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.dispatch(AbstractJavaResourceMethodDispatcher.java:93)
 ~[jersey-server-2.41.jar:?]
     at 
org.glassfish.jersey.server.model.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:478)
 ~[jersey-server-2.41.jar:?]
     at 
org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:400)
 ~[jersey-server-2.41.jar:?]
     at 
org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:81)
 ~[jersey-server-2.41.jar:?]
     at org.glassfish.jersey.server.ServerRuntime$1.run(ServerRuntime.java:256) 
~[jersey-server-2.41.jar:?]
     at org.glassfish.jersey.internal.Errors$1.call(Errors.java:248) 
~[jersey-common-2.41.jar:?]
     at org.glassfish.jersey.internal.Errors$1.call(Errors.java:244) 
~[jersey-common-2.41.jar:?]
     at org.glassfish.jersey.internal.Errors.process(Errors.java:292) 
~[jersey-common-2.41.jar:?]
     at org.glassfish.jersey.internal.Errors.process(Errors.java:274) 
~[jersey-common-2.41.jar:?]
     at org.glassfish.jersey.internal.Errors.process(Errors.java:244) 
~[jersey-common-2.41.jar:?]
     at 
org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:265)
 ~[jersey-common-2.41.jar:?]
     at 
org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:235) 
~[jersey-server-2.41.jar:?]
     at 
org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:684)
 ~[jersey-server-2.41.jar:?]
     at 
org.glassfish.jersey.servlet.WebComponent.serviceImpl(WebComponent.java:394) 
~[jersey-container-servlet-core-2.41.jar:?]
     at 
org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:346) 
~[jersey-container-servlet-core-2.41.jar:?]
     at 
org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:358)
 ~[jersey-container-servlet-core-2.41.jar:?]
     at 
org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:311)
 ~[jersey-container-servlet-core-2.41.jar:?]
     at 
org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:205)
 ~[jersey-container-servlet-core-2.41.jar:?]
     at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:799) 
~[jetty-servlet-9.4.51.v20230217.jar:9.4.51.v20230217]
     at 
org.eclipse.jetty.servlet.ServletHandler$ChainEnd.doFilter(ServletHandler.java:1656)
 ~[jetty-servlet-9.4.51.v20230217.jar:9.4.51.v20230217]
     at 
org.apache.gravitino.server.authentication.AuthenticationFilter.lambda$doFilter$0(AuthenticationFilter.java:89)
 ~[gravitino-server-common-1.2.0.jar:?]
     at java.base/java.security.AccessController.doPrivileged(Unknown Source) 
~[?:?]
     at java.base/javax.security.auth.Subject.doAs(Unknown Source) ~[?:?]
     at org.apache.gravitino.utils.PrincipalUtils.doAs(PrincipalUtils.java:44) 
~[gravitino-core-1.2.0.jar:?]
     at 
org.apache.gravitino.server.authentication.AuthenticationFilter.doFilter(AuthenticationFilter.java:86)
 ~[gravitino-server-common-1.2.0.jar:?]
     at org.eclipse.jetty.servlet.FilterHolder.doFilter(FilterHolder.java:193) 
~[jetty-servlet-9.4.51.v20230217.jar:9.4.51.v20230217]
     at 
org.eclipse.jetty.servlet.ServletHandler$Chain.doFilter(ServletHandler.java:1626)
 ~[jetty-servlet-9.4.51.v20230217.jar:9.4.51.v20230217]
     at 
org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:552) 
~[jetty-servlet-9.4.51.v20230217.jar:9.4.51.v20230217]
     at 
org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:233)
 ~[jetty-server-9.4.51.v20230217.jar:9.4.51.v20230217]
     at 
org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1440)
 ~[jetty-server-9.4.51.v20230217.jar:9.4.51.v20230217]
     at 
org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:188)
 ~[jetty-server-9.4.51.v20230217.jar:9.4.51.v20230217]
     at 
org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:505) 
~[jetty-servlet-9.4.51.v20230217.jar:9.4.51.v20230217]
     at 
org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:186)
 ~[jetty-server-9.4.51.v20230217.jar:9.4.51.v20230217]
     at 
org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1355)
 ~[jetty-server-9.4.51.v20230217.jar:9.4.51.v20230217]
     at 
org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141) 
~[jetty-server-9.4.51.v20230217.jar:9.4.51.v20230217]
     at 
org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:146)
 ~[jetty-server-9.4.51.v20230217.jar:9.4.51.v20230217]
     at 
org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:127) 
~[jetty-server-9.4.51.v20230217.jar:9.4.51.v20230217]
     at org.eclipse.jetty.server.Server.handle(Server.java:516) 
~[jetty-server-9.4.51.v20230217.jar:9.4.51.v20230217]
     at 
org.eclipse.jetty.server.HttpChannel.lambda$handle$1(HttpChannel.java:487) 
~[jetty-server-9.4.51.v20230217.jar:9.4.51.v20230217]
     at org.eclipse.jetty.server.HttpChannel.dispatch(HttpChannel.java:732) 
[jetty-server-9.4.51.v20230217.jar:9.4.51.v20230217]
     at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:479) 
[jetty-server-9.4.51.v20230217.jar:9.4.51.v20230217]
     at 
org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:277) 
[jetty-server-9.4.51.v20230217.jar:9.4.51.v20230217]
     at 
org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:311)
 [jetty-io-9.4.51.v20230217.jar:9.4.51.v20230217]
     at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:105) 
[jetty-io-9.4.51.v20230217.jar:9.4.51.v20230217]
     at org.eclipse.jetty.io.ChannelEndPoint$1.run(ChannelEndPoint.java:104) 
[jetty-io-9.4.51.v20230217.jar:9.4.51.v20230217]
     at 
org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.runTask(EatWhatYouKill.java:338)
 [jetty-util-9.4.51.v20230217.jar:9.4.51.v20230217]
     at 
org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.doProduce(EatWhatYouKill.java:315)
 [jetty-util-9.4.51.v20230217.jar:9.4.51.v20230217]
     at 
org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.tryProduce(EatWhatYouKill.java:173)
 [jetty-util-9.4.51.v20230217.jar:9.4.51.v20230217]
     at 
org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.run(EatWhatYouKill.java:131)
 [jetty-util-9.4.51.v20230217.jar:9.4.51.v20230217]
     at 
org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread.run(ReservedThreadExecutor.java:409)
 [jetty-util-9.4.51.v20230217.jar:9.4.51.v20230217]
     at 
org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:883)
 [jetty-util-9.4.51.v20230217.jar:9.4.51.v20230217]
     at 
org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:1034)
 [jetty-util-9.4.51.v20230217.jar:9.4.51.v20230217]
     at java.base/java.lang.Thread.run(Unknown Source) [?:?]
   Caused by: org.apache.iceberg.exceptions.NoSuchTableException: Table does 
not exist: gravitino_test_schema77.sample_events
     at 
org.apache.iceberg.BaseMetastoreCatalog.loadTable(BaseMetastoreCatalog.java:55) 
~[iceberg-core-1.10.1.jar:?]
     at 
org.apache.iceberg.rest.CatalogHandlers.loadTable(CatalogHandlers.java:329) 
~[iceberg-core-1.10.1.jar:?]
     at 
org.apache.gravitino.iceberg.common.ops.IcebergCatalogWrapper.loadTable(IcebergCatalogWrapper.java:207)
 ~[gravitino-iceberg-common-1.2.0.jar:?]
     at 
org.apache.gravitino.catalog.lakehouse.iceberg.IcebergCatalogOperations.loadTable(IcebergCatalogOperations.java:385)
 ~[?:?]
     ... 93 more
   
   
   
   
   
   ### How to reproduce
   
   
   Steps to reproduce:
   ```
   CREATE SCHEMA iceberg.gravitino_test_schema77
   WITH (location = 
'<prefix>/sand-box/gravitino/sandbox/gravitino_test_schema77/')
   
   
   CREATE TABLE iceberg.gravitino_test_schema77.sample_events (
       event_id    BIGINT,
       user_id     BIGINT,
       event_type  VARCHAR,
       event_value DOUBLE,
       created_at  TIMESTAMP(6),
       date_key    DATE
   )
   WITH (
       format       = 'PARQUET',
       partitioning = ARRAY['date_key'],
       location     = 
'<prefix>/sand-box/gravitino/sandbox/gravitino_test_schema/sample_events'
   );
   ```
   
   ### Additional context
   
   _No response_


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to