{"record":{"id":"368d3de3498bc7c5","repo":"apache/cassandra","slug":"compaction-strategy-does-not-have-a-static-vali","errorCode":null,"errorMessage":"Compaction strategy {} does not have a static validateOptions method. Validation ignored","messagePattern":"Compaction strategy (.+?) does not have a static validateOptions method\\. Validation ignored","errorType":"console","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"src/java/org/apache/cassandra/schema/CompactionParams.java","lineNumber":207,"sourceCode":"    {\n        return tombstoneOption;\n    }\n\n    public void validate()\n    {\n        try\n        {\n            Map<?, ?> unknownOptions = (Map) klass.getMethod(\"validateOptions\", Map.class).invoke(null, options);\n            if (!unknownOptions.isEmpty())\n            {\n                throw new ConfigurationException(format(\"Properties specified %s are not understood by %s\",\n                                                        unknownOptions.keySet(),\n                                                        klass.getSimpleName()));\n            }\n        }\n        catch (NoSuchMethodException e)\n        {\n            logger.warn(\"Compaction strategy {} does not have a static validateOptions method. Validation ignored\",\n                        klass.getName());\n        }\n        catch (InvocationTargetException e)\n        {\n            if (e.getTargetException() instanceof ConfigurationException)\n                throw (ConfigurationException) e.getTargetException();\n\n            Throwable cause = e.getCause() == null\n                            ? e\n                            : e.getCause();\n\n            throw new ConfigurationException(format(\"%s.validateOptions() threw an error: %s %s\",\n                                                    klass.getName(),\n                                                    cause.getClass().getName(),\n                                                    cause.getMessage()),\n                                             e);\n        }\n        catch (IllegalAccessException e)","sourceCodeStart":189,"sourceCodeEnd":225,"githubUrl":"https://github.com/apache/cassandra/blob/88fd0f6a0eaed8943f05ac9e8f947882b8ddc8f1/src/java/org/apache/cassandra/schema/CompactionParams.java#L189-L225","documentation":"CompactionParams.validate uses reflection to invoke a compaction strategy class's static validateOptions(Map<String,String>) method to check compaction options. If that method does not exist on the class, validation is skipped and this warning is logged instead of failing the schema change.","triggerScenarios":"Setting a compaction strategy (e.g. via setCompactionParameters in a CREATE/ALTER TABLE or CQL options) whose class lacks a static validateOptions method (often a custom third-party strategy).","commonSituations":"Custom or third-party compaction strategies not following the ICompactionStrategy API contract; typos in the class name resolving to the wrong class; older strategies predating validateOptions.","solutions":["Implement a public static Map<String,Object> validateOptions(Map<String,Object> options) method (or Map<String,String>) on the compaction strategy class","Verify the fully-qualified compaction class name in the compaction options is correct","Use a built-in strategy (SizeTieredCompactionStrategy, LeveledCompactionStrategy, TimeWindowCompactionStrategy, UnifiedCompactionStrategy) which supports validateOptions"],"exampleFix":"// before\npublic class MyStrategy { /* no validateOptions */ }\n// after\npublic class MyStrategy {\n    public static Map<String,Object> validateOptions(Map<String,Object> options) {\n        options.remove(SomeCompactionStrategyOptions.EXTENSION_THRESHOLD.key());\n        return options;\n    }\n}","handlingStrategy":"validation","validationCode":"// validate options before attaching a custom strategy\nMap<String,Object> accepted = klass.getMethod(\"validateOptions\", Map.class) != null\n    ? (Map<String,Object>) klass.getMethod(\"validateOptions\", Map.class).invoke(null, options)\n    : options;\nif (!accepted.isEmpty()) throw new ConfigurationException(\"Unknown options: \" + accepted.keySet());","typeGuard":"boolean hasValidateOptions(Class<?> klass) {\n    try { klass.getMethod(\"validateOptions\", Map.class); return true; }\n    catch (NoSuchMethodException e) { return false; }\n}","tryCatchPattern":"try { CompactionParams.validate(...); }\ncatch (ConfigurationException e) { throw new InvalidRequestException(\"Bad compaction options: \" + e.getMessage()); }","preventionTips":["Implement static validateOptions in every custom compaction strategy","Prefer built-in compaction strategies when possible","Double-check fully-qualified class names in compaction options","Test custom strategies against options validation before deploying"],"tags":["compaction","schema","validation","reflection"],"backgroundTag":"schema-validation-failed","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"}