{"record":{"id":"b8287b29fd2120ee","repo":"apache/iceberg","slug":"max-concurrent-deletes-only-works-with-fileios-tha-b8287b","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/v4.2/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.2/spark/src/main/java/org/apache/iceberg/spark/procedures/RemoveOrphanFilesProcedure.java#L158-L194","documentation":"A LOG.warn in RemoveOrphanFilesProcedure.call: identical in meaning to the expire_snapshots case — max_concurrent_deletes applies only to FileIOs lacking bulk-delete support; when the table's IO implements SupportsBulkOperations the parameter is ignored and the IO's own bulk-delete settings govern parallelism.","triggerScenarios":"CALL catalog.system.remove_orphan_files(..., max_concurrent_deletes => N) where table.io() instanceof SupportsBulkOperations (e.g. S3FileIO, GCSFileIO).","commonSituations":"Same as 3736: stale tuning carried over from HadoopFileIO setups; template procedure calls applied to S3/GCS-backed tables.","solutions":["Drop max_concurrent_deletes when using a bulk-capable FileIO.","Adjust the IO's bulk-delete parallelism (e.g. s3.delete.batch-size for S3FileIO, or its client-level concurrency configuration).","See the FileIO implementation's docs for its bulk-delete tuning options."],"exampleFix":"// before\nCALL catalog.system.remove_orphan_files(table => 'db.t', max_concurrent_deletes => 16)\n// after\nCALL catalog.system.remove_orphan_files(table => 'db.t')\n-- tune s3.delete.batch-size / IO client concurrency instead","handlingStrategy":"validation","validationCode":"if (table.io() instanceof SupportsBulkOperations) {\n  // omit max_concurrent_deletes for remove_orphan_files\n}","typeGuard":"boolean bulkIo = table.io() instanceof org.apache.iceberg.io.SupportsBulkOperations;","tryCatchPattern":null,"preventionTips":["Drop max_concurrent_deletes when using S3/GCS FileIOs","Configure IO-level bulk delete parallelism instead","Keep per-table procedure scripts aligned with each table's FileIO type"],"tags":["spark","remove-orphan-files","fileio","bulk-delete","ignored-parameter"],"backgroundTag":"ignored-configuration-parameter","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"}