{"record":{"id":"06f5ff129533d655","repo":"apache/cassandra","slug":"ignoring-codec-because-it-collides-with-previou-06f5ff","errorCode":null,"errorMessage":"Ignoring codec {} because it collides with previously generated codec {}","messagePattern":"Ignoring codec (.+?) because it collides with previously generated codec (.+?)","errorType":"console","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"src/java/org/apache/cassandra/cql3/functions/types/CodecRegistry.java","lineNumber":482,"sourceCode":"                return this;\n            }\n        }\n        for (TypeCodec<?> oldCodec : codecs)\n        {\n            if (oldCodec.accepts(newCodec.getCqlType()) && oldCodec.accepts(newCodec.getJavaType()))\n            {\n                logger.warn(\n                \"Ignoring codec {} because it collides with previously registered codec {}\",\n                newCodec,\n                oldCodec);\n                return this;\n            }\n        }\n        CacheKey key = new CacheKey(newCodec.getCqlType(), newCodec.getJavaType());\n        TypeCodec<?> existing = cache.getIfPresent(key);\n        if (existing != null)\n        {\n            logger.warn(\n            \"Ignoring codec {} because it collides with previously generated codec {}\",\n            newCodec,\n            existing);\n            return this;\n        }\n        this.codecs.add(newCodec);\n        return this;\n    }\n\n    /**\n     * Register the given codecs with this registry.\n     *\n     * @param codecs The codecs to add to the registry.\n     * @return this CodecRegistry (for method chaining).\n     * @see #register(TypeCodec)\n     */\n    public CodecRegistry register(TypeCodec<?>... codecs)\n    {","sourceCodeStart":464,"sourceCodeEnd":500,"githubUrl":"https://github.com/apache/cassandra/blob/88fd0f6a0eaed8943f05ac9e8f947882b8ddc8f1/src/java/org/apache/cassandra/cql3/functions/types/CodecRegistry.java#L464-L500","documentation":"CodecRegistry caches codecs it generates for (CQL type, Java type) keys. When registering a codec whose key matches an entry in that generated-codec cache, the new codec is warned about and ignored in favor of the cached, previously generated one.","triggerScenarios":"register(newCodec) where cache.getIfPresent(new CacheKey(cqlType, javaType)) is non-null — i.e. the registry already auto-generated a codec for that exact pair (e.g. via codecFor lookups for lists/sets/maps/UDTs) before the custom codec was registered.","commonSituations":"Application performs queries (triggering codec generation) before finishing codec registration in startup code; lazy session initialization ordering issues.","solutions":["Register all custom codecs immediately after cluster/session creation, before issuing any queries that cause codec generation","Create a new session/registry if a cached generated codec must be overridden","Use explicit codec arguments at bind/get sites instead of relying on registry resolution"],"exampleFix":"// before\nsession.execute(query);           // triggers generated codec caching\ncluster.getConfiguration().getCodecRegistry().register(myCustomCodec);\n// after\ncluster.getConfiguration().getCodecRegistry().register(myCustomCodec);\nsession.execute(query);","handlingStrategy":"fallback","validationCode":"// Register codecs before any session usage\nfunction bootstrap(cluster) {\n  cluster.getConfiguration().getCodecRegistry().registerAll(customCodecs);\n  const session = cluster.connect(); // queries only after registration\n  return session;\n}","typeGuard":null,"tryCatchPattern":"try {\n  registry.register(myCodec);\n} catch (IllegalStateException e) {\n  // if registry API throws on collision in newer versions, create a fresh registry/session\n  rebuildSessionWithFreshRegistry();\n}","preventionTips":["Complete codec registration before issuing queries that trigger codec generation","Prefer explicit codec arguments at bind/get sites for critical mappings","Treat codec registration as part of cluster bootstrap ordering"],"tags":["codec","driver","cache","registration-order"],"backgroundTag":"conflicting-config-options","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"}