prestodb/presto · critical · PrestoException
SERIALIZED_PAGE_CHECKSUM_ERROR
SERIALIZED_PAGE_CHECKSUM_ERROR
Error message
Received corrupted serialized page from host %s
What it means
SERIALIZED_PAGE_CHECKSUM_ERROR is thrown when a page received over the exchange fails isChecksumValid, meaning the serialized page's checksum does not match its contents. Presto computes checksums on serialized pages so corruption introduced in transport or by faulty buffers is detected on receipt. This is almost always a data-integrity/hardware/network problem rather than a query logic bug.
Source
Thrown at presto-main-base/src/main/java/com/facebook/presto/operator/PageBufferClient.java:322
pages = result.getPages();
token = result.getNextToken();
shouldAcknowledge = pages.size() > 0;
}
else {
pages = ImmutableList.of();
}
}
if (shouldAcknowledge && acknowledgePages) {
// Acknowledge token without handling the response.
// The next request will also make sure the token is acknowledged.
// This is to fast release the pages on the buffer side.
resultClient.acknowledgeResultsAsync(result.getNextToken());
}
for (SerializedPage page : pages) {
if (!isChecksumValid(page)) {
throw new PrestoException(SERIALIZED_PAGE_CHECKSUM_ERROR, format("Received corrupted serialized page from host %s", HostAddress.fromUri(uri)));
}
}
// add pages:
// addPages must be called regardless of whether pages is an empty list because
// clientCallback can keep stats of requests and responses. For example, it may
// keep track of how often a client returns empty response and adjust request
// frequency or buffer size.
pagesAccepted = clientCallback.addPages(PageBufferClient.this, pages);
}
catch (PrestoException e) {
handleFailure(e, resultFuture);
return;
}
// update client stats
if (!pages.isEmpty()) {
int pageCount = pages.size();View on GitHub (pinned to 55bb57d202)
Solutions
- Re-run the query and check whether the same host reports corruption; isolate the offending worker.
- Run hardware diagnostics (memory, NIC) and check switch logs on the reported host.
- Verify all nodes run the same Presto version and serialization settings; rolling-upgrade mismatches can corrupt exchange data.
- Check for disk errors on the worker's spill/exchange directories.
- If reproducible after a version change, report upstream with the query plan and host details.
Defensive patterns
Strategy: try-catch
Try / catch
try {
queryResults = client.fetchNext();
} catch (PrestoException e) {
if ("SERIALIZED_PAGE_CHECKSUM_ERROR".equals(e.getErrorCode().getName())) {
// do not blindly retry: flag host for hardware/network diagnostics first
isolateHost(e.getMessage());
throw e;
}
throw e;
} Prevention
- Run regular memory and NIC health checks on worker nodes
- Keep all nodes on the same Presto version to avoid serialization mismatches
- Monitor network error counters and switch logs
- Place exchange/spill data on verified, error-checked storage
When it happens
Trigger: During onSuccess, iterating pages returned by a result fetch to uri, any SerializedPage for which isChecksumValid(page) returns false causes the throw with the source host address.
Common situations: Faulty NIC/RAM on worker nodes, network equipment dropping/corrupting packets with weak checksums, disk corruption on the exchange buffer, or bugs in custom serialization/serialization version mismatches after an upgrade.
Related errors
AI-assisted analysis of prestodb/presto@55bb57d202 (2026-09-04).
Data as JSON: /api/errors/88de45d81784de2e.
Report an issue: GitHub.