Jay Milagroso created NIFI-16335:
------------------------------------

             Summary: PutIcebergRecord fails with UnsupportedOperationException 
on every table load against a REST catalog (freshness-aware loading not 
implemented in CredentialsRefreshRESTClient)
                 Key: NIFI-16335
                 URL: https://issues.apache.org/jira/browse/NIFI-16335
             Project: Apache NiFi
          Issue Type: Bug
          Components: NiFi API
    Affects Versions: 2.11.0
         Environment: NiFi 2.11.0, Java 21 (Oracle JDK 21.0.5), standalone 
(non-clustered)
REST Catalog: Apache Polaris 1.7.0 (Docker, PostgreSQL 16 persistence backend)
Storage: AWS S3 via IAM role-based access
            Reporter: Jay Milagroso


h3. Summary
PutIcebergRecord throws UnsupportedOperationException on every attempt
to load a target table, making the processor entirely unusable against
a REST Iceberg catalog performing freshness-aware table loading.
 
h3. Steps to Reproduce
1. Configure RESTIcebergCatalog controller service pointing at a working
   Apache Polaris REST catalog endpoint (catalog, namespace, and table
   independently confirmed reachable via direct REST API calls)
2. Configure PutIcebergRecord with valid Iceberg Catalog, Iceberg Writer
   (ParquetIcebergWriter), and Record Reader (JsonTreeReader), targeting
   an existing namespace/table
3. Feed the processor a valid flowfile matching the target schema
4. Start the processor
 
h3. Expected Result
Record is written to the Iceberg table; a new snapshot is committed.
 
h3. Actual Result
Processing halts immediately with:
{code}
java.lang.UnsupportedOperationException: Returning response headers is not 
supported
at org.apache.iceberg.rest.RESTClient.get(RESTClient.java:131)
at 
org.apache.iceberg.rest.RESTSessionCatalog.loadInternal(RESTSessionCatalog.java:438)
at 
org.apache.iceberg.rest.RESTSessionCatalog.loadTable(RESTSessionCatalog.java:468)
at 
org.apache.iceberg.catalog.BaseSessionCatalog$AsCatalog.loadTable(BaseSessionCatalog.java:105)
at 
org.apache.nifi.processors.iceberg.PutIcebergRecord.getTable(PutIcebergRecord.java:223)
at 
org.apache.nifi.processors.iceberg.PutIcebergRecord.processFlowFiles(PutIcebergRecord.java:165)
at 
org.apache.nifi.processors.iceberg.PutIcebergRecord.onTrigger(PutIcebergRecord.java:157)
{code}
 
h3. Root Cause Analysis
Iceberg core's RESTSessionCatalog.loadInternal() calls RESTClient.get(...)
using the header-returning overload introduced for freshness-aware /
ETag-based table loading. NiFi's custom REST client implementation,
org.apache.nifi.services.iceberg.catalog.CredentialsRefreshRESTClient,
does not implement this overload and throws UnsupportedOperationException
instead of returning response headers.
 
This is reproducible independent of Access Delegation Strategy - confirmed
with both "Vended Credentials" and "Disabled" settings, ruling out anything
credential-vending-specific. The failure occurs on the base loadTable call
itself, before any data or credential handling.
 
h3. Confirmed NOT the Cause (ruled out during investigation)
* Catalog/namespace/table configuration - table independently verified
  reachable and writable via direct curl against Polaris's REST API and
  via pyiceberg's RestCatalog
* IAM/S3 permissions - confirmed working via the same direct tests
* Access Delegation Strategy - identical failure under both tested settings
 
h3. Workaround
Writing to the same table via pyiceberg's RestCatalog.load_table() and
.append() succeeds without error, confirming the catalog/table/permissions
are correctly configured and the bug is isolated to
CredentialsRefreshRESTClient's incomplete RESTClient interface
implementation.
 
h3. Suggested Fix
Implement the header-returning get() overload in CredentialsRefreshRESTClient
(delegating to the underlying HTTP client's response headers), consistent
w



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to