{"record":{"id":"7920d5e447a518b9","repo":"apache/cassandra","slug":"not-a-cassandra-event-class","errorCode":null,"errorMessage":"Not a Cassandra event class: ","messagePattern":"Not a Cassandra event class: ","errorType":"exception","errorClass":"RuntimeException","httpStatus":null,"severity":"error","filePath":"src/java/org/apache/cassandra/diag/DiagnosticEventPersistence.java","lineNumber":137,"sourceCode":"        }\n    }\n\n    private void onEvent(DiagnosticEvent event)\n    {\n        Class<? extends DiagnosticEvent> cls = event.getClass();\n        logger.trace(\"Persisting received {} event\", cls.getName());\n        DiagnosticEventStore<Long> store = getStore(cls);\n        store.store(event);\n        LastEventIdBroadcaster.instance().setLastEventId(event.getClass().getName(), store.getLastEventId());\n    }\n\n    @SuppressWarnings(\"unchecked\")\n    private Class<DiagnosticEvent> getEventClass(String eventClazz) throws ClassNotFoundException, InvalidClassException\n    {\n        // get class by eventClazz argument name\n        // restrict class loading for security reasons\n        if (!eventClazz.startsWith(\"org.apache.cassandra.\"))\n            throw new RuntimeException(\"Not a Cassandra event class: \" + eventClazz);\n\n        Class<?> clazz = Class.forName(eventClazz, false, DiagnosticEventPersistence.class.getClassLoader());\n\n        if (!(DiagnosticEvent.class.isAssignableFrom(clazz)))\n            throw new InvalidClassException(\"Event class must be of type DiagnosticEvent\");\n\n        return (Class<DiagnosticEvent>) clazz.asSubclass(DiagnosticEvent.class);\n    }\n\n    private DiagnosticEventStore<Long> getStore(Class cls)\n    {\n        return stores.computeIfAbsent(cls, (storeKey) -> new DiagnosticEventMemoryStore());\n    }\n}\n","sourceCodeStart":119,"sourceCodeEnd":152,"githubUrl":"https://github.com/apache/cassandra/blob/88fd0f6a0eaed8943f05ac9e8f947882b8ddc8f1/src/java/org/apache/cassandra/diag/DiagnosticEventPersistence.java#L119-L152","documentation":"DiagnosticEventPersistence.getEventClass restricts class loading to org.apache.cassandra.* event classes for security reasons. A RuntimeException is thrown when the supplied event class name is outside that namespace, preventing arbitrary class loading via JMX/diagnostic APIs.","triggerScenarios":"Calling enableEventPersistence/getEvents/disableEventPersistence with an eventClazz string not starting with \"org.apache.cassandra.\"","commonSituations":"Typo in package name; passing a fully-qualified class of a third-party or application event; using an old class name after a package refactor.","solutions":["Use the correct Cassandra event class, e.g. org.apache.cassandra.diag.EventListener or one of the *DiagnosticEventService event types","Ensure the class name starts with org.apache.cassandra.","Consult org.apache.cassandra.diag.DiagnosticEventService for the list of valid event classes","If a custom event is needed, it must live under the org.apache.cassandra package (internal builds only)"],"exampleFix":"// before\nbean.enableEventPersistence(\"com.example.MyEvent\");\n// after\nbean.enableEventPersistence(\"org.apache.cassandra.db.commitlog.CommitLogChronicleEvent\");","handlingStrategy":"validation","validationCode":"// reject non-Cassandra class names before calling the JMX operation\nif (!eventClazz.startsWith(\"org.apache.cassandra.\"))\n    throw new IllegalArgumentException(\"event class must be in org.apache.cassandra namespace\");","typeGuard":null,"tryCatchPattern":"try {\n    bean.enableEventPersistence(eventClazz);\n} catch (RuntimeException e) {\n    if (e.getMessage().startsWith(\"Not a Cassandra event class\")) {\n        // fix the fully-qualified class name to org.apache.cassandra.*\n    }\n}","preventionTips":["Always pass fully-qualified org.apache.cassandra.* event class names","Keep event class name constants centralized in config, not ad-hoc strings","Re-check class names after Cassandra upgrades"],"tags":["diagnostics","security","class-loading"],"backgroundTag":"invalid-argument-value","analyzedSha":"88fd0f6a0eaed8943f05ac9e8f947882b8ddc8f1","analyzedAt":"2026-09-10T07:29:22.284Z","contentChangedAt":"2026-09-10T07:29:22.284Z","schemaVersion":2},"datasetVersion":"2026-09-17T15:17:12.973Z"}