feat: Add async REST scan planning poll and plan storage credentials - #3724
feat: Add async REST scan planning poll and plan storage credentials#3724lukeFalsina wants to merge 4 commits into
Conversation
singhpk234
left a comment
There was a problem hiding this comment.
Thanks @lukeFalsina this is really promising, have some suggestions inline
|
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 ? |
|
@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
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
6ead3e9
Compare
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