{"record":{"id":"043b45b5821fdb11","repo":"apache/hadoop","slug":"key-name-does-not-exist-in-this","errorCode":null,"errorMessage":"Key ${name} does not exist in ${this}","messagePattern":"Key (.+?) does not exist in (.+?)","errorType":"exception","errorClass":"IOException","httpStatus":null,"severity":"error","filePath":"hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/crypto/key/JavaKeyStoreProvider.java","lineNumber":468,"sourceCode":"      if (options.getBitLength() != 8 * material.length) {\n        throw new IOException(\"Wrong key length. Required \" +\n            options.getBitLength() + \", but got \" + (8 * material.length));\n      }\n      cache.put(name, meta);\n      String versionName = buildVersionName(name, 0);\n      return innerSetKeyVersion(name, versionName, material, meta.getCipher());\n    } finally {\n      writeLock.unlock();\n    }\n  }\n\n  @Override\n  public void deleteKey(String name) throws IOException {\n    writeLock.lock();\n    try {\n      Metadata meta = getMetadata(name);\n      if (meta == null) {\n        throw new IOException(\"Key \" + name + \" does not exist in \" + this);\n      }\n      for(int v=0; v < meta.getVersions(); ++v) {\n        String versionName = buildVersionName(name, v);\n        try {\n          if (keyStore.containsAlias(versionName)) {\n            keyStore.deleteEntry(versionName);\n          }\n        } catch (KeyStoreException e) {\n          throw new IOException(\"Problem removing \" + versionName + \" from \" +\n              this, e);\n        }\n      }\n      try {\n        if (keyStore.containsAlias(name)) {\n          keyStore.deleteEntry(name);\n        }\n      } catch (KeyStoreException e) {\n        throw new IOException(\"Problem removing \" + name + \" from \" + this, e);","sourceCodeStart":450,"sourceCodeEnd":486,"githubUrl":"https://github.com/apache/hadoop/blob/2add9630210752f88ceb1bb74eb65e37bf41da8e/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/crypto/key/JavaKeyStoreProvider.java#L450-L486","documentation":"JavaKeyStoreProvider.deleteKey resolves Metadata for the key name first; if getMetadata(name) returns null, the name exists neither in the metadata cache nor as an alias in the keystore, and deletion aborts with this IOException instead of silently succeeding. The provider treats a missing key as an error so callers notice wrong names or wrong keystores.","triggerScenarios":"Calling deleteKey on a never-created name; deleting a key that was already deleted; a typo in the key name; calling on a provider instance built from a different jceks:// URI than the one that stores the key.","commonSituations":"Cleanup scripts run twice; concurrent admins deleting the same key; hadoop.security.key.provider.path pointing at the wrong keystore file so every lookup misses.","solutions":["Check provider.getMetadata(name) != null (or list provider.getKeys()) before deleting","Make deletion idempotent: catch the IOException and treat 'does not exist' as success","Verify the key actually lives in that provider with `hadoop key list -provider <uri>`"],"exampleFix":"// before\nprovider.deleteKey(name);\n\n// after\nif (provider.getMetadata(name) != null) {\n  provider.deleteKey(name);\n}","handlingStrategy":"validation","validationCode":"if (provider.getMetadata(name) != null) {\n  provider.deleteKey(name);\n} // else: nothing to delete, treat as success","typeGuard":null,"tryCatchPattern":"try { provider.deleteKey(name); } catch (IOException e) { if (String.valueOf(e.getMessage()).contains(\"does not exist\")) { return; } throw e; }","preventionTips":["Check getMetadata/getKeys before delete","Make deletion scripts idempotent","Confirm the provider URI before destructive ops with hadoop key list"],"tags":["java","hadoop","key-provider","key-management","not-found"],"backgroundTag":"key-not-found","analyzedSha":"2add9630210752f88ceb1bb74eb65e37bf41da8e","analyzedAt":"2026-08-22T19:55:07.957Z","schemaVersion":2},"datasetVersion":"2026-08-23T01:17:44.959Z"}