{"record":{"id":"f584f731173b3bc2","repo":"prestodb/presto","slug":"generic-internal-error-f584f7","errorCode":"GENERIC_INTERNAL_ERROR","errorMessage":"Operator %s has non-zero system memory (%d bytes) after destroy()","messagePattern":"Operator (.+?) has non-zero system memory \\((.+?) bytes\\) after destroy\\(\\)","errorType":"error_code","errorClass":"PrestoException","httpStatus":null,"severity":"error","filePath":"presto-main-base/src/main/java/com/facebook/presto/operator/OperatorContext.java","lineNumber":406,"sourceCode":"\n    public void destroy()\n    {\n        // reset memory revocation listener so that OperatorContext doesn't hold any references to Driver instance\n        synchronized (this) {\n            memoryRevocationRequestListener = null;\n        }\n\n        // memoize the result of and then clear any reference to the original suppliers (which might otherwise retain operators or other large objects)\n        Supplier<? extends OperatorInfo> infoSupplier = this.infoSupplier.get();\n        if (infoSupplier != null) {\n            OperatorInfo info = infoSupplier.get();\n            this.infoSupplier.set(info == null ? null : Suppliers.ofInstance(info));\n        }\n\n        operatorMemoryContext.close();\n\n        if (operatorMemoryContext.getSystemMemory() != 0) {\n            throw new PrestoException(GENERIC_INTERNAL_ERROR, format(\"Operator %s has non-zero system memory (%d bytes) after destroy()\", this, operatorMemoryContext.getSystemMemory()));\n        }\n\n        if (operatorMemoryContext.getUserMemory() != 0) {\n            throw new PrestoException(GENERIC_INTERNAL_ERROR, format(\"Operator %s has non-zero user memory (%d bytes) after destroy()\", this, operatorMemoryContext.getUserMemory()));\n        }\n\n        if (operatorMemoryContext.getRevocableMemory() != 0) {\n            throw new PrestoException(GENERIC_INTERNAL_ERROR, format(\"Operator %s has non-zero revocable memory (%d bytes) after destroy()\", this, operatorMemoryContext.getRevocableMemory()));\n        }\n    }\n\n    public SpillContext getSpillContext()\n    {\n        return spillContext;\n    }\n\n    public void moreMemoryAvailable()\n    {","sourceCodeStart":388,"sourceCodeEnd":424,"githubUrl":"https://github.com/prestodb/presto/blob/55bb57d202de3b926896fa966c2c4a44c779634e/presto-main-base/src/main/java/com/facebook/presto/operator/OperatorContext.java#L388-L424","documentation":"OperatorContext.destroy closes the operator's memory context then asserts the operator released all system memory. A non-zero remaining system memory reservation after destroy() is an internal invariant violation (a leak in the operator implementation), thrown as GENERIC_INTERNAL_ERROR.","triggerScenarios":"destroy() is called during operator teardown while operatorMemoryContext.getSystemMemory() != 0, i.e. an operator allocated system memory (e.g. buffers, native allocations) and never freed/reserved-released it.","commonSituations":"Custom operator/connector bugs leaking memory contexts; failed operators that skip cleanup paths; pagination/buffer not set to null before close.","solutions":["Fix the operator to release/reserve-free all system memory before or during close/destroy","Update Presto — this class of leak is often fixed in later releases","Capture the operator name from the message and report with the plan fragment to isolate the leaking operator"],"exampleFix":"// before\nclose();\n// after (operator must release before context close)\nlocalSystemMemoryContext.close(); // frees tracked allocations\nbuffer = null;","handlingStrategy":"try-catch","validationCode":"// operator authors: assert released before close\nif (systemMemoryContext.getBytes() != 0) { systemMemoryContext.setBytes(0); }","typeGuard":null,"tryCatchPattern":"// engine-side; users should catch and escalate as a bug report\ntry { executeQuery(sql); } catch (PrestoException e) {\n    if (e.getMessage() != null && e.getMessage().contains(\"non-zero system memory\")) {\n        log.error(\"Operator memory leak after destroy\", e); // file bug with operator name\n    }\n}","preventionTips":["Operator authors: always close LocalMemoryContexts in close()/finally blocks","Keep Presto upgraded — leaks are routinely patched","Never swallow exceptions in operator cleanup paths"],"tags":["memory-leak","internal-error","operator"],"backgroundTag":"operator-memory-leak","analyzedSha":"55bb57d202de3b926896fa966c2c4a44c779634e","analyzedAt":"2026-09-04T12:50:26.162Z","contentChangedAt":"2026-09-04T12:50:26.162Z","schemaVersion":2},"datasetVersion":"2026-09-12T02:17:10.037Z"}