apache/hadoop · error · IOException

Can't get alias " + alias + " from " + getPathAsString()

Error message

Can't get alias " + alias + " from " + getPathAsString()

What it means

Thrown by getAliases() when KeyStore.aliases() itself fails with KeyStoreException, i.e. the KeyStore object behind the provider is not in a usable initialized state. Hadoop wraps it with the alias last iterated (often null) and the provider path. It indicates the provider's keystore handle is broken, not that any single alias is bad.

Source

Thrown at hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/security/alias/AbstractJavaKeyStoreProvider.java:219

    String pass;
    pass = new String(bytes, StandardCharsets.UTF_8);
    return pass.toCharArray();
  }

  @Override
  public List<String> getAliases() throws IOException {
    readLock.lock();
    try {
      ArrayList<String> list = new ArrayList<String>();
      String alias = null;
      try {
        Enumeration<String> e = keyStore.aliases();
        while (e.hasMoreElements()) {
          alias = e.nextElement();
          list.add(alias);
        }
      } catch (KeyStoreException e) {
        throw new IOException("Can't get alias " + alias + " from "
            + getPathAsString(), e);
      }
      return list;
    } finally {
      readLock.unlock();
    }
  }

  @Override
  public CredentialEntry createCredentialEntry(String alias, char[] credential)
      throws IOException {
    writeLock.lock();
    try {
      if (keyStore.containsAlias(alias)) {
        throw new IOException("Credential " + alias + " already exists in "
            + this);
      }
      return innerSetCredential(alias, credential);

View on GitHub (pinned to 2add963021)

Solutions

  1. Validate the file independently: keytool -list -keystore <file> -storetype jceks
  2. If keytool also fails, restore the keystore from backup or recreate it and re-add credentials
  3. Ensure all readers/writers run the same JDK line so the KeyStore implementation is consistent
  4. Delete zero-length or suspect files: a 0-byte store is treated as non-existent and should be recreated via a create, not listed
Defensive patterns

Strategy: try-catch

Validate before calling

// Sanity-check the store loads under this JVM before calling provider APIs
KeyStore probe = KeyStore.getInstance("jceks");
try (InputStream in = Files.newInputStream(keystorePath)) {
  probe.load(in, storePassword);
}   // any failure here predicts getAliases()/read failures

Try / catch

try {
  List<String> aliases = provider.getAliases();
} catch (IOException ex) {
  if (ex.getCause() instanceof java.security.KeyStoreException) {
    // keystore handle unusable: re-instantiate the provider from a fresh Configuration;
    // if that fails, the file itself is bad -> restore/recreate
  } else { throw ex; }
}

Prevention

When it happens

Trigger: The keystore loaded only partially during construction (an earlier error was swallowed or the load path was skipped); provider built against a keystore type the JVM could not initialize; using the provider after the underlying store was replaced/corrupted concurrently.

Common situations: Empty or truncated .jceks file that passed keystoreExists(); JVM/provider mismatches after a Java upgrade; disk corruption on the keystore file; interleaved flush from another process invalidating the handle.

Related errors


AI-assisted analysis of apache/hadoop@2add963021 (2026-08-22). Data as JSON: /api/errors/4d68ab88d3c3a0a1. Report an issue: GitHub.