{"record":{"id":"195b09be53eacf86","repo":"nathanmarz/storm","slug":"non-system-tuples-should-never-be-sent-to-system-bolt","errorCode":null,"errorMessage":"Non-system tuples should never be sent to __system bolt.","messagePattern":"Non-system tuples should never be sent to __system bolt\\.","errorType":"exception","errorClass":"RuntimeException","httpStatus":null,"severity":"error","filePath":"storm-core/src/jvm/backtype/storm/metric/SystemBolt.java","lineNumber":149,"sourceCode":"        context.registerMetric(\"memory/heap\", new MemoryUsageMetric(new AFn() {\n            public Object invoke() {\n                return jvmMemRT.getHeapMemoryUsage();\n            }\n        }), bucketSize);\n        context.registerMetric(\"memory/nonHeap\", new MemoryUsageMetric(new AFn() {\n            public Object invoke() {\n                return jvmMemRT.getNonHeapMemoryUsage();\n            }\n        }), bucketSize);\n\n        for(GarbageCollectorMXBean b : ManagementFactory.getGarbageCollectorMXBeans()) {\n            context.registerMetric(\"GC/\" + b.getName().replaceAll(\"\\\\W\", \"\"), new GarbageCollectorMetric(b), bucketSize);\n        }\n    }\n\n    @Override\n    public void execute(Tuple input) {\n        throw new RuntimeException(\"Non-system tuples should never be sent to __system bolt.\");\n    }\n\n    @Override\n    public void cleanup() {\n    }\n}\n","sourceCodeStart":131,"sourceCodeEnd":156,"githubUrl":"https://github.com/nathanmarz/storm/blob/cdb116e942666973bc4eaa0df098d5bab82739e7/storm-core/src/jvm/backtype/storm/metric/SystemBolt.java#L131-L156","documentation":"SystemBolt.execute is unconditional: it never processes tuples and throws immediately for any input. The __system bolt exists only to schedule builtin metrics tasks (via prepare), so receiving a tuple means something upstream is emitting to or anchoring toward the __system stream/component, which is never valid.","triggerScenarios":"Any bolt or spout emits a tuple to the __system component/stream, or declares __system as an output target, delivering a tuple to SystemBolt.execute.","commonSituations":"Custom code accidentally names a stream '__system' or declares fields grouping/anchoring toward the system component; misconfigured builtin metrics wiring; copying Storm internals' stream names into user topology code.","solutions":["Find the upstream component emitting to __system and remove that emission (grep for \"__system\" in topology code and stream declarations).","Rename any custom output stream that collides with the reserved __system stream name.","Remove any grouping/anchoring that targets the __system component; it must not receive user tuples.","If caused by a library, check its version/issue tracker — user code should never route tuples to the system bolt."],"exampleFix":"// before\nOutputCollector.emit(\"__system\", tuple, values); // sends tuple to system bolt\n// after\nOutputCollector.emit(DEFAULT_STREAM_ID, tuple, values); // emit on your own stream","handlingStrategy":"validation","validationCode":"// Never emit or group to reserved system streams/components\nif (\"__system\".equals(streamId) || \"__system\".equals(componentId)) {\n    throw new IllegalArgumentException(\"__system is reserved; user code must not send tuples to it\");\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Treat stream/component names starting with '__' as reserved by Storm.","Never anchor or emit tuples toward the __system component.","Grep your topology code for \"__system\" and \"__tick\" misuse before deploying.","Rely on tick tuples (Config.TOPOLOGY_TICK_TUPLE_FREQ_SECS) instead of the system bolt for periodic work."],"tags":["tuples","streams","metrics","storm"],"backgroundTag":"unsupported-operation","analyzedSha":"cdb116e942666973bc4eaa0df098d5bab82739e7","analyzedAt":"2026-09-12T14:30:00.714Z","contentChangedAt":"2026-09-12T14:30:00.714Z","schemaVersion":2},"datasetVersion":"2026-09-16T09:17:16.951Z"}