apache/hadoop · error · PathIOException
No data returned from GET request
Error message
No data returned from GET request
What it means
PathIOException from ChangeTracker.processResponse when the GET response carries no object while the tracker holds no revision id (revisionId == null), i.e. change detection has no expectation to compare against yet the store still returned nothing. It is the defensive sibling of the RemoteFileChangedException branch: the response is empty, but there is no revision evidence to attribute it to a concurrent modification, so it surfaces as a generic IO failure on the URI with the fixed message 'No data returned from GET request'.
Source
Thrown at hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/ChangeTracker.java:189
final String operation,
final long pos) throws PathIOException {
if (object == null) {
// no object returned. Either mismatch or something odd.
if (revisionId != null) {
// the requirements of the change detection policy wasn't met: the
// object was not returned.
versionMismatches.versionMismatchError();
throw new RemoteFileChangedException(uri, operation,
String.format(CHANGE_REPORTED_BY_S3
+ " during %s"
+ " at position %s."
+ " %s %s was unavailable",
operation,
pos,
getSource(),
getRevisionId()));
} else {
throw new PathIOException(uri, "No data returned from GET request");
}
}
processMetadata(object, operation);
}
/**
* Process the response from the server for validation against the
* change policy.
* @param copyObjectResponse response of a copy operation
* @throws PathIOException raised on failure
* @throws RemoteFileChangedException if the remote file has changed.
*/
public void processResponse(final CopyObjectResponse copyObjectResponse)
throws PathIOException {
// ETag (sometimes, depending on encryption and/or multipart) is not the
// same on the copied object as the original. Version Id seems to never
// be the same on the copy. As such, there isn't really anything thatView on GitHub (pinned to 2add963021)
Solutions
- Retry the read: with no revision mismatch implicated, the failure is treated as transient I/O
- If it recurs, capture network-level evidence (SDK request id, proxy logs) -- an intermediary may be truncating responses
- Check the object still exists at the URI named in the exception
- Confirm fs.s3a.change.detection.policy configuration if consistent revision checking was expected but revisionId is null
Defensive patterns
Strategy: retry
Try / catch
try {
tracker.processResponse(object, operation, pos);
} catch (PathIOException e) {
if ("No data returned from GET request".equals(e.getMessage())) {
// empty GET with no revision expectation: transient -- backoff and retry
throw new RetriableException(e);
}
throw e;
} Prevention
- Retry transient empty GET responses with exponential backoff before failing the task
- Capture SDK request ids when it recurs to correlate with S3 support or proxy logs
- Verify the object still exists (HEAD) before retrying to distinguish deletion from transient emptiness
When it happens
Trigger: processResponse invoked with a null GetObjectResponse while operating without a recorded revision -- for example a read with change detection effectively inactive (policy none or first response) hitting an empty/aborted response from S3 or an intermediary.
Common situations: Transient empty responses from proxies, gateways or S3 itself (throttling, connection resets); object deleted between two phases of an operation when no revision was captured; SDK-level response handling returning null bodies under load.
Related errors
- Change reported by S3 during %s at position %s. %s %s was un
- %s: Stream is closed!
- Filesystem %s closed
- Stream is closed!
- Cannot seek to a negative offset
AI-assisted analysis of apache/hadoop@2add963021 (2026-08-22).
Data as JSON: /api/errors/c3cc7c5eb7e68901.
Report an issue: GitHub.