{"record":{"id":"fe06cfa8d6c322c7","repo":"apache/cassandra","slug":"invalid-datacenter-rack","errorCode":null,"errorMessage":"Invalid datacenter:rack -  ","messagePattern":"Invalid datacenter:rack -  ","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"src/java/org/apache/cassandra/tcm/membership/Location.java","lineNumber":77,"sourceCode":"    public int hashCode()\n    {\n        return Objects.hash(datacenter, rack);\n    }\n\n    @Override\n    public String toString()\n    {\n        return datacenter + '/' + rack;\n    }\n\n    public static Location fromString(String value)\n    {\n        if (value == null || value.isEmpty())\n            return null;\n\n        String[] parts = value.split(\":\");\n        if (parts.length < 2)\n            throw new IllegalArgumentException(\"Invalid datacenter:rack -  \" + value);\n        else\n            return new Location(parts[0].trim(), parts[1].trim());\n    }\n\n    public static class Serializer implements MetadataSerializer<Location>\n    {\n        public void serialize(Location t, DataOutputPlus out, Version version) throws IOException\n        {\n            out.writeUTF(t.datacenter);\n            out.writeUTF(t.rack);\n        }\n\n        public Location deserialize(DataInputPlus in, Version version) throws IOException\n        {\n            return new Location(in.readUTF(), in.readUTF());\n        }\n\n        public long serializedSize(Location t, Version version)","sourceCodeStart":59,"sourceCodeEnd":95,"githubUrl":"https://github.com/apache/cassandra/blob/88fd0f6a0eaed8943f05ac9e8f947882b8ddc8f1/src/java/org/apache/cassandra/tcm/membership/Location.java#L59-L95","documentation":"Location.fromString parses a 'datacenter:rack' string into a Location. It throws IllegalArgumentException when the value contains no ':' separator, i.e. fewer than 2 parts after splitting. The library requires both datacenter and rack to be explicitly encoded in the string to build a valid node placement.","triggerScenarios":"Calling Location.fromString(value) or Location.fromJSONObject(...) with a string lacking a colon, e.g. \"dc1\" instead of \"dc1:rack1\", or with a null/empty-free string that has only a datacenter.","commonSituations":"Hand-edited cluster metadata JSON or system properties where the rack portion was omitted; tooling that serializes only the datacenter; copy-paste of a datacenter name from configs that treat rack as optional.","solutions":["Ensure the string is in 'datacenter:rack' form, e.g. \"dc1:rack1\"","If the rack is unknown, explicitly supply a default rack name (e.g. \"datacenter1:rack1\") before calling fromString","Check the JSON source feeding fromJSONObject for a truncated or missing ':rack' segment","Validate with a regex like ^[^:]+:[^:]+$ before calling fromString"],"exampleFix":"// before\nLocation loc = Location.fromString(\"datacenter1\");\n// after\nLocation loc = Location.fromString(\"datacenter1:rack1\");","handlingStrategy":"validation","validationCode":"if (value == null || !value.matches(\"[^:]+:[^:]+\")) throw new IllegalArgumentException(\"Expected datacenter:rack, got: \" + value);","typeGuard":"boolean isValidLocationString(String v) { return v != null && v.split(\":\").length >= 2; }","tryCatchPattern":"try { Location loc = Location.fromString(value); } catch (IllegalArgumentException e) { // fall back to a default dc:rack or surface a config error }","preventionTips":["Always store placements as full 'datacenter:rack' strings","Validate config inputs with a dc:rack regex at load time","Never omit the rack component, even when it is 'rack1' by default"],"tags":["cassandra","tcm","parsing"],"backgroundTag":"invalid-argument-format","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"}