{"record":{"id":"ef9f10e1d987f86e","repo":"apache/iceberg","slug":"max-concurrent-deletes-only-works-with-fileios-tha-ef9f10","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":"info","filePath":"spark/v4.1/spark/src/main/java/org/apache/iceberg/spark/procedures/RemoveOrphanFilesProcedure.java","lineNumber":176,"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":158,"sourceCodeEnd":194,"githubUrl":"https://github.com/apache/iceberg/blob/86d9c8fc543e7c56c9f624eb725f76c9baff9570/spark/v4.1/spark/src/main/java/org/apache/iceberg/spark/procedures/RemoveOrphanFilesProcedure.java#L158-L194","documentation":"RemoveOrphanFilesProcedure warns that max_concurrent_deletes only controls delete parallelism for FileIOs without bulk delete support. When the table's IO implements SupportsBulkOperations, deletes go through the IO's bulk API and the option is ignored.","triggerScenarios":"Calling CALL iceberg.system.remove_orphan_files(...) with max_concurrent_deletes set when table.io() instanceof SupportsBulkOperations.","commonSituations":"S3FileIO/GCSFileIO tables where users copied HadoopFileIO-era tuning parameters; scripts parameterized uniformly across tables with different IOs.","solutions":["Drop max_concurrent_deletes for bulk-capable IOs and tune the IO's bulk delete configuration instead","Only pass max_concurrent_deletes for IOs without SupportsBulkOperations","Consult the specific FileIO's docs for its bulk-delete parallelism properties"],"exampleFix":"// before\nCALL iceberg.system.remove_orphan_files(table => 'db.t', max_concurrent_deletes => 8)\n// after\nCALL iceberg.system.remove_orphan_files(table => 'db.t')  -- tune S3FileIO bulk delete via IO properties","handlingStrategy":"validation","validationCode":"if (maxConcurrentDeletes != null && table.io() instanceof SupportsBulkOperations) {\n  // drop the option; tune the IO's bulk delete instead\n}","typeGuard":"boolean bulkSupported = table.io() instanceof SupportsBulkOperations;","tryCatchPattern":null,"preventionTips":["Inspect table.io() before applying delete-parallelism options","Configure bulk-delete parallelism in the FileIO's own properties","Parameterize scripts per IO type rather than uniformly"],"tags":["spark","procedure","remove-orphan-files","bulk-delete"],"backgroundTag":"ignored-config-value","analyzedSha":"86d9c8fc543e7c56c9f624eb725f76c9baff9570","analyzedAt":"2026-09-12T00:46:39.097Z","contentChangedAt":"2026-09-12T00:46:39.097Z","schemaVersion":2},"datasetVersion":"2026-09-14T16:17:12.679Z"}