{"record":{"id":"53932e9f5701770f","repo":"apache/cassandra","slug":"error-constructing-replication-strategy-class","errorCode":null,"errorMessage":"Error constructing replication strategy class","messagePattern":"Error constructing replication strategy class","errorType":"validation","errorClass":"ConfigurationException","httpStatus":null,"severity":"error","filePath":"src/java/org/apache/cassandra/locator/AbstractReplicationStrategy.java","lineNumber":268,"sourceCode":"                                                              Class<? extends AbstractReplicationStrategy> strategyClass,\n                                                              Map<String, String> strategyOptions)\n        throws ConfigurationException\n    {\n        AbstractReplicationStrategy strategy;\n        Class<?>[] parameterTypes = new Class[] {String.class, Map.class};\n        try\n        {\n            Constructor<? extends AbstractReplicationStrategy> constructor = strategyClass.getConstructor(parameterTypes);\n            strategy = constructor.newInstance(keyspaceName, strategyOptions);\n        }\n        catch (InvocationTargetException e)\n        {\n            Throwable targetException = e.getTargetException();\n            throw new ConfigurationException(targetException.getMessage(), targetException);\n        }\n        catch (Exception e)\n        {\n            throw new ConfigurationException(\"Error constructing replication strategy class\", e);\n        }\n        return strategy;\n    }\n\n    public static AbstractReplicationStrategy createReplicationStrategy(String keyspaceName,\n                                                                        ReplicationParams replicationParams)\n    {\n        return createReplicationStrategy(keyspaceName, replicationParams.klass, replicationParams.options);\n    }\n    public static AbstractReplicationStrategy createReplicationStrategy(String keyspaceName,\n                                                                        Class<? extends AbstractReplicationStrategy> strategyClass,\n                                                                        Map<String, String> strategyOptions)\n    {\n        AbstractReplicationStrategy strategy = createInternal(keyspaceName, strategyClass, strategyOptions);\n        strategy.validateOptions();\n        return strategy;\n    }\n","sourceCodeStart":250,"sourceCodeEnd":286,"githubUrl":"https://github.com/apache/cassandra/blob/88fd0f6a0eaed8943f05ac9e8f947882b8ddc8f1/src/java/org/apache/cassandra/locator/AbstractReplicationStrategy.java#L250-L286","documentation":"If reflective construction of the replication strategy fails with any exception other than InvocationTargetException (e.g. ClassNotFoundException cannot happen here, but NoSuchMethodException, InstantiationException, IllegalAccessException, or IllegalArgumentException from getConstructor/newInstance), createInternal throws ConfigurationException(\"Error constructing replication strategy class\", e). It indicates the strategy class could not be instantiated at all, rather than rejecting its options.","triggerScenarios":"A custom AbstractReplicationStrategy subclass lacking the (String, Map<String,String>) constructor, being abstract, or having a non-public constructor; passing a class name that resolves but cannot be instantiated via getClass/createReplicationStrategy.","commonSituations":"Custom strategy plugin jar not fully deployed or class has wrong constructor signature; strategy class modified upstream losing the required constructor; typo producing a class that exists but is abstract.","solutions":["Ensure the strategy class is public, concrete, and has a public constructor (String keyspaceName, Map<String,String> options)","Check the cause chain (getCause) of the ConfigurationException for the reflective failure detail","Verify the plugin jar is on the classpath of every node","Use a built-in strategy (SimpleStrategy/NetworkTopologyStrategy) if a custom one is not required"],"exampleFix":"// before\nclass MyStrategy extends AbstractReplicationStrategy { public MyStrategy(String ks) {...} }\n// after\nclass MyStrategy extends AbstractReplicationStrategy {\n    public MyStrategy(String ks, Map<String,String> opts) { super(ks, opts, null); ... }\n}","handlingStrategy":"validation","validationCode":"// Verify the strategy class is instantiable before configuring it\nClass<?> c = FBUtilities.classForNameWithoutInitialization(name, \"replication strategy\");\nif (!Modifier.isAbstract(c.getModifiers()) || c.getConstructors().length == 0)\n    throw new IllegalArgumentException(name + \" must be concrete with a public (String, Map) constructor\");","typeGuard":null,"tryCatchPattern":"try {\n    AbstractReplicationStrategy s = AbstractReplicationStrategy.createReplicationStrategy(ks, params);\n} catch (ConfigurationException e) {\n    if (e.getCause() != null) logger.error(\"Strategy construction failed: {}\", e.getCause());\n}","preventionTips":["Custom strategies must be public, concrete, and expose (String, Map<String,String>)","Ship strategy plugin jars to every node and keep versions in sync","Smoke-test custom strategy instantiation in a unit test","Prefer built-in strategies unless there is a concrete need"],"tags":["reflection","replication","configuration","class-loading"],"backgroundTag":"invalid-constructor-argument","analyzedSha":"88fd0f6a0eaed8943f05ac9e8f947882b8ddc8f1","analyzedAt":"2026-09-10T07:29:22.284Z","contentChangedAt":"2026-09-10T07:29:22.284Z","schemaVersion":2},"datasetVersion":"2026-09-14T11:17:12.474Z"}