{"record":{"id":"88de45d81784de2e","repo":"prestodb/presto","slug":"serialized-page-checksum-error","errorCode":"SERIALIZED_PAGE_CHECKSUM_ERROR","errorMessage":"Received corrupted serialized page from host %s","messagePattern":"Received corrupted serialized page from host (.+?)","errorType":"error_code","errorClass":"PrestoException","httpStatus":null,"severity":"critical","filePath":"presto-main-base/src/main/java/com/facebook/presto/operator/PageBufferClient.java","lineNumber":322,"sourceCode":"                            pages = result.getPages();\n                            token = result.getNextToken();\n                            shouldAcknowledge = pages.size() > 0;\n                        }\n                        else {\n                            pages = ImmutableList.of();\n                        }\n                    }\n\n                    if (shouldAcknowledge && acknowledgePages) {\n                        // Acknowledge token without handling the response.\n                        // The next request will also make sure the token is acknowledged.\n                        // This is to fast release the pages on the buffer side.\n                        resultClient.acknowledgeResultsAsync(result.getNextToken());\n                    }\n\n                    for (SerializedPage page : pages) {\n                        if (!isChecksumValid(page)) {\n                            throw new PrestoException(SERIALIZED_PAGE_CHECKSUM_ERROR, format(\"Received corrupted serialized page from host %s\", HostAddress.fromUri(uri)));\n                        }\n                    }\n\n                    // add pages:\n                    // addPages must be called regardless of whether pages is an empty list because\n                    // clientCallback can keep stats of requests and responses. For example, it may\n                    // keep track of how often a client returns empty response and adjust request\n                    // frequency or buffer size.\n                    pagesAccepted = clientCallback.addPages(PageBufferClient.this, pages);\n                }\n                catch (PrestoException e) {\n                    handleFailure(e, resultFuture);\n                    return;\n                }\n\n                // update client stats\n                if (!pages.isEmpty()) {\n                    int pageCount = pages.size();","sourceCodeStart":304,"sourceCodeEnd":340,"githubUrl":"https://github.com/prestodb/presto/blob/55bb57d202de3b926896fa966c2c4a44c779634e/presto-main-base/src/main/java/com/facebook/presto/operator/PageBufferClient.java#L304-L340","documentation":"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.","triggerScenarios":"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.","commonSituations":"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.","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."],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"try {\n    queryResults = client.fetchNext();\n} catch (PrestoException e) {\n    if (\"SERIALIZED_PAGE_CHECKSUM_ERROR\".equals(e.getErrorCode().getName())) {\n        // do not blindly retry: flag host for hardware/network diagnostics first\n        isolateHost(e.getMessage());\n        throw e;\n    }\n    throw e;\n}","preventionTips":["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"],"tags":["data-corruption","network","exchange","serialization"],"backgroundTag":"corrupted-exchange-page","analyzedSha":"55bb57d202de3b926896fa966c2c4a44c779634e","analyzedAt":"2026-09-04T12:50:26.162Z","contentChangedAt":"2026-09-04T12:50:26.162Z","schemaVersion":2},"datasetVersion":"2026-09-11T21:17:09.523Z"}