{"record":{"id":"a84163f7ad3c5979","repo":"apache/cassandra","slug":"unable-to-create-instance-of-iautorepairtokenrange","errorCode":null,"errorMessage":"Unable to create instance of IAutoRepairTokenRangeSplitter","messagePattern":"Unable to create instance of IAutoRepairTokenRangeSplitter","errorType":"exception","errorClass":"ConfigurationException","httpStatus":null,"severity":"error","filePath":"src/java/org/apache/cassandra/repair/autorepair/AutoRepairConfig.java","lineNumber":422,"sourceCode":"            {\n                // If token_range_splitter.class_name is not defined, just use default, this is for convenience.\n                tokenRangeSplitterClass = AutoRepairConfig.DEFAULT_SPLITTER;\n            }\n            try\n            {\n                Map<String, String> parameters = parameterizedClass.parameters != null ? parameterizedClass.parameters : Collections.emptyMap();\n                // first attempt to initialize with RepairType and Map arguments.\n                return tokenRangeSplitterClass.getConstructor(RepairType.class, Map.class).newInstance(repairType, parameters);\n            }\n            catch (NoSuchMethodException nsme)\n            {\n                // fall back on no argument constructor.\n                return tokenRangeSplitterClass.getConstructor().newInstance();\n            }\n        }\n        catch (Exception ex)\n        {\n            throw new ConfigurationException(\"Unable to create instance of IAutoRepairTokenRangeSplitter\", ex);\n        }\n    }\n\n    // Options configures auto-repair behavior for a given repair type.\n    // All fields can be modified dynamically.\n    public static class Options implements Serializable\n    {\n        // defaultOptions defines the default auto-repair behavior when no overrides are defined\n        @VisibleForTesting\n        private static Map<AutoRepairConfig.RepairType, Options> defaultOptions;\n\n        private static Map<AutoRepairConfig.RepairType, Options> initializeDefaultOptions()\n        {\n            Map<AutoRepairConfig.RepairType, Options> options = new EnumMap<>(AutoRepairConfig.RepairType.class);\n            options.put(AutoRepairConfig.RepairType.FULL, getDefaultOptions());\n            options.put(RepairType.INCREMENTAL, getDefaultOptions());\n            options.put(RepairType.PREVIEW_REPAIRED, getDefaultOptions());\n","sourceCodeStart":404,"sourceCodeEnd":440,"githubUrl":"https://github.com/apache/cassandra/blob/88fd0f6a0eaed8943f05ac9e8f947882b8ddc8f1/src/java/org/apache/cassandra/repair/autorepair/AutoRepairConfig.java#L404-L440","documentation":"AutoRepairConfig.newAutoRepairTokenRangeSplitter wraps any exception from instantiating the configured IAutoRepairTokenRangeSplitter class (constructor with optional ConfigurationException argument, or fall-back no-arg constructor) into a ConfigurationException. The configured class cannot be loaded, has the wrong type, or its constructor fails.","triggerScenarios":"Setting auto_repair token_range_splitter (or per-repair-type splitter) to a class name that is missing from the classpath, does not implement IAutoRepairTokenRangeSplitter, lacks a suitable constructor, or whose constructor throws.","commonSituations":"Typo in the fully-qualified class name in cassandra.yaml; custom splitter jar missing from lib/ or classpath; custom splitter incompatible after upgrade; splitter constructor requiring an unavailable argument.","solutions":["Fix the class name in cassandra.yaml (default: org.apache.cassandra.repair.autorepair.FixedSplitTokenRangeSplitter)","Ensure the jar providing the splitter is on the Cassandra classpath","Implement IAutoRepairTokenRangeSplitter and provide a public no-arg constructor","Inspect the chained cause (ex) to distinguish ClassNotFound vs constructor failure"],"exampleFix":"# before\nauto_repair:\n  token_range_splitter: com.example.MySplitter\n# after\nauto_repair:\n  token_range_splitter: org.apache.cassandra.repair.autorepair.FixedSplitTokenRangeSplitter","handlingStrategy":"validation","validationCode":"String cls = config.autoRepairTokenRangeSplitter();\nClass<?> c = Class.forName(cls);\nif (!IAutoRepairTokenRangeSplitter.class.isAssignableFrom(c))\n    throw new ConfigurationException(cls + \" does not implement IAutoRepairTokenRangeSplitter\");\nc.getDeclaredConstructor(); // must exist","typeGuard":null,"tryCatchPattern":"try { config.getTokenRangeSplitterInstance(repairType); }\ncatch (ConfigurationException e) {\n    logger.error(\"Falling back to default splitter: {}\", e.getCause(), e);\n    config.setTokenRangeSplitter(\"org.apache.cassandra.repair.autorepair.FixedSplitTokenRangeSplitter\");\n}","preventionTips":["Copy the exact fully-qualified class name from provider docs","Ship the custom splitter jar in lib/ and verify with Class.forName smoke test","Keep a public no-arg constructor on custom splitters","Re-test custom splitters after every Cassandra upgrade"],"tags":["configuration","autorepair","reflection","startup"],"backgroundTag":"invalid-config-value","analyzedSha":"88fd0f6a0eaed8943f05ac9e8f947882b8ddc8f1","analyzedAt":"2026-09-10T07:29:22.284Z","contentChangedAt":"2026-09-10T07:29:22.284Z","schemaVersion":2},"datasetVersion":"2026-09-14T16:17:12.679Z"}