{"record":{"id":"864b77cd33383b06","repo":"pinpoint-apm/pinpoint","slug":"duplicate-columnfamily-name","errorCode":null,"errorMessage":"Duplicate ColumnFamily name : ","messagePattern":"Duplicate ColumnFamily name : ","errorType":"validation","errorClass":"InvalidHbaseSchemaException","httpStatus":null,"severity":"error","filePath":"hbase/hbase-schema/src/main/java/com/navercorp/pinpoint/hbase/schema/reader/xml/mapper/TableChangeMapper.java","lineNumber":78,"sourceCode":"        }\n\n        TableConfiguration tableConfiguration = tableConfigurationMapper.mapConfiguration(createTable.getConfiguration());\n        List<ColumnFamilyChange> columnFamilyChanges = mapColumnFamilies(createTable.getCreateColumnFamily());\n        CreateTableChange.SplitOption splitOption = splitOptionMapper.mapSplitOption(createTable.getSplit());\n\n        return new CreateTableChange(tableName, tableConfiguration, columnFamilyChanges, splitOption);\n    }\n\n    private List<ColumnFamilyChange> mapColumnFamilies(List<Table.CreateColumnFamily> createColumnFamilies) {\n        if (CollectionUtils.isEmpty(createColumnFamilies)) {\n            return Collections.emptyList();\n        }\n        Map<String, ColumnFamilyChange> createColumnFamilyChanges = new LinkedHashMap<>();\n        for (Table.CreateColumnFamily createColumnFamily : createColumnFamilies) {\n            String columnFamilyName = createColumnFamily.getName();\n            ColumnFamilyChange columnFamilyChange = columnFamilyChangeMapper.mapCreate(createColumnFamily);\n            if (createColumnFamilyChanges.put(columnFamilyName, columnFamilyChange) != null) {\n                throw new InvalidHbaseSchemaException(\"Duplicate ColumnFamily name : \" + columnFamilyName);\n            }\n        }\n        return new ArrayList<>(createColumnFamilyChanges.values());\n    }\n}\n\n","sourceCodeStart":60,"sourceCodeEnd":85,"githubUrl":"https://github.com/pinpoint-apm/pinpoint/blob/744c3d3075e595656abb1ae331ad2c0e4c9eb996/hbase/hbase-schema/src/main/java/com/navercorp/pinpoint/hbase/schema/reader/xml/mapper/TableChangeMapper.java#L60-L85","documentation":"Thrown by TableChangeMapper.mapColumnFamilies when two <createColumnFamily> elements within the same table change use the same name. HBase column family names must be unique per table, and the mapper detects this while assembling ColumnFamilyChange objects into a LinkedHashMap keyed by name.","triggerScenarios":"A <modifyTable> or <createTable> change lists two <createColumnFamily name=\"X\"/> entries with an identical name.","commonSituations":"Copy-pasting a columnFamily block to add a similar family and forgetting to rename it; merging schema branches that both added the same family; generating XML from metadata that contains duplicate families.","solutions":["Rename one of the duplicated <createColumnFamily> elements so names are unique within the table change.","If the intent was to modify an existing family, that family should appear only once — remove the redundant entry.","Add CI validation that maps all schema XML to surface duplicates before release."],"exampleFix":"<!-- before -->\n<createColumnFamily name=\"AgentInfo\"/>\n<createColumnFamily name=\"AgentInfo\"/>\n<!-- after -->\n<createColumnFamily name=\"AgentInfo\"/>\n<createColumnFamily name=\"AgentEvent\"/>","handlingStrategy":"validation","validationCode":"Set<String> families = new HashSet<>();\nfor (Table.CreateColumnFamily cf : tableChange.getCreateColumnFamily()) {\n    if (!families.add(cf.getName())) {\n        throw new IllegalArgumentException(\"Duplicate column family: \" + cf.getName());\n    }\n}","typeGuard":null,"tryCatchPattern":"try { mapper.mapColumnFamilies(createColumnFamilies); } catch (InvalidHbaseSchemaException e) { log.error(\"Fix duplicate column family: {}\", e.getMessage()); }","preventionTips":["One createColumnFamily block per family name per table","Review merges for duplicated XML blocks","Add schema-XML parsing tests to CI"],"tags":["schema-validation","duplicate-key","hbase"],"backgroundTag":"schema-validation-failed","analyzedSha":"744c3d3075e595656abb1ae331ad2c0e4c9eb996","analyzedAt":"2026-09-07T18:48:45.289Z","contentChangedAt":"2026-09-07T18:48:45.289Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}