{"record":{"id":"3a904995bc8c30f1","repo":"apache/hadoop","slug":"already-exists-3a9049","errorCode":null,"errorMessage":"{} already exists!","messagePattern":"(.+?) already exists!","errorType":"exception","errorClass":"MetricsException","httpStatus":null,"severity":"error","filePath":"hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/metrics2/lib/DefaultMetricsSystem.java","lineNumber":131,"sourceCode":"  @InterfaceAudience.Private\n  public static void removeMBeanName(ObjectName name) {\n    INSTANCE.removeObjectName(name.toString());\n  }\n\n  @InterfaceAudience.Private\n  public static void removeSourceName(String name) {\n    INSTANCE.removeSource(name);\n  }\n\n  @InterfaceAudience.Private\n  public static String sourceName(String name, boolean dupOK) {\n    return INSTANCE.newSourceName(name, dupOK);\n  }\n\n  synchronized ObjectName newObjectName(String name) {\n    try {\n      if (mBeanNames.map.containsKey(name) && !miniClusterMode) {\n        throw new MetricsException(name +\" already exists!\");\n      }\n      return new ObjectName(mBeanNames.uniqueName(name));\n    } catch (Exception e) {\n      throw new MetricsException(e);\n    }\n  }\n\n  synchronized void removeObjectName(String name) {\n    mBeanNames.map.remove(name);\n  }\n\n  synchronized void removeSource(String name) {\n    sourceNames.map.remove(name);\n  }\n\n  synchronized String newSourceName(String name, boolean dupOK) {\n    if (sourceNames.map.containsKey(name)) {\n      if (dupOK) {","sourceCodeStart":113,"sourceCodeEnd":149,"githubUrl":"https://github.com/apache/hadoop/blob/2add9630210752f88ceb1bb74eb65e37bf41da8e/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/metrics2/lib/DefaultMetricsSystem.java#L113-L149","documentation":"DefaultMetricsSystem keeps a JVM-wide map of registered JMX object names. newObjectName(name) throws MetricsException('<name> already exists!') when the name is already mapped and miniClusterMode is off; when duplicates are tolerated, uniqueName() appends a numeric suffix instead.","triggerScenarios":"Registering a metrics source whose MBean name collides with one already registered in the same JVM: MetricsSystem.register(...) twice with the same name, two components choosing the same source name, or re-registering after re-init without unregistering first.","commonSituations":"Unit tests and mini-clusters that repeatedly initialize metrics; multiple instances of a component in one process; redeploy code that rebuilds the metrics system without shutting down the old one.","solutions":["Unregister the old source before re-registering: metricsSystem.unregisterSource(name) / DefaultMetricsSystem.removeSourceName(name) plus removeObjectName(name)","Make the source name unique per instance (append an instance id)","In test JVMs, call DefaultMetricsSystem.setMiniClusterMode(true) so duplicates get unique suffixed names"],"exampleFix":"// before\nmetricsSystem.register(\"MySource\", \"My source\", myImpl);  // 2nd registration throws\n\n// after\nmetricsSystem.unregisterSource(\"MySource\");  // or DefaultMetricsSystem.removeSourceName(\"MySource\")\nmetricsSystem.register(\"MySource\", \"My source\", myImpl);","handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"try {\n  metricsSystem.register(name, desc, source);\n} catch (MetricsException e) {\n  if (e.getMessage().contains(\"already exists\")) {\n    metricsSystem.unregisterSource(name);  // stale registration from a previous lifecycle\n    metricsSystem.register(name, desc, source);\n  } else throw e;\n}","preventionTips":["Always unregister sources on component shutdown (unregisterSource / removeSourceName)","Include an instance id in source names when multiple instances run in one JVM","Enable DefaultMetricsSystem.setMiniClusterMode(true) in test JVMs to allow suffixed unique names"],"tags":["metrics2","hadoop","jmx","duplicate-registration","lifecycle"],"backgroundTag":"duplicate-mbean-registration","analyzedSha":"2add9630210752f88ceb1bb74eb65e37bf41da8e","analyzedAt":"2026-08-22T19:55:07.957Z","schemaVersion":2},"datasetVersion":"2026-08-23T01:17:44.959Z"}