apache/druid · error · IOException
Recoverable exception
Error message
Recoverable exception
What it means
Retry-signaling wrapper in S3DataSegmentPuller.getByteSource's openStream: reading the S3 object threw an SdkException classified as retryable by S3Utils.S3RETRY (e.g. throttling, transient 5xx), which is rethrown as an IOException labeled 'Recoverable exception' so upstream retry logic can reattempt the stream.
Solutions
- Retry the segment load; the error is transient by design.
- If frequent, check S3 request rates/throttling and bucket region versus druid storage config.
- Verify S3 credentials and endpoint settings reduce transient failures.
Defensive patterns
Strategy: retry
When it happens
Trigger: Thrown at extensions-core/s3-extensions/src/main/java/org/apache/druid/storage/s3/S3DataSegmentPuller.java:162 when the library encounters an invalid state.
Common situations: See trigger scenarios.
AI-assisted analysis of apache/druid@9b90983fd2 (2026-09-07).
Data as JSON: /api/errors/b21c25abeaa479ff.
Report an issue: GitHub.
Appendix: source
Thrown at extensions-core/s3-extensions/src/main/java/org/apache/druid/storage/s3/S3DataSegmentPuller.java:162
throw new SegmentLoadingException(e, e.getMessage());
}
}
@Nonnull
private ByteSource getByteSource(URI uri)
{
final ByteSource byteSource = new ByteSource()
{
@Override
public InputStream openStream() throws IOException
{
try {
return buildFileObject(uri).openInputStream();
}
catch (SdkException e) {
if (e.getCause() != null) {
if (S3Utils.S3RETRY.apply(e)) {
throw new IOException("Recoverable exception", e);
}
}
throw new RuntimeException(e);
}
}
};
return byteSource;
}
@Override
public InputStream getInputStream(URI uri) throws IOException
{
try {
return buildFileObject(uri).openInputStream();
}
catch (SdkException e) {
throw new IOE(e, "Could not load URI [%s]", uri);
}View on GitHub (pinned to 9b90983fd2)