{"record":{"id":"5281d5ebad893b95","repo":"apache/cassandra","slug":"unknown-key","errorCode":null,"errorMessage":"Unknown key: ","messagePattern":"Unknown key: ","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"src/java/org/apache/cassandra/tcm/MetadataKeys.java","lineNumber":81,"sourceCode":"\n    public static MetadataKey make(String...parts)\n    {\n        assert parts != null && parts.length >= 1;\n        StringBuilder b = new StringBuilder(parts[0]);\n        for (int i = 1; i < parts.length; i++)\n        {\n            b.append('.');\n            b.append(parts[i]);\n        }\n        return new MetadataKey(b.toString());\n    }\n\n    public static MetadataValue<?> extract(ClusterMetadata cm, MetadataKey key)\n    {\n        if (CORE_METADATA.containsKey(key))\n            return CORE_METADATA.get(key).apply(cm);\n        if (!(key instanceof ExtensionKey<?, ?>))\n            throw new IllegalArgumentException(\"Unknown key: \" + key);\n        return cm.extensions.get(key);\n    }\n\n    public static ImmutableSet<MetadataKey> diffKeys(ClusterMetadata before, ClusterMetadata after)\n    {\n        ImmutableSet.Builder<MetadataKey> builder = new ImmutableSet.Builder<>();\n        diffKeys(before, after, builder);\n        return builder.build();\n    }\n\n    private static void diffKeys(ClusterMetadata before, ClusterMetadata after, ImmutableSet.Builder<MetadataKey> builder)\n    {\n        for (Map.Entry<MetadataKey, Function<ClusterMetadata, MetadataValue<?>>> e : CORE_METADATA.entrySet())\n            checkKey(before, after, builder, e.getValue(), e.getKey());\n\n        Set<ExtensionKey<?,?>> added = new HashSet<>(after.extensions.keySet());\n        for (Map.Entry<ExtensionKey<?, ?>, ExtensionValue<?>> entry : before.extensions.entrySet())\n        {","sourceCodeStart":63,"sourceCodeEnd":99,"githubUrl":"https://github.com/apache/cassandra/blob/88fd0f6a0eaed8943f05ac9e8f947882b8ddc8f1/src/java/org/apache/cassandra/tcm/MetadataKeys.java#L63-L99","documentation":"MetadataKeys.extract resolves a MetadataKey against a ClusterMetadata snapshot. Keys in the CORE_METADATA map are looked up directly; anything else must be an ExtensionKey whose value lives in cm.extensions. If a non-core, non-extension key is passed, extract throws IllegalArgumentException(\"Unknown key: \" + key), indicating the caller supplied a key type the resolver cannot handle.","triggerScenarios":"Calling MetadataKeys.extract(cm, key) where key is not registered in CORE_METADATA and is not an instance of ExtensionKey (MetadataKeys.java:81) — e.g. a custom MetadataKey implementation, or a key from a different/older version not present in CORE_METADATA.","commonSituations":"Tooling or tests enumerating metadata keys with a hand-rolled MetadataKey; version skew where a plugin's key class isn't an ExtensionKey subclass; refactor renamed key classes so they no longer extend ExtensionKey.","solutions":["Ensure the key class extends ExtensionKey so extract reads it from cm.extensions.","If the key should be core metadata, register its resolver in the CORE_METADATA map in MetadataKeys.","Check for version skew: a key defined in a newer/older build may be unrecognized; align versions.","Validate key type before calling extract (see validation code) to fail fast with a clearer message."],"exampleFix":"// before\nMetadataValue<?> v = MetadataKeys.extract(cm, myKey);\n// after\nif (!(myKey instanceof ExtensionKey) && !MetadataKeys.isCoreKey(myKey)) // add isCoreKey or instanceof check first\n    throw new IllegalArgumentException(\"Key must be core or an ExtensionKey: \" + myKey);\nMetadataValue<?> v = MetadataKeys.extract(cm, myKey);","handlingStrategy":"type-guard","validationCode":"if (!(key instanceof ExtensionKey) && !MetadataKeys.CORE_METADATA.containsKey(key))\n    throw new IllegalArgumentException(\"Key must be a core MetadataKey or an ExtensionKey: \" + key);","typeGuard":"boolean isResolvableKey(MetadataKey k) { return k instanceof ExtensionKey || MetadataKeys.CORE_METADATA.containsKey(k); }","tryCatchPattern":"try { v = MetadataKeys.extract(cm, key); } catch (IllegalArgumentException e) { logger.warn(\"Unresolvable metadata key {}\", key, e); v = null; }","preventionTips":["Make all custom keys extend ExtensionKey","Register new core keys in CORE_METADATA","Keep key definitions in sync across versions in a cluster"],"tags":["tcm","metadata-key","illegal-argument","validation"],"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"}