{"record":{"id":"eb7aff23afbf96d4","repo":"apache/hadoop","slug":"signer-class-s-not-found-for-signer-s","errorCode":null,"errorMessage":"Signer class [%s] not found for signer [%s]","messagePattern":"Signer class \\[(.+?)\\] not found for signer \\[(.+?)\\]","errorType":"exception","errorClass":"RuntimeException","httpStatus":null,"severity":"error","filePath":"hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/auth/SignerManager.java","lineNumber":129,"sourceCode":"\n  /**\n   * Make sure the signer class is registered once with the AWS SDK.\n   * @param signerName signer name\n   * @param signerClassName classname\n   * @param conf source configuration\n   * @throws RuntimeException if the class is not found\n   */\n  private static void maybeRegisterSigner(String signerName,\n      String signerClassName, Configuration conf) {\n\n    if (!SignerFactory.isSignerRegistered(signerName)) {\n      // Signer is not registered with the AWS SDK.\n      // Load the class and register the signer.\n      Class<? extends Signer> clazz;\n      try {\n        clazz = (Class<? extends Signer>) conf.getClassByName(signerClassName);\n      } catch (ClassNotFoundException cnfe) {\n        throw new RuntimeException(String\n            .format(\"Signer class [%s] not found for signer [%s]\",\n                signerClassName, signerName), cnfe);\n      }\n      LOG.debug(\"Registering Custom Signer - [{}->{}]\", signerName,\n          clazz.getName());\n      synchronized (SignerManager.class) {\n        SignerFactory.registerSigner(signerName, clazz);\n      }\n    }\n  }\n\n  @Override public void close() throws IOException {\n    LOG.debug(\"Unregistering fs from {} initializers\", initializers.size());\n    for (AwsSignerInitializer initializer : initializers) {\n      initializer\n          .unregisterStore(bucketName, ownerConf, delegationTokenProvider,\n              ownerUgi);\n    }","sourceCodeStart":111,"sourceCodeEnd":147,"githubUrl":"https://github.com/apache/hadoop/blob/2add9630210752f88ceb1bb74eb65e37bf41da8e/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/auth/SignerManager.java#L111-L147","documentation":"SignerManager.maybeRegisterSigner loads the signer class of a custom signer entry (second segment) via conf.getClassByName. If it is not found, a RuntimeException wrapping the ClassNotFoundException is thrown, naming the missing signer class and its configured signer name. This happens once per name, at the first S3A filesystem initialization that references the custom signer.","triggerScenarios":"fs.s3a.custom.signers=Name:com.example.MissingSigner where that FQCN is misspelled, relocated by shading, or its jar is missing from the client classpath. Only thrown when the name is not already registered with the AWS SDK SignerFactory.","commonSituations":"Deploying config ahead of the jar (config references a class in a jar not yet rolled out); different classpaths on edge node vs cluster executors; jar present at submit time but not in the YARN container classpath.","solutions":["Fix the signer class FQCN in the fs.s3a.custom.signers entry","Distribute the jar containing the signer to all nodes/clients that mount s3a (cluster share dir, Spark jars, MR libjars)","Confirm the class actually extends the AWS SDK Signer type the cast expects, otherwise fix the type first"],"exampleFix":"<!-- before -->\n<property><name>fs.s3a.custom.signers</name>\n  <value>MySigner:com.example.mySigner</value></property>\n\n<!-- after -->\n<property><name>fs.s3a.custom.signers</name>\n  <value>MySigner:com.example.MySigner</value></property>","handlingStrategy":"validation","validationCode":"for (String entry : conf.getTrimmedStrings(\"fs.s3a.custom.signers\")) {\n  String[] p = entry.split(\":\");\n  if (p.length >= 2) {\n    Class<?> c = conf.getClassByName(p[1]); // clear CNFE here, before FS init\n    if (!Signer.class.isAssignableFrom(c)) {\n      throw new IllegalArgumentException(p[1] + \" is not a Signer implementation\");\n    }\n  }\n}","typeGuard":null,"tryCatchPattern":"try {\n  fs.initialize(uri, conf);\n} catch (RuntimeException e) {\n  if (e.getCause() instanceof ClassNotFoundException\n      && e.getMessage().contains(\"Signer class\")) {\n    throw new ConfigException(\"Missing signer class: \" + e.getCause().getMessage(), e);\n  }\n  throw e;\n}","preventionTips":["Resolve fs.s3a.custom.signers classes eagerly at job submission","Ensure the signer jar is on every node's classpath, not just the submit host","Re-check custom signer config after Hadoop/AWS SDK upgrades (class moves)"],"tags":["aws","s3a","signer","classpath","class-not-found"],"backgroundTag":"class-not-found","analyzedSha":"2add9630210752f88ceb1bb74eb65e37bf41da8e","analyzedAt":"2026-08-22T19:55:07.957Z","schemaVersion":2},"datasetVersion":"2026-08-22T20:17:22.307Z"}