{"record":{"id":"a777eefe0ad96ec3","repo":"apache/hadoop","slug":"key-name-already-exists-in-this-a777ee","errorCode":null,"errorMessage":"Key ${name} already exists in ${this}","messagePattern":"Key (.+?) already exists in (.+?)","errorType":"exception","errorClass":"IOException","httpStatus":null,"severity":"error","filePath":"hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/crypto/key/UserProvider.java","lineNumber":87,"sourceCode":"  public synchronized Metadata getMetadata(String name) throws IOException {\n    if (cache.containsKey(name)) {\n      return cache.get(name);\n    }\n    byte[] serialized = credentials.getSecretKey(new Text(name));\n    if (serialized == null) {\n      return null;\n    }\n    Metadata result = new Metadata(serialized);\n    cache.put(name, result);\n    return result;\n  }\n\n  @Override\n  public synchronized KeyVersion createKey(String name, byte[] material,\n                               Options options) throws IOException {\n    Text nameT = new Text(name);\n    if (credentials.getSecretKey(nameT) != null) {\n      throw new IOException(\"Key \" + name + \" already exists in \" + this);\n    }\n    if (options.getBitLength() != 8 * material.length) {\n      throw new IOException(\"Wrong key length. Required \" +\n          options.getBitLength() + \", but got \" + (8 * material.length));\n    }\n    Metadata meta = new Metadata(options.getCipher(), options.getBitLength(),\n        options.getDescription(), options.getAttributes(), new Date(), 1);\n    cache.put(name, meta);\n    String versionName = buildVersionName(name, 0);\n    credentials.addSecretKey(nameT, meta.serialize());\n    credentials.addSecretKey(new Text(versionName), material);\n    return new KeyVersion(name, versionName, material);\n  }\n\n  @Override\n  public synchronized void deleteKey(String name) throws IOException {\n    Metadata meta = getMetadata(name);\n    if (meta == null) {","sourceCodeStart":69,"sourceCodeEnd":105,"githubUrl":"https://github.com/apache/hadoop/blob/2add9630210752f88ceb1bb74eb65e37bf41da8e/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/crypto/key/UserProvider.java#L69-L105","documentation":"UserProvider stores keys in the current user's UGI credentials (an in-memory credential store). createKey refuses when credentials.getSecretKey(name) already returns data, because each key name maps to one entry in that credential store. This mirrors the duplicate check JavaKeyStoreProvider performs against its keystore.","triggerScenarios":"Calling createKey twice with the same name within one UGI session; retrying a request after a partial failure that already added the credential; test suites sharing a UserGroupInformation across cases.","commonSituations":"Retried job submissions; long-lived daemons that create keys on every request; integration tests that do not reset credentials between runs.","solutions":["When the key already exists and you want fresh material, call rollNewVersion(name) instead","Call deleteKey(name) first if you truly intend to replace the key","Guard with getMetadata(name) == null before createKey"],"exampleFix":"// before\nprovider.createKey(name, material, options); // second time -> throws\n\n// after\nif (provider.getMetadata(name) != null) {\n  provider.rollNewVersion(name, material);\n} else {\n  provider.createKey(name, material, options);\n}","handlingStrategy":"validation","validationCode":"if (provider.getMetadata(name) == null) {\n  provider.createKey(name, material, options);\n} else {\n  provider.rollNewVersion(name, material);\n}","typeGuard":null,"tryCatchPattern":"try { provider.createKey(name, material, options); } catch (IOException e) { if (String.valueOf(e.getMessage()).contains(\"already exists\")) { provider.rollNewVersion(name, material); } else { throw e; } }","preventionTips":["Check getMetadata(name) before createKey in retry-prone code paths","Use rollNewVersion for rotation semantics","Reset UGI credentials between test cases"],"tags":["java","hadoop","key-provider","duplicate","credentials","user-provider"],"backgroundTag":"duplicate-key","analyzedSha":"2add9630210752f88ceb1bb74eb65e37bf41da8e","analyzedAt":"2026-08-22T19:55:07.957Z","schemaVersion":2},"datasetVersion":"2026-08-23T01:17:44.959Z"}