{"record":{"id":"7d8d23de5aec558a","repo":"apache/iceberg","slug":"max-concurrent-deletes-only-works-with-fileios-tha-7d8d23","errorCode":null,"errorMessage":"max_concurrent_deletes only works with FileIOs that do not support bulk deletes. This table is currently using {} which supports bulk deletes so the parameter will be ignored. See that IO's documentation to learn how to adjust parallelism for that particular IO's bulk delete.","messagePattern":"max_concurrent_deletes only works with FileIOs that do not support bulk deletes\\. This table is currently using (.+?) which supports bulk deletes so the parameter will be ignored\\. See that IO's documentation to learn how to adjust parallelism for that particular IO's bulk delete\\.","errorType":"console","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"spark/v3.5/spark/src/main/java/org/apache/iceberg/spark/procedures/RemoveOrphanFilesProcedure.java","lineNumber":170,"sourceCode":"          if (olderThanMillis != null) {\n            boolean isTesting = Boolean.parseBoolean(spark().conf().get(\"spark.testing\", \"false\"));\n            if (!isTesting) {\n              validateInterval(olderThanMillis);\n            }\n            action.olderThan(olderThanMillis);\n          }\n\n          if (location != null) {\n            action.location(location);\n          }\n\n          if (dryRun) {\n            action.deleteWith(file -> {});\n          }\n\n          if (maxConcurrentDeletes != null) {\n            if (table.io() instanceof SupportsBulkOperations) {\n              LOG.warn(\n                  \"max_concurrent_deletes only works with FileIOs that do not support bulk deletes. This \"\n                      + \"table is currently using {} which supports bulk deletes so the parameter will be ignored. \"\n                      + \"See that IO's documentation to learn how to adjust parallelism for that particular \"\n                      + \"IO's bulk delete.\",\n                  table.io().getClass().getName());\n            } else {\n\n              action.executeDeleteWith(executorService(maxConcurrentDeletes, \"remove-orphans\"));\n            }\n          }\n\n          if (fileListView != null) {\n            action.compareToFileList(spark().table(fileListView));\n          }\n\n          action.equalSchemes(equalSchemes);\n          action.equalAuthorities(equalAuthorities);\n","sourceCodeStart":152,"sourceCodeEnd":188,"githubUrl":"https://github.com/apache/iceberg/blob/86d9c8fc543e7c56c9f624eb725f76c9baff9570/spark/v3.5/spark/src/main/java/org/apache/iceberg/spark/procedures/RemoveOrphanFilesProcedure.java#L152-L188","documentation":"Same as expire_snapshots: remove_orphan_files' max_concurrent_deletes option only applies to FileIOs that do not support bulk deletes. With a SupportsBulkOperations IO the parameter is ignored and this warning is logged.","triggerScenarios":"CALL iceberg.system.remove_orphan_files(...) with max_concurrent_deletes set while the table's FileIO implements SupportsBulkOperations.","commonSituations":"S3/GCS-backed tables where users expect max_concurrent_deletes to speed orphan cleanup; bulk-delete IOs handle parallelism internally.","solutions":["Drop max_concurrent_deletes from the remove_orphan_files call","Configure the FileIO's own bulk-delete concurrency/batch properties instead","Inspect table.io().getClass() in the warning and consult that IO's docs"],"exampleFix":"// before\nCALL iceberg.system.remove_orphan_files(table => 'db.t', max_concurrent_deletes => 10)\n-- after\nCALL iceberg.system.remove_orphan_files(table => 'db.t')","handlingStrategy":"validation","validationCode":"if (table.io() instanceof org.apache.iceberg.io.SupportsBulkOperations) { /* skip max_concurrent_deletes for remove_orphan_files */ }","typeGuard":"boolean bulkDeletes = table.io() instanceof org.apache.iceberg.io.SupportsBulkOperations;","tryCatchPattern":null,"preventionTips":["Mirror expire_snapshots guidance: only use max_concurrent_deletes with non-bulk IOs","Tune s3/gcs delete batch properties instead"],"tags":["spark","remove-orphan-files","fileio","config"],"backgroundTag":"conflicting-config-options","analyzedSha":"86d9c8fc543e7c56c9f624eb725f76c9baff9570","analyzedAt":"2026-09-12T00:46:39.097Z","contentChangedAt":"2026-09-12T00:46:39.097Z","schemaVersion":2},"datasetVersion":"2026-09-14T21:17:11.552Z"}