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]