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

   ### What happened
   
   When an Iceberg table registered in Gravitino points to an Aliyun OSS 
metadata JSON that no longer exists, Gravitino's Iceberg REST service can spend 
a long time retrying the missing object. During that time, Gravitino 
table/tag/policy requests may hold tree locks for more than 30 seconds, causing 
the UI and metadata APIs for the same schema to appear stuck.
   
   ### Why this matters
   
   A single stale or externally damaged Iceberg table can degrade a whole 
schema's metadata browsing experience. This is especially visible in the web 
UI, which may issue table detail, tags, policies, and existence checks close 
together.
   
   ### Observed behavior
   
   For a table similar to `metalake.catalog.schema.table`, where the JDBC 
Iceberg catalog row still pointed at a missing metadata file, the Gravitino 
server log repeatedly showed:
   
   ```text
   Retrying task after failure: sleepTimeMs=... The specified key does not 
exist.
   <Key>.../metadata/00000-...metadata.json</Key>
   ```
   
   The same time window also showed tree-lock watchdog warnings similar to:
   
   ```text
   Thread with identifier 
ThreadIdentifier{thread=Thread[Gravitino-webserver-...,5,main], 
ident=metalake.catalog.schema.table} holds the lock node 
TreeLockNode{ident=/,...} for more than 30s ... io-connection hangs
   ```
   
   After unregistering/dropping the stale table entry, the same API returned 
quickly with `NoSuchTableException`/404.
   
   ### Expected behavior
   
   Missing Aliyun OSS metadata objects should be treated as a non-retryable 
not-found condition and should fail quickly. A stale table should not cause 
long retry loops that hold Gravitino tree locks and block unrelated metadata 
browsing in the same schema.
   
   ### Root cause analysis
   
   Gravitino 1.2.0 uses Iceberg 1.10.1. Iceberg's 
`BaseMetastoreTableOperations.refreshFromMetadataLocation` stops retrying on 
Iceberg `NotFoundException`, but the Aliyun OSS input stream path appears to 
propagate Aliyun SDK `OSSException` for `NoSuchKey` directly from 
`client.getObject(...)`. That exception is not classified as Iceberg 
`NotFoundException`, so Iceberg's generic retry path keeps retrying.
   
   By contrast, Iceberg's AWS S3 input stream maps `NoSuchKeyException` to 
`NotFoundException`, allowing the retry loop to stop quickly.
   
   Relevant upstream source references:
   
   - Iceberg retry stops on `NotFoundException`: 
`BaseMetastoreTableOperations.refreshFromMetadataLocation`
   - Iceberg Aliyun OSS stream reads with `client.getObject(...)` without 
translating `NoSuchKey`: `OSSInputStream.openStream`
   - Iceberg AWS S3 stream translates `NoSuchKeyException` to 
`NotFoundException`: `S3InputStream.openStream`
   - Gravitino table operations hold tree locks around load/drop paths: 
`TableOperationDispatcher.loadTable` and `dropTable`
   
   ### Possible fixes
   
   1. In Gravitino's Iceberg REST wrapper, classify Aliyun OSS 
`NoSuchKey`/`NoSuchBucket` failures from metadata loading as a not-found table 
condition instead of allowing generic retries to continue.
   2. Add a regression test around Iceberg REST `loadTable`/`tableExists` 
behavior when metadata loading fails with Aliyun OSS `NoSuchKey`.
   3. Longer term, consider avoiding heavyweight `loadTable` calls for shallow 
existence checks used by UI authorization/tag/policy flows.
   
   I am preparing a small PR for the fast-fail behavior.
   


-- 
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