Uh oh!
There was an error while loading. Please reload this page.
feat: Add async REST scan planning poll and plan storage credentials - #3724
Conversation
singhpk234
left a comment
There was a problem hiding this comment.
Thanks @lukeFalsina this is really promising, have some suggestions inline
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Thanks @lukeFalsina i think we are getting pretty close ! i think we should also add support for this scenario for this pr : iiuc for your testing you added a client side config to always do remote scan planning right ? |
lukeFalsina
commented
Aug 17, 2026
@singhpk234 Yes — initially in my testing I was setting the catalog-wide What you proposed makes more sense, so I've updated the PR to support it: the I also re-tested with the catalog-wide property unset and only the per-table Details are in #3724 (comment) and the latest commit on this PR. |
This comment was marked as outdated.
This comment was marked as outdated.
singhpk234
left a comment
There was a problem hiding this comment.
LGTM thanks @lukeFalsina !
added some minor suggestions
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Catalogs that return status=submitted from planTableScan can now be polled via
GET .../plan/{plan-id}, with best-effort cancel and scan-scoped FileIO rebuilt
from plan storage-credentials. Public RestCatalog.plan_scan still returns
list[FileScanTask].
Co-authored-by: Cursor <cursoragent@cursor.com>Address review feedback: note scan-planning-mode can come from catalog config, document async poll until terminal state, and restore the expand-plan-tasks section comments. Co-authored-by: Cursor <cursoragent@cursor.com>
Prefer scan-planning-mode from LoadTableResponse.config over the catalog-level property (matching Java), so REST catalogs can enable server-side planning only for selected tables. Invalid catalog values are ignored with a warning and no longer block a valid table override. Co-authored-by: Cursor <cursoragent@cursor.com>
Clarify async plans poll until a terminal state, and note that plan storage-credentials are the creds vended by the server. Co-authored-by: Cursor <cursoragent@cursor.com>
ac5caab to
6ead3e9CompareUh oh!
There was an error while loading. Please reload this page.
singhpk234
commented
Aug 24, 2026
Thanks for the contribution @lukeFalsina |
Summary
fetchPlanningResult/cancelPlanningpolling whenplanTableScanreturnsstatus=submittedstorage-credentialsto the scan-scoped FileIO (layered on existing IO properties)RestCatalog.plan_scan(...) -> list[FileScanTask]unchanged; credentials flow through internal_plan_scan_result/_file_io_from_planscan-planning-modefromLoadTableResponse.config, which takes precedence over the catalog-level /GET /v1/configsetting (same precedence as Java)Related: #2775, #3495
Java reference: apache/iceberg#13400 (async planning), apache/iceberg#15572 (table-level scan planning override)
Rationale
Unblocks REST catalogs that return async plans (for example policy-protected tables). Finishes the unchecked async items from #2775 and the plan-credential gap from #3495.
Per-table
loadTableoverrides let a server request Scan Plan API only where needed (e.g. policy-protected tables) while other tables keep client-side planning, without forcing a catalog-widescan-planning-mode=server.User-facing
table.scan()withscan-planning-mode=servernow handles async plans automaticallyrest-scan-planning.poll-timeout-ms(default 300000)RestCatalog.plan_scanreturn typescan-planning-modein the table'sloadTableresponseconfig(wins when present)GET /v1/configpropertyclientscan-planning-modevalues are ignored with a warning (they cannot block a validloadTableoverride or the default); invalidloadTablevalues still raiseTest plan
make lintmake test(3812+ passed)tests/catalog/test_scan_planning_models.pyfor poll success / timeout / failed / cancelled and IO property retentionloadTableoverride precedence, client default without override, and invalid catalog mode surviving a valid table overridescan-planning-modeMade with Cursor